PHP 微信APP支付 整合 thinkphp3.2.3

 Thinkphp   高蒙   阅读(1881)   评论(3)   2017-11-02 22:48:53    APP支付 微信 微信支付 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支付的整个服务器端的执行代码。





相关文章



我要评论


站长昵称:(*)

输入内容:


评论列表


高蒙

男,程序猿一枚

 

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


关于我

  http://www.shuchengxian.com

高蒙个人博客是以PHP技术为主的程序员个人博客。博客主要发布php开发中遇到的问题以及解决办法,同时个人博客也分享网站模板素材,jquery插件等方面素材。


站点声明:相关侵权、举报、投诉及建议等,请发E-mail:936594075#qq.com(#替换成@)。

Copyright © 2018, www.shuchengxian.com, All rights reserved. 个人博客皖公网安备 34152302000022号 皖ICP备15015490号

关键词:个人博客,PHP博客,PHP博客程序,高蒙博客,高蒙个人博客,php程序员博客,程序员个人博客