首先:沒有回調?還是進入回調函數但是驗簽失敗給支付寶返回了failure?
按照正常邏輯,驗簽失敗就不會進行業務處理修改訂單狀態,訂單仍處於未支付狀態。為確定究竟是沒有回調還是驗簽失敗,可以在回調函數中打印request中獲取的信息,或者存入Redis查看。
一:沒有回調
沒有回調極有可能是你的notify_url不能外網訪問,這種情況很容易出現在本地調試期,本地可以使用釘釘外網穿透,具體怎么使用請參考我這篇文章中間部分https://juejin.im/post/5c1849f7f265da61327f3c40。
服務器上沒有訪問則會是https的問題,公司注冊的SSL證書不標准導致支付寶無法識別https,為確認,請改為http訪問試試看能否正常回調。
二:驗簽失敗
支付寶的驗簽方式使用的是SDK自帶的方法(具體完整的回調方法請參考https://juejin.im/post/5c1849f7f265da61327f3c40),如下:
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), AlipayConfig.charset, AlipayConfig.signType);復制代碼
參數分別為:從request中獲取的信息(Map形式),支付寶公鑰,編碼方式,簽名方式。
既然是封裝在SDK中的方法,就極小可能出問題,那么問題100%出在參數上,我們一個個來講
1.params 這是支付寶返回的信息,只要是支付寶給你返回信息了,一定是標准格式的信息,出錯的可能性也很小,其中幾個參數可能會是null,但在SDK封裝好的驗簽方法中一定會剔除的。所以這個參數基本不會出問題。
2.編碼格式和加密方式,這兩個一般固定,UTF-8和RSA2,也一般不會出問題。
3.支付寶公鑰,這是最有可能出錯的。先講講這個參數的生成方式,進入open.alipay.com,登錄后進入我的開放平台,在左上角找到開發者中心-->網頁&移動應用,找到自己的應用點擊查看詳情
按官方文檔https://docs.open.alipay.com/200/105310下載加密工具,生成公鑰和私鑰,將公鑰貼在這里后會自動生成后面的支付寶公鑰,私鑰存在本地。你驗簽需要的支付寶公鑰就是上圖點擊查看支付寶公鑰的字符串。
問題出在下載加密工具,這里要使用最新版本的V1.4(根據支付寶官網更新)
如果你使用了舊版本,支付依然能成功但是驗簽就會失敗!!!
如果你使用了舊版本,支付依然能成功但是驗簽就會失敗!!!
如果你使用了舊版本,支付依然能成功但是驗簽就會失敗!!!
你可以看到在這個工具上方菜單欄也有驗簽功能,你可以用自己生成的公鑰私鑰先在這里驗證一番。