由於網站使用的微信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處理自己的業務邏輯。