1. 程式人生 > >微信支付趟過的坑

微信支付趟過的坑

        這段時間在做微信支付開發,在公司的公眾號審批下來後,我這邊的測試用例也已經開發完畢,於是拿著具體的資料來除錯了,大段大段的程式碼就不貼了,demo裡有,這裡就說說除錯過程中遇到的坑。


        第一坑:redirect_url引數錯誤。因為我選擇的的“JS API”支付,這種支付需要網頁授權,先獲取code,再拿code去獲取openid和prepay_id。這個網頁授權需要登入微信公眾平臺,點選左側選單“開發者中心”,在右側“許可權列表”中找到“網頁賬號”,點選最右側的修改,把測試的網址寫進去,注意不要加http。填好後,這個坑就趟過去了。


        第二坑:invalide code。趟過第一坑後,會返回code,再拿此code去獲取openid,但是每次到這步時微信那邊都返回這個{"errcode":40029,"errmsg":"invalid code"},此坑卡了我整整半個下午。在周天的時候,我又仔細看了開發文件,沒得要領,最後又仔細檢查了下程式中每次回撥的引數。這一檢查,就發現要領了,先把回撥地址寫的最簡單,啥引數都不帶,成功;接著,一個一個引數帶上去,直到帶上token這個引數時,返回了invalid code。哈,我猜應該是此引數和微信那邊有衝突吧,於是把此引數改成了其他的,此坑立馬就過了,接下來支付就一下子除錯成功。


        第三坑:系統繁忙,正在升級,請稍後再試。週末除錯成功後,便把測試程式碼整合到專案中,開始支付。但是到了支付介面時,便出現了此問題,怎麼找到都發現不了問題,點選週末的測試連結又是好的。下午時又仔細看了下上下游的的傳遞的引數,發現了問題所在。每次上游傳遞過來的支付金額total_fee都是“1.00”這種型別,因為微信支付的基本單位是分,於是把手動把1.00該為1,成功了。看來是微信支付那邊total_fee不能接收小數點,於是我和上游的同事協調了下,傳遞過來的金額沒有小數點,此坑也就過了。


        【更新 2015-01-26】

        今天測試發現在iphone4上,支付不成功,於是進入測試機除錯,發現問題出在第一坑中,把body引數去掉,就ok了,看來在微信支付時,最好少帶引數。 


         【更新 2015-01-30】

         下午,QA說微信支付又不成功了,提示“統一支付介面中,缺少必填引數openid!trade_type為JSAPI時,openid為必填引數!”。我進入測試機中除錯,發現伺服器中curl請求微信平臺返回的都是NULL,提示不管用,接著又列印curl的報錯資訊,輸出為77,去curl錯誤碼查詢了下,提示是SSL證書的問題,於是我在伺服器重新安裝了證書,並重啟了php-fpm,之後便能支付了。

sudo yum install ca-certificates
service php-fpm restart

         【更新 2015-02-27】

        今天支付接入了商城相關邏輯,寫完後,我又測試了以前的會員卡支付的,發現在支付階段提示失敗,於是加上測試語句,提示“getBrandWCPayRequest:fail_no permission to execute”(注:iphone5s手機),後來找到了部小米的,進入支付提示“system:access_denied”,進入文件一查,原來是授權目錄錯誤,改回來後就好了,應該是QA在年前改的,折騰。


        【更新 2015-03-30】

        上午看到QA在禪道又提了個關於微信支付的bug,說是報“package中的引數partner或者prepay_id為空”的錯誤。於是我輕車熟路的進入到除錯模式,經過幾次測試,發現微信支付一旦超過十萬便會出現上述提示,若是打上斷點除錯語句的話,會發現微信返回{"errcode":"FAIL","errmsg":"invalid total_fee"}。知道微信支付額度上限,那麼只需在後臺設定最大不超過十萬即可。