在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處理自己的業務邏輯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM