接支付寶APP支付沙箱環(huán)境 6001 錯(cuò)誤的大坑記

接支付寶支付, 服務(wù)端下載 java sdk, 客戶端接入android sdk, 設(shè)置好沙箱。按照官網(wǎng)流程一步步來(lái),最后進(jìn)行測(cè)試

  • 服務(wù)器生成一個(gè)支付參數(shù)字符串,傳給客戶端
  • 客戶端用服務(wù)器給的支付參數(shù),拉起支付寶(沙箱版)

最后支付寶卻傳來(lái)一個(gè)失敗的map:

{resultStatus=6001, result=, memo=用戶取消}

問(wèn)題排查

通過(guò)使用官方的支付客戶端demo(在demo中生成支付參數(shù)),設(shè)置好沙箱,私鑰等,結(jié)果正常拉起支付寶支付,支付成功。

這里可以確定設(shè)置的密鑰是沒(méi)有問(wèn)題的,問(wèn)題就是在支付參數(shù)這里了。

支付參數(shù)是由 server-java-sdk 來(lái)生成的,對(duì)比官網(wǎng)的使用示例,一切都一樣,這樣下來(lái),就確認(rèn)是 server-java-sdk 生成的字符串不正確了。想來(lái)這個(gè)問(wèn)題也只有出現(xiàn)在沙箱版吧,不然正式版出現(xiàn)這個(gè)問(wèn)題早爆炸更新了。所以最大可能是 server-java-sdk 生成的字符串沙箱支付寶不支持。

首先對(duì) server-java-sdk 生成的字符串進(jìn)行簽名校驗(yàn)(官方工具),確定簽名正確。然后與官方的支付客戶端demo 生成的字符串仔細(xì)比較:

# 官方的支付客戶端demo 生成的字符串
charset=utf-8&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%220414213511-7518%22%7D&method=alipay.trade.app.pay&app_id=2016091500518622&sign_type=RSA2&version=1.0&timestamp=2018-04-14+18%3A04%3A03&sign=WnfXnYtpE6%2BtUbq9Zxs3w4n%2Fe%2F%2FQxiN5B1rSsGcNjmbWSVeCHs95a3VksCIt58dRJWj4fza5KwQ0ZHOeLMVEAnZwtjYYSHO96uXYeCG0uf4fm%2FlwWYRuKse5LRW1Sh2QyaVLmn3FcZH9bEnmGaTBHcCcTt%2BPa2KK8cQMNFw6WrLLElmXk4iwXrlwCjoSScots4QIbXK2qBoDPqdHo4i%2BWoNM4V80dPQh0YieNW5AtfOtPeTNBWcvhj9fZ0obrI%2B%2Bd0TQxQzCYyOPnpDOYr9%2FaDsuG4J1SiBPRMzyysPcG9%2BC%2F8kp2iZKQQmuyTGYO9JOZnhix9O2YsGBmx5sKPwbFw%3D%3D

# server-java-sdk 生成的字符串
alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2016091500518622&biz_content=%7B%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%221523714442123-8740%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%221%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&sign=JxVUnDm6I1Pwht%2BknWf6527gyM7zzeGli%2BMm3XWT19YuDcuFuc%2Fr46Qx7rB6m7ckKTPXsK2blEApWTgKvK7uA6sv0nTuCPcLD07DH6wNKygD5F%2By7tZT8M%2BWLugDZx%2BkVBmvNJ4RJDz5KtOx8g%2Fhjs6fWCUH6avWeOLsr9NVP1Jn1hrGL6%2BiCGWO7pPhGHtW7qvibfIAHM5ONBieCZ0xHqlCJDm6NWKJYj7X3avE4uAc%2Fd6TI1rL2i3T30ntAcIqQaj1XGYTJLnPRAqO%2BMDRg4gc6j39Km7lTSiwmaTV2TzHkzZhioOA3gyQa%2FdADuEuuTPEQnf%2FvaqpIzp%2BYcGomg%3D%3D&sign_type=RSA2&timestamp=2018-04-14+22%3A00%3A42&version=1.0

發(fā)現(xiàn)官方的支付客戶端demo 生成的字符串中 sign 參數(shù)總在最后,而 server-java-sdk 生成的卻是在內(nèi)部,然后對(duì) server-java-sdk 生成的字符串調(diào)整:將 sign 參數(shù)移動(dòng)到尾部,測(cè)試OK:

(defn trans-alipay-pay-order-string [order-string]
  "將支付寶支付參數(shù)字符串中 sign 參數(shù)移動(dòng)到尾部,以支持沙箱支付寶測(cè)試"
  (let [start-index (clojure.string/index-of order-string "&sign=")
        end-index (and start-index
                       (clojure.string/index-of order-string "&" (inc start-index)))]
    (if (and start-index end-index)
      (str (.substring order-string 0 start-index)
           (.substring order-string end-index)
           (.substring order-string start-index end-index))
      order-string)))

總結(jié)

總的來(lái)說(shuō)是沙箱支付寶的一個(gè)bug,可能是用的少,大部分開(kāi)發(fā)同學(xué)用1分錢測(cè)試大法在正式上線應(yīng)用中測(cè),所以沒(méi)有留意這個(gè)問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • 《月夜》 ——瘦桶 月圓了 也終于孤單 它照亮了我的夢(mèng) 也照向遠(yuǎn)方 曾指向遠(yuǎn)方的星星 在漫長(zhǎng)的沉默中 失去了...
    瘦桶閱讀 360評(píng)論 0 60
  • 再無(wú)奈的處境, 也阻止不了我想你的心情。 一路上沒(méi)有你, 再皎潔的月光也撒不下浪漫。
    兄弟相擁而眠閱讀 369評(píng)論 0 2

友情鏈接更多精彩內(nèi)容