在Thinkphp中微信公众号JsApi支付

由于网站使用的微信Native扫码支付,现在公众号需要接入功能,怎么办呢,看这官方文档,参考着demo进行写吧。直接进入正题

进入公众号(服务号)设置--->功能设置--->网页授权域名配置好需要进行支付的页面,支持配置根目录。这一步是为了获取用户的openid。

 进入微信商户平台(pay.weixin.qq.com)设置JSAPI支付支付目录,设置路径:商户平台-->产品中心-->开发配置。配置好之后便可以开始着手进行开发,当你看到官方文档的业务流程当中的业务流程时序图的时候,我相信你是一脸懵逼,腾讯的什么都好,就开发文档容易让人给看晕,不过已经算方便了。

由于之前写得一个功能,在用户点击进入页面的时候已经获取用户的信息,并存入到session中,因此下面的代码中的openid直接从session获取。

接下来下载官方demo(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1),这里下载php,放到extend目录下,目录结构为

核心代码便是lib文件夹下的类库,example中有官方demo,可以直接进行改写。

文件已经引入,着手实现支付功能,在控制器写index方法

 1 public function index()
 2     {
 3 
 4         if (IS_POST) {
 5         
12             include(ROOT_PATH.'extend/Wxpay/lib/WxPay.Api.php');
13             include(ROOT_PATH.'extend/Wxpay/example/WxPay.JsApiPay.php');
14             // include(ROOT_PATH.'extend/Wxpay/example/WxPay.config.php');
15             include(ROOT_PATH.'extend/Wxpay/example/log.php');
16 
17             try{
18                 $tools = new \JsApiPay();
19                 $openId = session('openid');//这里是之前获取到的openid并存入session,直接从session获取,否则为以下两句
20 
21                 /*$tools = new JsApiPay();
22                 $openId = $tools->GetOpenid();*/
23                 //②、统一下单
24                 $input = new \WxPayUnifiedOrder();
25                 $input->SetBody("在线支付");
26                 $input->SetAttach("在线支付");
27                 $input->SetOut_trade_no($data["orderid"]);
28                 $input->SetTotal_fee($data["pricetotal"]*100);
29                 $input->SetTime_start(date("YmdHis"));
30                 $input->SetTime_expire(date("YmdHis", time() + 600));
31                 $input->SetGoods_tag("test");
32                 $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
33                 //echo $http_type . $_SERVER['HTTP_HOST'];
34                 $input->SetNotify_url($http_type . $_SERVER['HTTP_HOST']."/index.php/Payoff/Wxpay/notifyurl.html");//notify是接收异步通知的页面,可以进行业务逻辑处理
35                 $input->SetTrade_type("JSAPI");
36                 $input->SetOpenid($openId);
37                 $config = new \WxPayConfig();
38                 $order = \WxPayApi::unifiedOrder($config, $input);
39                 $jsApiParameters = $tools->GetJsApiParameters($order);
40 
41                 //获取共享收货地址js函数参数
42                 $editAddress = $tools->GetEditAddressParameters();
43             } catch(Exception $e) {
44                 Log::ERROR(json_encode($e));
45             }
46             $this->assign('data', $data);
47             $this->assign('jsApi', $jsApiParameters);
48             $this->display();
49         }
50         else
51         {
52             E("Access Denied");
53         }
54 
55 
56     }

在视图文件中根据自己需要,下面随便写的demo

<form id="thisform" action="#"  method="post">
                            订单号:{$data['orderid']}<input type="hidden"  name="orderid" class="form-control" id="orderid" value="{$orderid}"><br><br>
                            金额:{$data['pricetotal']} 元<input type="hidden" name="money" class="form-control" id="goodprice" value="50"><br><br>
                            <div align="center">
                                <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
                            </div>
                        </form>
                        <script type="text/javascript">
                            //调用微信JS api 支付
                            function jsApiCall()
                            {

                                WeixinJSBridge.invoke(
                                    'getBrandWCPayRequest',
                                    {$jsApi},
                                    function(res){
                                        WeixinJSBridge.log(res.err_msg);
                                        alert(res.err_code+res.err_desc+res.err_msg);
                                    }
                                );
                            }

                            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();
                                }
                            }
                        </script>

这里直接用的是官方demo的JS,没有修改,可以根据获取的支付结果做相应的业务逻辑处理。至此便成功调起手机微信端支付,可以根据demo处理自己的业务逻辑。

猜你喜欢

转载自www.cnblogs.com/dlmg/p/11419751.html