支付宝アプリを受け取って砂箱の環境6001の誤った大きい穴を支払います
3287 ワード
支付宝の支払いを受けて、サービス側はjava sdkをダウンロードして、クライアントはandroid sdkにアクセスして、砂箱を設置します.公式サイトの流れに従って一歩一歩、最後にテストを行いますサーバは、クライアント に伝達する支払パラメータ文字列を生成する.クライアントはサーバからの支払いパラメータで、支付宝(砂箱版) を引き上げた.
最後に支付宝から失敗したmapが伝わってきた.
問題の調査
最後に支付宝から失敗したmapが伝わってきた.
{resultStatus=6001, result=, memo= }
問題の調査
公式の支払いクライアントdemo(demoで支払いパラメータを生成)を使用することで、砂箱、秘密鍵などを設定し、結果的に正常に支付宝を引き出して支払い、支払いに成功した.
ここで設定した鍵に問題がないと判断できます.問題は支払いパラメータです.
支払いパラメータはserver-java-sdkによって生成され、公式サイトの使用例と比較してすべて同じであり、このようにしてserver-java-sdkによって生成された文字列が正しくないことを確認します.この問題は砂箱版にしか出ていないのではないでしょうか.そうしないと、正式版にこの問題が出て早く爆発して更新されます.したがって、server-java-sdkで生成された文字列の砂箱支付宝がサポートされていない可能性が高い.
まずserver-java-sdkで生成された文字列に対して署名検証(公式ツール)を行い、署名が正しいことを決定します.次に、公式の支払いクライアントdemoが生成した文字列と詳しく比較します.# 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×tamp=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×tamp=2018-04-14+22%3A00%3A42&version=1.0
公式の支払クライアントdemoが生成した文字列のsignパラメータは常に最後であり、server-java-sdkが生成した文字列は内部であることを発見し、server-java-sdkが生成した文字列の調整:signパラメータを末尾に移動し、OKをテストする:(defn trans-alipay-pay-order-string [order-string]
" sign , "
(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)))
まとめ
総じて言えば砂箱支付宝の1つのバグで、使うのが少ないかもしれませんが、大部分の開発学生は1銭テスト大法で正式なオンライン応用の中で測定しているので、この問題に注意していません.
# 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×tamp=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×tamp=2018-04-14+22%3A00%3A42&version=1.0
(defn trans-alipay-pay-order-string [order-string]
" sign , "
(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)))
総じて言えば砂箱支付宝の1つのバグで、使うのが少ないかもしれませんが、大部分の開発学生は1銭テスト大法で正式なオンライン応用の中で測定しているので、この問題に注意していません.