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:微信支付到此结束