PHP支付介面教程,詳解微信支付(一)

fourn發表於2017-06-28

微信支付

三大支付方式裡面,最複雜也是坑最多的非微信支付莫屬,我們從微信開始講。
常見的微信支付種類有下列四種:

  1. 微信JS支付,也稱公眾號內支付,使用場景就是微信裡面的H5商城,在微信以外的地方無法使用
  2. 微信PC支付,也稱掃碼支付,使用場景是PC端,注意這裡並不是“原生掃碼支付”
  3. 微信APP支付,使用場景是原生或者混合APP
  4. 微信WEB支付,場景是微信外的觸屏網站,這個介面一直都有,只是最近才開放出來可以讓普通公司申請,這個如果有機會的話也會講一講

從介面申請階段開始,四種方式就各有各的坑,這裡不得不感謝一下騰訊,替我們增加了很多工作量。

微信JS支付

第一階段:介面申請

因為是面向開發人員的教程,所以具體的申請條件、如何申請等內容並不會講的太詳細,只需要注意下面幾點即可:

  1. 請領導把你的微訊號設定為公眾號的臨時管理員
  2. 把公眾號和商戶平臺的賬號密碼拿到手
  3. 微信平臺需要自己去重檢視APPSECRET,這個過程需要公眾號管理員授權
  4. 商戶平臺需要自己去配置KEY,這個過程會有兩條驗證簡訊發到領導手機上

總之第一階段最後需要把這四個資料準確的拿到手:

  1. APPID——登入公眾平臺檢視
  2. APPSECRET——登入公眾平臺申請重置之後檢視
  3. MCHID——商戶平臺的ID
  4. KEY——商戶平臺自己設定的KEY
30492-d494f089e70b4880
檢視APPID

30492-fa54dd0dafa37f5f
檢視APPSECRET

30492-dd44e85272d59d33
檢視MCHID

30492-63fa35aecdc6e48c
設定KEY

第二階段:配置

這裡指的配置是配置公眾平臺,配置有必要詳細的說一下,現在各種現成的專案和整合支付程式碼比比皆是,可是你就是用不起來,這個時候千萬不要花時間去審查程式碼,是你的配置出了問題。讓我們從原理上來理解一下:
業務域名、 JS介面安全域名、網頁授權域名

30492-5f5040f297861d4d
PHP支付介面教程,詳解微信支付、支付寶支付、銀聯支付(一)

這三個引數在同一個頁面進行配置,配置方法也相同,直接填寫域名即可。如果你遇到的問題是REDIRECT_URI錯誤,那多半就是這裡出現了問題。
支付授權目錄

30492-547c145c268cabb9
PHP支付介面教程,詳解微信支付、支付寶支付、銀聯支付(一)

這裡一定要填寫實際發起支付的頁面的URL,並且以斜槓結尾。那麼就有三個問題:

1. 我完全沒搞懂實際發起支付的是哪個URL
2. 我並不清楚什麼叫斜槓結尾
3. 我配置對了為什麼沒用
  1. 在獲取OPENID的過程中會有一次重定向,一般是重定向回本頁面,但也有部分專案不會這麼做,比如ecshop,就被重定向到了別的頁面,所以實際發起頁面也就變成了別的頁面。
  2. 斜槓結尾就是把你的URL從右邊開始數,碰到第一個斜槓,把你數過的部分刪掉,剩下的就是正確的配置內容。當然還有廣大ThinkPHP3.2使用者,你們的引數用斜槓來傳,就意味著你們在支付頁面只能帶一個引數,否則怎麼配置都不會對的。
  3. 有可能你壓根沒配置對,請參考前兩條。如果你確定配置對了,請去喝一杯咖啡,這個配置有時候不會馬上生效。

第三階段:除錯

倒一杯咖啡,開啟你心愛的程式碼編輯器,按照這6個步驟來,不要浮躁,你將會再次感謝騰訊……
把你在第一階段準備的引數放到專案中(運氣好的話此時你已經完成了開發)

  1. 測試CODE有沒有獲取到
  2. 測試OPENID有沒有獲取到
  3. 測試預支付訂單是否正常
  4. 測試JS是否正常
  5. 測試回撥資料是否正常

把踩過的坑或者套路與大家分享一下:

在官方DEMO中,JsApiPay類下面GetOpenid方法中第4行,
$_SERVER[`PHP_SELF`]
和
$_SERVER[`QUERY_STRING`]
之間少了一個問號。導致的問題就是有一些用GET傳參的同學,OPENID死活獲取不到。
訂單名稱裡面不能含有&,暫時只發現這個符號會使得支付發起失敗
簽名錯誤,一般是再去檢查引數,特別是一些看不到的字元可能混在引數中,最好不要懷疑簽名方法有問題。
流程中有4個左右的地方會簽名,或者驗證簽名,一定要確保所使用的KEY都是正確的。
在除錯JS的時候用
alert(res.err_code+res.err_desc+res.err_msg)
把錯誤彈出來
測試回撥的時候用
$GLOBALS[`HTTP_RAW_POST_DATA`]
來接收微信的通知,做好是接收到就存到資料庫裡,先確保接收到了,再去調簽名和業務邏輯。

寫在最後

操作類的內容和理論類的內容是分開的,例如本文就是操作類的,今後將會有探討JS支付原理或者公私鑰原理的文章,但不是現在,因為不想開留太多坑。
在文章節奏的把控上略顯得有些不足,不過我會盡量不出現大篇幅程式碼,多分享經驗乾貨,多以初學者的角度行文。如果有問題歡迎留言討論,希望能對大家有幫助!

30492-354d5a951a7f9265

以上內容屬於作者原創,特此宣告,如需轉載,請取得同意


相關文章