本人最近做了微信支付開發,是第一次接觸.其中走了很多彎路,遇到的問題也很多.為了讓和我一樣的新人不再遇到類似的問題,我把我的開發步驟和問題寫出來,以供參考.
開發時間是2016/8/10,所以微信支付的版本也是對應此時的版本.
一.前期准備:
首先你們公司開通微信支付功能后,會收到一份郵件,里面有賬戶相關信息,一般有:微信支付商戶號,商戶平台登錄帳號,商戶平台登錄密碼,申請對應的公眾號,公眾號APPID。
1.下載demo:用上面信息登陸“微信商戶平台”,>>>(右上角開發文檔)>>>公眾號支付>>>sdk下載>>>選php
2.下載證書:賬戶中心>>>api安全
將下載的證書中的所有文件解壓到demo的cert文件夾中(demo原先自帶的要刪掉),然后修改demo中lib/WxPay.Config.php中的以下配置
const APPID = '郵件中有,即`公眾號APPID`';
const MCHID = '郵件中有,即`微信支付商戶號`';
const KEY = 'wxpay.config.php中注釋有相關鏈接';
const APPSECRET = '公眾平台開發者中心設置,同樣注釋中有鏈接';
3.配置好后去微信公眾平台,里面有微信支付功能如下圖.在開發配置中設置支付目錄和測試目錄.這里主要是配置測試目錄,支付目錄可以先不管(我的域名是www.test.com),然后將自己的微信號加入測試白名單.
4.再去微信公眾平台>>>開發>>>接口權限>>>網頁服務的第一項`網頁賬號`,修改它的值為你自己的域名(僅僅是域名).如圖:
二.修改demo中錯誤代碼和不必要代碼(僅僅針對當前的版本)
- 修改文件WxPay.Api.php
將curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
改為:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//嚴格校驗2
2.(針對jsapi支付)如果訪問jsapi.php時你要用get方式傳遞參數,那么你要去修改WxPay.JsapiPay.php中的
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
改為:
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
或者在寫鏈接時寫兩個??傳參,例如:http://www.test.com/demo/example/jsapi.php??id=xxx&..
3.刪去wxpay.notify.php中的ReplyNotify函數中$this->GetReturn_code(‘參數’) == "SUCCESS"里面的’參數’.
4.在native.php中添加$notify=new NativePay();如圖:
5.注釋掉native.php中模式一相關的代碼.
三.開始開發,按大概流程講述.
1.首先點擊支付后,會到native.php文件中去,他會設置一大堆參數,然后處理完畢能得到一個url鏈接,如圖:
將里面的setNotify_url設置為你的native_notify.php文件所在的位置.
其中的setOut_trade_no和setTotal_fee和setProduct_id這三個參數是你可以隨便填寫的(其他參數默認就可以).在支付成功后微信服務器會將這兩個參數的值返回給你.我是直接將商品訂單號碼放到setOut_trade_no中,將商品的id放到setProduct_id中傳遞過去.
以上都設置好后再請求native.php時,應該可以得到一個二維碼了.
2.掃碼支付完成后,微信服務器會自動請求你的native_notify.php文件.請求進入后直接通過最后一句$notify->Handle(true);跳到了WxPay.Notify.php中,然后還調用了很多其他函數,
后面的邏輯和jsapi支付一樣的(我先做的jsapi支付),這里就不提了.
四.支付后跳轉
支付完成后,手機提示支付成功,並會顯示支付信息,但是pc端的二維碼頁面卻不會跳轉.這需要我們自己在native.php頁面設置一個定時器,我直接設置為跳轉到百度.你設置為自己想要跳轉到的頁面路徑即可.大致代碼如圖:
其中的$order_id是get傳過來的訂單號.通過查詢訂單號對應商品的支付狀態判斷是否成功,然后跳轉.
至此,一個掃碼支付流程大致走完了.