談談開發支付功能碰到的坑

文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。
file前端

最近由於有了新的需求,須要開發支付寶支付功能以及微信支付功能,兩三天開發下來碰到了幾個Bug,在這裏記錄下來以供之後能夠溫故知新。由於支付寶功能是在H5端進行使用,因此使用了支付寶掃碼付功能,生成一張支付二維碼,而後用戶保存二維碼去支付寶進行掃碼支付操做。一路磕磕碰碰把功能完善出來了,可是碰到了幾個坑。支付寶支付開發碰到的問題:數據庫

1.無效的APP_ID
filesegmentfault

這個問題實際上是最容易犯的一個錯誤,由於支付寶支付功能有沙箱測試環境。api

通過查閱文檔發現支付寶app_id與網關地址不匹配因此致使出現無效的app_id這個問題,定位到問題緣由,我在內網中將環境設置成沙箱環境網關地址以及沙箱環境app_id,而後發佈外網以後再將環境改爲正式環境,而後果真解決了這個問題,而後對信息進行驗籤操做以後,支付寶會返回一個支付二維碼連接,點擊則會打開二維碼界面
file
file服務器

而後進行支付寶掃碼付款就完成支付功能。微信

2.支付寶回調函數屢次執行微信開發

可能由於沙箱環境不完善的緣由,支付寶支付功能在沙箱環境下成功運行,並且回調函數只會執行一次,可是將支付功能發佈外網後,出現了支付寶執行屢次回調函數的問題,由於需求比較趕,因此我將受支付寶屢次執行回調影響執行的更新數據庫操做給註釋了,而後把這部分代碼邏輯寫到了輪詢訪問用戶支付狀態的接口裏面,可是這樣形成了一個問題,若是用戶截圖二維碼再去支付寶掃碼支付,支付成功返回二維碼界面那就能夠調用輪詢接口成功進行更新數據庫操做,可是有部分機型長按二維碼能夠直接跳轉支付寶支付,可是這樣操做支付完返回界面的時候二維碼界面會消失,也就沒法執行輪詢訪問用戶支付狀態的接口,這樣就會致使用戶支付成功可是積分沒有充值到帳的結果,因此最後終究要回到解決第一個問題:支付寶爲何會執行屢次回調函數?
fileapp

通過查閱文檔我發現這麼一句話:程序執行完後必須打印輸出「success」(不包含引號)。若是商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。開發文檔的解釋完美給出了形成了支付寶屢次回調的緣由:由於用戶支付成功執行回調函數中的數據庫更新操做後並無返回success字符串給支付寶,因此支付寶認爲我尚未成功回調,因此會不斷執行回調函數,這樣也致使了我數據庫更新操做被屢次的執行。我把代碼邏輯按照文檔處理一下,再次去測試,果真就不會出現回調函數屢次執行的緣由了。異步

微信支付開發碰到的問題函數

1.Native沒法點擊支付連接進行支付

微信付款我才用的Native掃碼支付,由於有支付寶的教訓,因此前期基本配置都沒出問題,成功生成了微信支付連接,可是這時候出現一個坑,這個連接在微信中能夠直接打開支付界面
file
file

可是密碼付款以後就會提示當前交易不支持點擊消息連接發起,也就是說說雖然咱們成功生成了支付連接,可是咱們沒辦法進行支付
file

後來我去翻閱了微信開發文檔,對Native支付是這樣介紹的:Native支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信「掃一掃」完成支付的模式。也就是說Native支付是要生成支付二維碼,而後使用掃一掃再進行支付,可是微信只會返回一個支付二維碼連接,並不會和支付寶同樣直接給一個二維碼地址,因此就須要咱們用微信成功返回的支付二維碼地址去生成支付二維碼,通過和前端同事協商,這部分邏輯在前端進行實現,爲了測試支付功能,我使用了微微在線二維碼生成器,將微信成功返回的支付連接去生成了對應的支付二維碼。
file

而後使用微信進行掃碼支付最後成功支付,因此Native支付是不能直接使用微信支付連接進行支付的,而是須要先生成支付二維碼,而後使用掃一掃進行掃碼支付。

2.實際支付價格和須要支付的價格不匹配

微信付款雖然能夠成功跑起來了,可是出現一個問題:咱們須要支付1塊錢,可是最後生成的支付連接卻只能支付一分錢,查了微信支付開發文檔沒找到這個問題的具體緣由,可是在百度文庫中找到了緣由,微信支付與支付寶不同,微信支付以分爲單位,因此若是想要以元爲單位,參數total_fee接受前端傳過來的價格後須要乘以100,這個問題就能夠解決了。
file

3.微信回調函數屢次執行

微信開發接近尾聲了,我在同一個坑裏又摔倒了一次,微信支付又屢次執行回調函數了,由於有了支付寶支付的教訓,我立刻想到必定是回調成功執行以後返回給微信的參數出問題,我去查了下微信支付開發文檔:在微信的異步通知後,也須要給微信服務器,返回一個信息,只不過,微信的全部數據格式都是xml的。因此咱們在返回一個數據給微信便可。而不是和支付寶同樣返回success就能夠。
file

我按照文檔要求在回調函數中把return_code及return_msg封裝成xml格式進行返回,微信屢次執行回調函數的問題就成功解決了。到這裏微信支付功能就成功跑起來了。其實支付功能有不少坑,可是我站在前人的肩膀上,因此前期配置以及簽名那些最容易出問題的地方我都順風順水就成功了,在這裏記錄下本身開發碰到的問題,也但願能夠給須要的朋友一點點幫助。

歡迎關注我我的公衆號:程序猿周先森
file

相關文章
相關標籤/搜索