本人最近做了微信支付開發,是第一次接觸.其中走了很多彎路,遇到的問題也很多.為了讓和我一樣的新人不再遇到類似的問題,我把我的開發步驟和問題寫出來,以供參考.
開發時間是2016/8/2,所以微信支付的版本也是對應此時的版本.
一.前期准備:
首先你們公司開通微信支付功能後,會收到一份郵件,裡面有賬戶相關信息,一般有:微信支付商戶號,商戶平台登錄帳號,商戶平台登錄密碼,申請對應的公眾號,公眾號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代碼修改(僅僅針對當前的版本):
1. 修改文件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.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"裡面的’參數’.
三.開始開發,按大概流程講述:
1.支付:首先點擊支付後,會到jsapi.php文件中去,獲取openid,這步我沒管,也沒出錯;
然後是統一下單,他會設置一大堆參數,如圖:
將裡面的setNotify_url設置為你的notify.php文件所在的位置.
其中的setOut_trade_no和setTotal_fee這兩個參數是你可以隨便填寫的(其他參數默認可以).在支付成功後微信服務器會將這兩個參數的值返回給你.我是直接將商品訂單號碼放到setOut_trade_no中傳遞過去.在這一步,我遇到的問題是,get過來的字符串參數總是放不到setOut_trade_no中,最後我發現傳過來的訂單字符串被莫名奇妙的加上了單引號.於是我接收到字符串後先用trim函數處理,然後就能放入了.
此時點擊支付,應該可以去支付了.(支付的結果在商戶平台中查看)
2.支付成功後的返回:支付完成後,微信服務器會自動請求你的notify.php文件.但是請求進入後直接通過最後一句$notify->Handle(false);跳到了WxPay.notify.php中,然後還調用了很多其他函數,整個過程我只處理了兩個函數.
①WxPay.api.php中的notify函數,如圖:
這裡面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'];就是支付成功後用戶返回給你的一個結果,他是一個xml格式的字符串.調試的時候可以將它輸入到文件查看(結果是重復的,因為微信服務器會重復請求多次).$xml輸出結果如圖:
其中的$out_trade_no就是在支付之前我自己設置的訂單號碼.接下來我們想辦法得到這個訂單號,然後我就直接在下面寫支付成功後的邏輯了,如改變數據庫中的數據等等.
這個函數內其他的代碼我沒有管,只是最後一句return call_user_func($callback, $result);我直接改為return true;了.如果使用return call_user_func($callback, $result);就會有多次請求.
②.WxPay.api.php中的replyNotify函數,這個函數就是用來阻止微信服務器重復請求你的notify.php文件的,如圖:
查看完整個handle函數的調用過程後,會發現最後執行的就是這個函數.他的輸出結果(echo $xml)就是notify.php文件中最後一句handle函數的結果.$xml的內容是什麼呢?
內容如圖:
可以看到$xml是一個xml格式字符串,他就是文檔中說的返回給微信服務器的內容.所以我們不用做其他額外的返回操作了,微信自己就有返回結果的方法.
一開始做什麼都不懂,全是看別人的文章,在這一步看好多人說直接輸出success,return success,或者寫入流,等等,都沒有成功,總是被請求多次.後來狠心看了代碼,發現竟然有現成的.
四.支付後跳轉
支付完成後,手機提示支付成功,並會顯示支付信息,點擊手機上的完成,頁面可以跳轉到你設置的頁面.設置的地方是在jsapi.php文件中的jsApiCall函數中,我直接設置為跳轉到百度.你設置為自己想要跳轉到的頁面路徑即可.
至此,一個支付流程大致走完了,唯一的感覺就是覺的這個結果是自己七拼八湊蒙出來的,好暈.
題外:
微信支付的問題很多:
1. demo代碼有一堆錯誤
2. 文檔很亂,講的稀裡糊塗,不夠精確.
3. 官方給出的支付流程圖很多字看不清楚,細看流程圖發現竟然沒有第三步,直接第二步過去,回來就成了第四步了
4. 微信支付後沒有短信提示(這是最可怕的)
5. 手機微信綁定銀行卡後,我僅僅是用來做開發測試的,每次支付0.01元,但是期間竟有一筆66元的支出,短信不提醒,查看支付細節要求我升級微信版本,升級微信時,提示不支持新版本……
6. 鑒於上面的問題,我很懷疑微信支付的業務邏輯會不會有問題(可能性很大,畢竟連官方demo都能出錯).