thinkphp3.2.3 微信公众号支付

1:下载微信支付SDK(官方下载路径URL:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

2:找到ThinkPHP3.2.3第三方库中路径为:ThinkPHP\Library\Vendor。在此路径下创建文件夹WxJsapiPay(名称可以随意),将下载解压后的文件复制新建文件夹中。

3:在模块中创建控制器 WeixinpayController.class.php 用于处理支付,定义方法wxpay()实现支付功能

    /*
     * 去支付
     * @return int
     * @throws \WxPayException
     */
    public function wxpay(){
        $openid = "用户的openid";
        $money = 1;// 订单总金额,单位为分,详见支付金额
        $orderNum = time();
        Vendor('WxJsapiPay.lib.WxPay#Api');
        Vendor('WxJsapiPay.example.WxPay#Config');
        Vendor('WxJsapiPay.example.WxPay#JsApiPay');
        //②、统一下单
        $tools = new \JsApiPay();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("微信充值");    //这里是支付内容
        $input->SetAttach('test');    //此处可传值,待支付成功后可取这部分的值
        $input->SetOut_trade_no($orderNum);  //订单编号
//        $input->SetTotal_fee($money);  //金额
        $input->SetTotal_fee(1);  //金额
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://ceshi.net/Retailapi/Weixinpay/notify");//回调地址
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openid);

        $config = new \WxPayConfig();
        $order = \WxPayApi::unifiedOrder($config, $input);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        echo $jsApiParameters;
    }

    /*
     *回调地址
     */
    public function notify(){
        //获取返回的xml
        $testxml = file_get_contents("php://input");
        //将xml转化为json格式
        $jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
        //转成数组
        $result = json_decode($jsonxml,true);
        //file_put_contents('test.txt',$jsonxml);   --这里是调试方法根目录中test.txt中可查看数据情况
        if($result){
            //如果成功返回了
            if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
                file_put_contents('test.txt',$result);
                $orderSn = $result['out_trade_no'];
                $transactionId = $result['transaction_id'];
                $orderIni['order_num'] = $orderSn;
                $res = M('account_order')->where($orderIni)->find();
                if($res['status'] == 1){
                       $orderData['transaction_id'] = $transactionId;
                       $orderData['status'] = 2;
                       $orderData['end_time'] = time();
                       M('account_order')->where($orderIni)->save($orderData);
                }
                echo exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
            }
        }
    }

4:此时访问wxpay()方法时会出现一堆报错,报错内容大概是一些xxx类不存在或者xxx方法不存在等信息,因为直接使用Vendor引入下载的SDK文件,入口文件是index.php,因此‘..’路径不对,所以需要修改SDK文件引入路径。如下:

5: example/WxPay.JsApiPay.php文件修改如下:

example/WxPay.Config.php文件修改如下:

6:配置微信支付所需要的参数,在example/WxPay.Config.php进行配置信息

7: html页面渲染如下:此页面是官方提供的代码样式,此处代码写在和控制器WeixinpayController.class.php一个模块中。使用的是ThinkPHP本身前后端编写方式。

<script>

//支付功能
$('.pay_wechat').click(function () {
    $.ajax({
        url: "{:U('Weixinpay/wxpay')}", //请求的url地址
        dataType: "json", //返回格式为json
        async: true, //请求是否异步,默认为异步,这也是ajax重要特性
        data: {
            "txt_uid":"{$txt_uid}",
            "txt_retailId":"{$txt_retailId}",
            "txt_num":1
        }, //参数值
        type: "POST", //请求方式
        success: function (req) {
            console.log(req);
            if(req.code == 1){
                alert(req.info);
            }else{
                function jsApiCall() {
                    var  data = req;
                    // console.log(data);
                    WeixinJSBridge.invoke(
                        'getBrandWCPayRequest',
                        data,
                        function (res) {
                            WeixinJSBridge.log(res.err_msg);
                            //alert(res.err_code+res.err_desc+res.err_msg);
                            if (res.err_msg == "get_brand_wcpay_request:ok") {
                                window.location.reload();
                            }
                        }
                    );
                };

                function callpay() {
                    if (typeof WeixinJSBridge == "undefined") {
                        if (document.addEventListener) {
                            document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                        } else if (document.attachEvent) {
                            document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                            document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                        }
                    } else {
                        jsApiCall();
                    }
                };
                callpay();
            }
        },
        error: function () {
            alert('请求错误');
        }
    });
})

</script>

此时可以进行测试支付操作,可以进行正常唤起支付弹窗进行支付

8:在控制器WeixinpayController.class.php中定义notify()方法用于调用回调:如下

/*
 *回调地址
 */
public function notify(){
    //获取返回的xml
    $testxml = file_get_contents("php://input");
    //将xml转化为json格式
    $jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
    //转成数组
    $result = json_decode($jsonxml,true);
    //file_put_contents('test.txt',$jsonxml);   --这里是调试方法根目录中test.txt中可查看数据情况
    if($result){
        //如果成功返回了
        if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
            file_put_contents('test.txt',$result);
            $orderSn = $result['out_trade_no'];
            $transactionId = $result['transaction_id'];
            $orderIni['order_num'] = $orderSn;
            $res = M('account_order')->where($orderIni)->find();
            if($res['status'] == 1){
                   $orderData['transaction_id'] = $transactionId;
                   $orderData['status'] = 2;
                   $orderData['end_time'] = time();
                   M('account_order')->where($orderIni)->save($orderData);
            }
            echo exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
        }
    }
}

9:微信支付到此结束

猜你喜欢

转载自blog.csdn.net/weixin_38615720/article/details/101286807