zoukankan      html  css  js  c++  java
  • 微信公众号内支付(二)

    底层封装

    <?php
    namespace systemextendwxpay;
    
    use systemcoreCurl;
    use systemcoreApp;
    /**
     * 微信支付
     */
    
    class WxPay {
    
        private $values = array();
    
        // CURL对象
        private $curl;
    
        // xml数据
        private $xml;
    
        // 发送返回结果
        public $result;
    
        // 商户微信支付参数
        private $seller = array();
    
        // 微信支付URL
        private $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    
        public function __construct() {
            $conf = App::config('pay');
            $this->seller['appid'] = $conf['wxpay']['appid'];
            $this->seller['mch_id'] = $conf['wxpay']['mch_id'];
            $this->curl = new Curl();
            $this->curl->url($this->url);
        }
    
        /**
         * 绑定参数
         * @param  string $openid        支付者openID
         * @param  string $attch         附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
         * @param  string $body          商品描述
         * @param  int    $total_fee     订单总金额,单位为分
         * @param  string $out_trade_no  商户系统内部的订单号
         * @param  string $detail        商品详情
         */
        public function bindParam($openid, $attch, $body, $total_fee, $out_trade_no, $detail) {
    
            // 参数赋值
            $this->values['appid'] = $this->seller['appid'];
            $this->values['mch_id'] = $this->seller['mch_id'];
            $this->values['attach'] = $attch;
            $this->values['openid'] = $openid;
            $this->values['body'] = $body;
            $this->values['device_info'] = 'WEB';
            $this->values['openid'] = $openid;
            $this->values['nonce'] = $this->string(8);
            $this->values['openid'] = $openid;
            $this->values['out_trade_no'] = $out_trade_no;
            $this->values['detail'] = $detail;
            $this->values['total_fee'] = $total_fee;
            $this->values['time'] = (string)time();
    
            // 组装XML
            $this->xml = "
            <xml>
                <appid><![CDATA[%s]]></appid>
                <attach><![CDATA[%s]]></attach>
                <body><![CDATA[%s]]></body>
                <mch_id><![CDATA[%s]]></mch_id>
                <device_info><![CDATA[%s]]></device_info>
                <nonce_str><![CDATA[%s]]></nonce_str>
                <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>
                <out_trade_no><![CDATA[%s]]></out_trade_no>
                <spbill_create_ip>14.23.150.211</spbill_create_ip>
                <total_fee><![CDATA[%s]]></total_fee>
                <trade_type>JSAPI</trade_type>
                <detail><![CDATA[%s]]></detail>
                <openid><![CDATA[%s]]></openid>
            </xml>";
    
            $this->xml = sprintf($this->xml, $this->values['appid'], $this->values['attach'], $this->values['body'], $this->values['mch_id'], $this->values['device_info'], $this->values['nonce'], $this->values['out_trade_no'], $this->values['total_fee'], $this->values['detail'], $this->values['openid']);
    
        }
    
        /**
         *  生成随机字符串
         *  @return 返回随机字符串
         */
        private function string($length) {
            $string = "0123456789abcdefghigklmnopqrstuvwxyz0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";
            $textlength = strlen ( $string ) - 1;
            $data = '';
            for($i = 0; $i < $length; $i ++) {
                $data .= $string [mt_rand ( 0, $textlength )];
            }
            return $data;
        }
    
        /**
         *  生成签名
         */
        public function createSign() {
    
            $this->xml = simplexml_load_string($this->xml);
    
            // 数组转换
            $array = array();
            foreach($this->xml as $key => $value) {
                $array[$key]=$value;
            }
    
            // 字典排序
            ksort($array);
    
            // 字符串组装
            $string = '';
            foreach ($array as $key => $value) {
                $string .= $key.'='.$value.'&';
            }
    
            // MD5加密
            $this->values['sign'] = strtoupper(md5($string."key=ASD20150723CMD123CHENSHUORECWORD"));
            $this->xml->addChild("sign", $this->values['sign']);
            $this->xml = $this->xml->asXML();
        }
    
        /**
         * 返回支付参数 h5页面配置参数
         * @return array
         */
        public function output() {
            $this->createSign();
            $data = $this->curl->pay($this->xml);
            $this->result = simplexml_load_string($data);
            $this->values['prepay_id'] = $this->result->prepay_id;
            $string = "appId=".$this->values['appid']."&nonceStr=".$this->values['nonce']."&package=prepay_id=".$this->values['prepay_id']."&signType=MD5&timeStamp=".$this->values['time']."&key=ASD20150723CMD123CHENSHUORECWORD";
            $this->values['signPay'] = strtoupper(md5($string));
            return $this->values;
        }
    
    }
    
    ?>
    
    
  • 相关阅读:
    用SSMS连接Azure Sql Database 与连接本地库的一些操作区别
    python_高级进阶(3)线程
    python_高级进阶(2)进程与并发
    python_高级进阶(1)进程与并发
    python网络(2)_Udp协议
    python网络(2)_Tcp协议
    python网络(1)_认知
    python异常处理
    python面向对象(5)__特殊双下方法
    python面向对象(4)_细分类的组成成员
  • 原文地址:https://www.cnblogs.com/chenshuo/p/5355799.html
Copyright © 2011-2022 走看看