支付寶PC端支付報INVALID_PARAMETER錯誤,一次解決過程

前言

我們項目前端部分分爲PC端、手機端兩個項目,然後共用一個web端,手機端已經上線,手機端中的充值支付模塊也已經正常在使用;但這次PC端項目上線的時候,充值卻出現了問題,支付接口返回INVALID_PARAMETER的錯誤;而充值這塊之前是另一名開發負責,可是已經離職,只能自己去排查了。

解決過程

經過多次測試,發現是部分金額支付出現問題,然後根據官方文檔,出現INVALID_PARAMETER的原因是:

INVALID_PARAMETER
請求參數無效,參考以下方法排查:
1.請檢查參數biz_content是否是一個合法的JSON字符串;
2.請檢查接口是否按照文檔規範傳入biz_content參數;主要檢查參數格式是否符合要求,是否有非法值、越界等,如參數超過限制長度或者非空的參數未傳等,具體請根據接口文檔檢查參數格式,文檔見 螞蟻金服開放平臺-文檔中心。

我就去觀察比對正確和錯誤的請求參數有什麼不同,然後發現biz_content部分中除了時間字段外,只有一個字段參數會變化,就是passback_params,而且是該字段最後字符含有“=”等於號的時候,就會出錯

passback_params
String

512
公用回傳參數,如果請求時傳遞了該參數,則返回給商戶時會回傳該參數。支付寶只會在異步通知時將該參數原樣返回。本參數必須進行UrlEncode之後纔可以發送給支付寶
merchantBizType%3d3C%26merchantBizNo%3d2016010101111

看了代碼後,發現該字段確實可疑,因爲代碼中對參數進行了一次編碼操作,原來代碼如下:

//PassbackParams 參數內容的json串有 雙引號(") 時  進行urlencode後的值傳過去支付寶會報參數異常,所以換爲base64.encode
model.setPassbackParams(new String(Base64.encodeBase64(passbackParams.toJSONString().getBytes())));

之前的開發採用Base64編碼,我開始懷疑是這個編碼jar包有問題,換了別的jar包也是這樣,後面想了下,既然雙引號報錯,那我把雙引號改成單引號json串,再用urlEncode就好了,然後試下了,果然沒問題。

//PassbackParams 參數內容的json串有 雙引號(") 時  進行urlencode後的值傳過去支付寶會報參數異常,所以換爲單引號
model.setPassbackParams(URLEncoder.encode(JSON.toJSONString(passbackParams, SerializerFeature.UseSingleQuotes), "UTF-8"));

總結

請求失敗,就是因爲Base64編碼後出現的“=”等於號,然後,因爲我PC端支付採用的是GET請求的方式,url中不能存在“=”,所以導致出現問題,這樣的話其實還有另外一種解決方案,就是對Base64編碼後的字符串再進行urlEncode,這樣就比較麻煩。

至於,爲啥PC版出現問題,手機端沒問題,原因就是手機端採用的是POST請求的方式(原來PC端也採用的post方式,後來由於form表單請求被瀏覽器攔截,就試着改成get請求,沒改回來),biz_content是放在表單裏面請求,所以沒有出現問題。

其實當時發現參數中包含“=”等於號就應該發現是因爲get請求中包含了等於號而出現的錯誤,就可以省去了驗證Base64是否正確的驗證步驟,從而知道如何結局

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章