首页 » PHP笔记 » PHP 微信APP支付 整合 thinkphp3.2.3

PHP 微信APP支付 整合 thinkphp3.2.3

高蒙 2017/11/02 22:48 3.1k浏览 0评论 Thinkphp


php开发APP支付功能中,涉及到微信APP支付功能。为了考虑数据的严密性,加密的过程全部都需要在服务端进行生成。微信APP支付与支付宝的还不太一样。微信APP支付需要二次的加密请求才可以完成整个服务端的任务。

1、首先第一次需要加密请求拿到prepay_id,就是预支付订单号。

2、接着在拿得到的预支付订单号进行加密,生成最终APP端请求的参数。

3、注意的是,微信开发中请求和发送的结构都是xml。

以下代码直接可以复制,简单修改点参数就可以使用。

/*微信签名 by gm 2017-11-02*/
    public function wxsignature(){
        $body  = I('post.body');  // 描述
        $title = I('post.title'); // 标题
        $order = I('post.order'); // 订单号
        $price = I('post.price'); // 价格
        
        $d['appid'] = $this->wxappid;
        $d['mch_id']= $this->wxmch_id;
        $d['nonce_str']= \Org\Util\String::randString(20);
        $d['body']     = $body;
        $d['out_trade_no']= $order;
        $d['total_fee']= $price*100;
        $d['spbill_create_ip']= get_client_ip();
        $d['notify_url']= 'http://www.shuchengxian.com/';
        $d['trade_type']= 'APP';
        // 获取签名
        $d['sign'] = $this->_getwxsign($d);
        // 拼装数据
        $xml = $this->_setxmldata($d);
        // 发送请求
        $res = $this->_sendprePaycurl($xml);
        if($res['return_code'] == 'SUCCESS'){
            // 二次签名
            $t['appid'] = $this->wxappid;
            $t['noncestr'] = \Org\Util\String::randString(20);
            $t['package'] = "Sign=WXPay";
            $t['prepayid'] = $res['prepay_id'];
            $t['partnerid'] = $this->wxmch_id;
            $t['timestamp'] = time();
            $t['sign'] = $this->_getsecondsign($t);
            $this->ajaxReturn(returncode(array($t),'获取成功',200));
        }else{
            $this->ajaxReturn(returncode(array(),'获取失败',500));
        }
    }

    //通过curl发送数据给微信接口的函数
    private function _sendprePaycurl($xmlData) {
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $header[] = "Content-type: text/xml";
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
        $data = curl_exec($curl);
        if (curl_errno($curl)) {
            print curl_error($curl);
        }
        curl_close($curl);
        return $this->_xmldataparse($data);
    }

    //xml格式数据解析函数
    private function _xmldataparse($data){
        $msg = array();
        $msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
        return $msg;
    }

    /* 拼装请求的数据xml 生成xml数据格式 by gm 2017-11-2*/
    private function _setxmldata($data) {
        $xml = "<xml>
                    <appid><![CDATA[%s]]></appid>
                    <body><![CDATA[%s]]></body>
                    <mch_id><![CDATA[%s]]></mch_id>
                    <nonce_str><![CDATA[%s]]></nonce_str>
                    <notify_url><![CDATA[%s]]></notify_url>
                    <out_trade_no><![CDATA[%s]]></out_trade_no>
                    <spbill_create_ip><![CDATA[%s]]></spbill_create_ip>
                    <total_fee><![CDATA[%d]]></total_fee>
                    <trade_type><![CDATA[%s]]></trade_type>
                    <sign><![CDATA[%s]]></sign>
                </xml>";
        $data = sprintf($xml, $data['appid'], $data['body'], $data['mch_id'], $data['nonce_str'], $data['notify_url'], $data['out_trade_no'], $data['spbill_create_ip'], $data['total_fee'], $data['trade_type'], $data['sign']);
        return $data;
    }

    /*生成微信签名 by gm 2017-11-02*/
    private function _getwxsign($data){
        ksort($data);
        $str = '';
        foreach ($data as $key => $value) {
            $str .= !$str ? $key . '=' . $value : '&' . $key . '=' . $value;
        }
        $str.='&key='.$this->wxkey;
        $sign = strtoupper(md5($str));
        return $sign;
    }

    /*获取二次签名 by gm 2017-11-02*/
    private function _getsecondsign($data){
        $sign = array(
            "appid"=>$data['appid'],
            "noncestr"=>$data['noncestr'],
            "package"=>$data['package'],
            "prepayid"=>$data['prepayid'],
            "partnerid"=>$data['partnerid'],
            "timestamp"=>$data['timestamp'],
        );
        return $this->_getwxsign($sign);
    }

以上就是PHP微信APP支付的整个服务器端的执行代码。





相关文章

我有话说

站长昵称:(*)

输入内容:

选个头像:

评论列表

    ...

    高蒙

    男, PHP程序猿

    文章

    485

    标签

    42

    热度

    10w+

    南京, 江苏, 中国

    人生要是没有理想, 那跟咸鱼有什么分别。