分享一下這兩週爬微信支付的坑~希望有借鑑作用(PHP)

wads247發表於2019-02-16

前言

其實任何介面開發只要按照給出來的介面文件和例子開發基本上不會有太大問題的,一些問題都是出在雜七雜八的小細節上,現在分享一下微信支付開發中自己遇到的小細節。
按照文件做完開發前配置,比如JS安全域名配置、網頁授權域名、公眾號授權目錄等等…

坑一: 配置

看完微信支付的文件,瞭解介面的規則,微信支付的流程基本是:獲取openid -> 生成統一下單引數 -> 使用者支付 -> 回撥 ,其實沒有太複雜
在配置上面說的東西的時候也會有一些小問題

支付授權目錄需要配置到介面的上一級目錄,斜槓(/)結尾,必須是斜槓結尾,而且是你寫的後端介面的請求路徑,不管是否做了路由跳轉之類的

坑二: openid的獲取

  • 下載微信支付DEMO 連結

文件中也有給出了例子,在example資料夾,當時在第一步獲取openid就卡住了。
先講一下我這邊程式碼框架是前端vue + 後端thinkphp給出api介面實現資料互動這樣的。
在第一步獲取openid中,需要做header("Location:....")重定向獲取到code然後跳轉回來Curl訪問access_token介面獲取到使用者openid。
如果前端下單本身就是一個頁面跳轉那可以按照demo的寫法直接用,但是如果是前端post請求是沒法做重定向操作,所以獲取openid和生成統一訂單引數不能放在同一個方法內實現。
在前端非同步的請求中會報Access-Control-Allow-Origin的跨域問題,而且是報api.weixin.qq.com不能跨域到api.weixin.qq.com
所以如果遇到以上跨域問題~那就是你的前端非同步請求和獲取openid寫到一起了,但是非同步請求無法響應header重定向的原因。
如果你的專案中在其他地方已經獲取到openid那這部分就不存在問題了

第一個坑的結果:如果前端是非同步請求資料的話,openid不能和統一下單寫在一起~openid需要做一次重定向來獲取。

坑二: 生成統一訂單

生成統一訂單引數要嚴格對照 引數文件的引數寫,example資料夾的例子中有寫好的組裝引數方法,可以直接呼叫沒有太大問題,但是要注意的有以下幾點

  • 嚴格 大小寫
  • 引數必須是 字串
  • 附加引數attach值的最大長度是127
  • 前端接收到引數後,必須組成物件寫到WeixinJSBridge.invokegetBrandWCPayRequest請求中,注意是物件!!!物件!!!物件!!! 我跟前端開發溝通的過程中前端就把引數轉成字串寫到getBrandWCPayRequest裡面了,我加班好久查資料最後才發現是這裡的問題

在這一步會遇到以下報錯:

  • 支付缺少引數:appId (因為整個引數組不是一個物件所以報錯)
  • chooseWXPay:fail (不能在開發者工具上除錯微信支付,在工具上會報這個錯誤。其實去網上查的一大堆資料都說的解決都是在說這個原因)

這個坑的問題就在於:各種引數要對照文件寫好而且格式正確。

坑三:支付成功回撥

支付回撥的例子裡面有重寫NotifyProcess的方法,如果你要另外寫業務可以吧notify.php寫成一個檔案然後再寫另外的回撥介面來請求這個類。
我這邊的話就重寫了一下方法返回回撥資料。
回撥的坑在於你回撥業務處理完了之後要在最後加上以下:

  • return `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>`;

否則的話微信沒有收到你的回撥成功返回,會不斷重複回撥5次然後停止,如果回撥中寫了業務那就會重複操作了。

這個坑就是:要注意回撥結束要返回成功的xml響應

END

這幾天做微信支付暫時遇到的問題就這麼多,只能說注意細節吧,爬過的坑記錄下來以後遇到就懂處理了。
哦,還有微信支付的相關問題網上能搜到很多…但是不一定跟自己遇到的能匹配上,而且大部分都是很久的了….
這個略坑

相關文章