天天看點

小程式報錯ALI38173—自查方案說明      排查思路

說明      

  小程式裡報錯ALI38173的問題,一般在my.tradePay、my.paySignCenter,這幾個支付類接口裡。錯誤原因和

支援中心

提供的一樣

  檢查請求參數 

  1、對照我們的線上文檔檢視,比如:參數少了、多了、亂碼、名稱不對,還有必傳參數是否都請求送出給支付寶了等等。 

  2、确認是否破壞了參數名=參數值&參數名=參數值的格式。

排查思路

  本次,針對這個報錯,我們提供一個詳細的排查思路

  先把orderStr這個參數裡的指派内容給列印出來,舉例如下:

    示例一:

alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2018030902340000&biz_content=%7B%22body%22%3A%22%25E9%25A2%2584%25E7%25BA%25A6%25E5%25AE%25A1%25E8%25BD%25A6%25E8%25B4%25B9%25E7%2594%25A8%22%2C%22out_trade_no%22%3A%22E201805251502141834984962%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22subject%22%3A%22%25E9%25A2%2584%25E7%25BA%25A6%25E5%25AE%25A1%25E8%25BD%25A6%25E8%25B4%25B9%25E7%2594%25A8%22%2C%22timeout_express%22%3A%2230m%22%2C%22total_amount%22%3A%220.01%22%7D&charset=GBK&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fwww.alipay.com%2F&sign=aX2Cx1lA6uu5y4%2F%2FgA8nO6y0ADAp2D7yY4ZE9Hx3VfC8iWAHOvalrkLv3qknTkvoQo0fXt9whyvJbHIs8Pas%2FtVb1nSP9azfYG4T2gOi2EEa542JonkLg4fOnEdL8FMJhMYDXVrmP2gcjwUIhGd8J5E4gN2U9yocNuQ2FEeajmXlYfX7YdxbChqHmTq0JHJ9g%2FGUMKs39XX7Obp%2F4iDiVpO24s3AgdMrm0v0wW9DKgLGYAwq1U0qemyRZ%2B55UNyoZwmJBvqP3mBhtFN0%2BxEKvDv8PFT%2BiFZFtKCpIjGjnNcHLANenD1eGoQwq7nTyJrgSTlzX8v7TFb%2BnCmYoGGjnQ%3D%3D&sign_type=RSA2&timestamp=2018-06-05+10%3A29%3A51&version=1.0           

    示例二:

alipay_sdk=alipay-sdk-php-20161101&app_id=2018012902100000&biz_content=%7B%22out_trade_no%22%3A%222018061112212055440%22%26%22total_amount%22%3A%22998.00%22%26%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%26%22subject%22%3A%22%E5%85%BB%E7%94%9F%E8%B5%84%E8%AE%AF%E6%94%AF%E4%BB%98%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay&notify_url=https%3A%2F%2Fwww.alipay.com%2Fxiao_notify_url&sign_type=RSA2&timestamp=2018-06-11+12%3A21%3A21&version=1.0&sign=1JDo9XZAR%2FwQAEejazzfq7s1xWKf0nXLfxJIVHc4gPSxmQ7fyy%2F3VjWeOeb%2Ful%2B%2FyeAckCEql7B%2FneWVqbNAOFz1SZjsfQ9gqn64xXJgCi%2BjCIPS6%2F0GJCwbrRhNMuMcCHRAJUdOOFh3yTuGSFF3Q9BB%2FMx2KdaSJ%2FYyM8D1sidC6xeOpCF%2FC4Cw670TjdX2XpOAoxI4myEyWkLSSj6Ia2oS%2BKOaOjguUQUwzIVphlpO%2FEOoSUDJLw3B%2BjPSQYIbujqNO1ETdxhVoOPFk0fHi2LV2MI4zHz4HyuDC260IIcpE9XbncnUv5C65aIzGpiP1S%2FRAa%2BxF7%2FlP%2B3WLCnVug%3D%3D           

  以上兩個示例是從開發者的後端傳回給前端的資料。

用工具或自行urldecode下資料是長什麼樣呢?

  與開放平台提供的

簽名邏輯

進行比對、與接口文檔的參數進行比對(

app支付

當面付

),有時候一次decode還不行,需要兩次才能看到原始資訊。

示例一

  第一次decode:

alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2018030902340000&biz_content={"body":"%E9%A2%84%E7%BA%A6%E5%AE%A1%E8%BD%A6%E8%B4%B9%E7%94%A8","out_trade_no":"E201805251502141834984962","product_code":"QUICK_MSECURITY_PAY","subject":"%E9%A2%84%E7%BA%A6%E5%AE%A1%E8%BD%A6%E8%B4%B9%E7%94%A8","timeout_express":"30m","total_amount":"0.01"}&charset=GBK&format=json&method=alipay.trade.app.pay&notify_url=http://www.alipay.com/&sign=aX2Cx1lA6uu5y4//gA8nO6y0ADAp2D7yY4ZE9Hx3VfC8iWAHOvalrkLv3qknTkvoQo0fXt9whyvJbHIs8Pas/tVb1nSP9azfYG4T2gOi2EEa542JonkLg4fOnEdL8FMJhMYDXVrmP2gcjwUIhGd8J5E4gN2U9yocNuQ2FEeajmXlYfX7YdxbChqHmTq0JHJ9g/GUMKs39XX7Obp/4iDiVpO24s3AgdMrm0v0wW9DKgLGYAwq1U0qemyRZ+55UNyoZwmJBvqP3mBhtFN0+xEKvDv8PFT+iFZFtKCpIjGjnNcHLANenD1eGoQwq7nTyJrgSTlzX8v7TFb+nCmYoGGjnQ==&sign_type=RSA2&timestamp=2018-06-05 10:29:51&version=1.0           

  第二次decode:

alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2018030902340000&biz_content={"body":"預約審車費用","out_trade_no":"E201805251502141834984962","product_code":"QUICK_MSECURITY_PAY","subject":"預約審車費用","timeout_express":"30m","total_amount":"0.01"}&charset=GBK&format=json&method=alipay.trade.app.pay&notify_url=http://www.alipay.com/&sign=aX2Cx1lA6uu5y4//gA8nO6y0ADAp2D7yY4ZE9Hx3VfC8iWAHOvalrkLv3qknTkvoQo0fXt9whyvJbHIs8Pas/tVb1nSP9azfYG4T2gOi2EEa542JonkLg4fOnEdL8FMJhMYDXVrmP2gcjwUIhGd8J5E4gN2U9yocNuQ2FEeajmXlYfX7YdxbChqHmTq0JHJ9g/GUMKs39XX7Obp/4iDiVpO24s3AgdMrm0v0wW9DKgLGYAwq1U0qemyRZ 55UNyoZwmJBvqP3mBhtFN0 xEKvDv8PFT iFZFtKCpIjGjnNcHLANenD1eGoQwq7nTyJrgSTlzX8v7TFb nCmYoGGjnQ==&sign_type=RSA2&timestamp=2018-06-05 10:29:51&version=1.0           

  這個的問題在于biz_content被urlencode了一次,再做拼接後又urlencode了一次。

  解決辦法就是:biz_content不要urlencode。

  示例二:

alipay_sdk=alipay-sdk-php-20161101&app_id=2018012902100000&biz_content={"out_trade_no":"2018061112212055440"&"total_amount":"998.00"&"product_code":"QUICK_MSECURITY_PAY"&"subject":"養生資訊支付"}&charset=UTF-8&format=json&method=alipay.trade.app.pay&notify_url=https://www.alipay.com/xiao_notify_url&sign_type=RSA2&timestamp=2018-06-11 12:21:21&version=1.0&sign=1JDo9XZAR/wQAEejazzfq7s1xWKf0nXLfxJIVHc4gPSxmQ7fyy/3VjWeOeb/ul+/yeAckCEql7B/neWVqbNAOFz1SZjsfQ9gqn64xXJgCi+jCIPS6/0GJCwbrRhNMuMcCHRAJUdOOFh3yTuGSFF3Q9BB/Mx2KdaSJ/YyM8D1sidC6xeOpCF/C4Cw670TjdX2XpOAoxI4myEyWkLSSj6Ia2oS+KOaOjguUQUwzIVphlpO/EOoSUDJLw3B+jPSQYIbujqNO1ETdxhVoOPFk0fHi2LV2MI4zHz4HyuDC260IIcpE9XbncnUv5C65aIzGpiP1S/RAa+xF7/lP+3WLCnVug==           

  可以看出biz_content裡面不是JSON格式。

  解決辦法就是:把biz_content裡的&字元改成半角的逗号【,】

簡言之:

       decode出來的資訊,一個參數一個參數的檢查,是否有缺少,是否拼接格式有異常即可。

使用開放平台SDK 正确的拼接結果長什麼樣子的呢,以下例子僅供參考:

alipay_sdk=alipay-sdk-java-dynamicVersionNo&app_id=2018041002532671&biz_content=%7B%22out_trade_no%22%3A%22cs20180419000002%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%22%E6%B5%8B%E8%AF%95%22%2C%22body%22%3A%22%E6%B5%8B%E8%AF%95%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2F%E5%B7%A5%E7%A8%8B%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%9C%B0%E5%9D%80%2Falipay.trade.page.pay-JAVA-UTF-8%2Fnotify_url.jsp&sign=NZjw96Y4ReP0Y%2Fcnb6SxfF%2B1bqvk%2BQquVKu56Y34X%2FO9nGvIQJKZmWCsZV7c%2BvAULJpdytxU0cOxPYMf9Drun%2BtDEW9qrOQD2eB8gDRoj09QRZFGupmtQjaUF1MKYCo3iiUiSwbIIzOk6oOecGMpGTohVmWH%2FKXrqbbYRQ18wfrJsMbWl6vZksgZ7wlUWd3B%2BxhI0oXaX5Qwi%2FgyYBETIrurgaLiY%2BRI7NZCW7KQlzS6LOVjnID%2FONgPD2PxB7d%2F2sq%2B0umBvWm8mEtcpmo7%2F2UhLDlD8UxAsal8i6agDlndpOOVRBMP2h%2FTCfJoGwcib7Y5iJ7QJpKPl56uYwF09g%3D%3D&sign_type=RSA2&timestamp=2018-06-05+11%3A36%3A01&version=1.0           

orderstr裡的資料是怎麼拼接起來的呢?

(以my.tradePay舉例)

  1. 先去找到APP支付的

服務端SDK下載下傳包

  2. 再在下載下傳的頁面下方找到調用代碼示例

  3. 接着服務端調用接口getbody()拿到完整的資料拼接資訊(注意是不帶openapi.alipay.com網關的)

  4. 然後通過前端的my.httpRequest回調給前端

  5. 最後my.tradePay接口裡的指派給orderStr

在開發測試過程中,建議在服務端手工生成一個資料請求串,寫死到前端代碼裡,以便定位是後端的請求串拼接問題還是前端解析問題。