談談開發支付功能碰到的坑
- 2019 年 10 月 3 日
- 筆記
文章原創於公眾號:程序猿周先森。本平台不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
最近因為有了新的需求,需要開發支付寶支付功能以及微信支付功能,兩三天開發下來碰到了幾個Bug,在這裡記錄下來以供以後可以溫故知新。因為支付寶功能是在H5端進行使用,所以使用了支付寶掃碼付功能,生成一張支付二維碼,然後用戶保存二維碼去支付寶進行掃碼支付操作。一路磕磕碰碰把功能完善出來了,但是碰到了幾個坑。支付寶支付開發碰到的問題:
1.無效的APP_ID
這個問題其實是最容易犯的一個錯誤,因為支付寶支付功能有沙箱測試環境。
經過查閱文檔發現支付寶app_id與網關地址不匹配所以導致出現無效的app_id這個問題,定位到問題原因,我在內網中將環境設置成沙箱環境網關地址以及沙箱環境app_id,然後發佈外網之後再將環境改成正式環境,然後果然解決了這個問題,然後對信息進行驗簽操作之後,支付寶會返回一個支付二維碼鏈接,點擊則會打開二維碼界面
然後進行支付寶掃碼付款就完成支付功能。
2.支付寶回調函數多次執行
可能因為沙箱環境不完善的原因,支付寶支付功能在沙箱環境下成功運行,而且回調函數只會執行一次,但是將支付功能發佈外網後,出現了支付寶執行多次回調函數的問題,因為需求比較趕,所以我將受支付寶多次執行回調影響執行的更新數據庫操作給注釋了,然後把這部分代碼邏輯寫到了輪詢訪問用戶支付狀態的接口裏面,但是這樣造成了一個問題,如果用戶截圖二維碼再去支付寶掃碼支付,支付成功返回二維碼界面那就可以調用輪詢接口成功進行更新數據庫操作,但是有部分機型長按二維碼可以直接跳轉支付寶支付,但是這樣操作支付完返回界面的時候二維碼界面會消失,也就無法執行輪詢訪問用戶支付狀態的接口,這樣就會導致用戶支付成功但是積分沒有充值到賬的結果,所以最後終究要回到解決第一個問題:支付寶為什麼會執行多次回調函數?
經過查閱文檔我發現這麼一句話:程序執行完後必須打印輸出「success」(不包含引號)。如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。開發文檔的解釋完美給出了造成了支付寶多次回調的原因:因為用戶支付成功執行回調函數中的數據庫更新操作後並沒有返回success字符串給支付寶,所以支付寶認為我還沒有成功回調,所以會不斷執行回調函數,這樣也導致了我數據庫更新操作被多次的執行。我把代碼邏輯按照文檔處理一下,再次去測試,果然就不會出現回調函數多次執行的原因了。
微信支付開發碰到的問題
1.Native無法點擊支付鏈接進行支付
微信付款我才用的Native掃碼支付,因為有支付寶的教訓,所以前期基本配置都沒出問題,成功生成了微信支付鏈接,但是這時候出現一個坑,這個鏈接在微信中可以直接打開支付界面
但是密碼付款之後就會提示當前交易不支持點擊消息鏈接發起,也就是說說雖然我們成功生成了支付鏈接,但是我們沒辦法進行支付
後來我去翻閱了微信開發文檔,對Native支付是這樣介紹的:Native支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信「掃一掃」完成支付的模式。也就是說Native支付是要生成支付二維碼,然後使用掃一掃再進行支付,但是微信只會返回一個支付二維碼鏈接,並不會和支付寶一樣直接給一個二維碼地址,所以就需要我們用微信成功返回的支付二維碼地址去生成支付二維碼,經過和前端同事協商,這部分邏輯在前端進行實現,為了測試支付功能,我使用了微微在線二維碼生成器,將微信成功返回的支付鏈接去生成了對應的支付二維碼。
然後使用微信進行掃碼支付最後成功支付,所以Native支付是不能直接使用微信支付鏈接進行支付的,而是需要先生成支付二維碼,然後使用掃一掃進行掃碼支付。
2.實際支付價格和需要支付的價格不匹配
微信付款雖然可以成功跑起來了,但是出現一個問題:我們需要支付1塊錢,但是最後生成的支付鏈接卻只能支付一分錢,查了微信支付開發文檔沒找到這個問題的具體原因,但是在百度文庫中找到了原因,微信支付與支付寶不一樣,微信支付以分為單位,所以如果想要以元為單位,參數total_fee接受前端傳過來的價格後需要乘以100,這個問題就可以解決了。
3.微信回調函數多次執行
微信開發接近尾聲了,我在同一個坑裡又摔倒了一次,微信支付又多次執行回調函數了,因為有了支付寶支付的教訓,我馬上想到一定是回調成功執行之後返回給微信的參數出問題,我去查了下微信支付開發文檔:在微信的異步通知後,也需要給微信服務器,返回一個信息,只不過,微信的所有數據格式都是xml的。所以我們在返回一個數據給微信即可。而不是和支付寶一樣返回success就可以。
我按照文檔要求在回調函數中把return_code及return_msg封裝成xml格式進行返回,微信多次執行回調函數的問題就成功解決了。到這裡微信支付功能就成功跑起來了。其實支付功能有很多坑,但是我站在前人的肩膀上,所以前期配置以及簽名那些最容易出問題的地方我都順風順水就成功了,在這裡記錄下自己開發碰到的問題,也希望可以給需要的朋友一點點幫助。
歡迎關注我個人公眾號:程序猿周先森