商家參數格式有誤
① 支付許可權檢查失敗 這個問題解決了嗎
本文是關於支付寶介面接入時許可權驗證失敗sign和mysign不等問題的解決方案,本來是幾天前遇到的問題,解決了一直沒時間來整理,在忙公司的項目和自己的一個虛擬空間的網站(http://www.bosstoy.com),在做支付寶接入的一些代碼,之前也做過,但這一次遇到的問題是最徹底的,網上關於sign和mysign的文章蠻多,但情況也很多,非常零散,我根據網上的這些文章記錄的內容和自己遇到的問題作了一個整理,記錄下來,方便以後查閱,同時也希望能有同樣問題的朋友可以解決掉這個問題。
sign和mysign不等的問題,根據官方提供的解決方案,需要從以下方面去檢查,以下引用自官方原文:
通知返回時,支付寶返回給商家網站眾多信息中,包含一個簽名結果(sign),商家對其他所有信息進行加密簽名後會得到一個簽名結果(mysign),如果要驗證介面其有效性,需要把sign與mysign做比較,在MD5加密中,是做相等校驗。
而出現不等的原因是:
安全校驗碼沒有填寫或填寫不正確、請求時的參數格式不正確(如:有帶自定義參數等)、編碼格式混亂等。
解決方法:
1、檢查安全校驗碼(參數key)是否有填寫,且沒有空格,是否是32位字元串
2、檢查請求參數show_url、return_url、notify_url是否有帶自定義參數,去掉自定義參數,
http://www.xxx.com/alipay/return_url.asp?id=123
?id=123,「?」以後帶的參數都是自定義參數
3、 編碼格式亂碼。檢查亂碼的方法,可用寫日誌函數(log_result)來記錄中文部分的數據是否亂碼。如果亂碼則確定是編碼格式設置不一致,導致亂碼。 具體請檢查編碼格式參數input_charset、頁面屬性編碼、網站項目整體編碼等,確保傳遞數據時沒有亂碼。
原文網址:http://help.alipay.com/support/help_detail.htm?help_id=243094
官方原文對於這個問題出現的原因也做了解釋和出了相應的解決方案,但因為比較精煉,沒有更詳細的描述。往往還不能直接解決掉問題。比如這里提到的參數,是否帶有自定義參數,我能確認沒有定義自定義參數傳出去,但最終檢查出問題的原因還是因為傳回的消息數組裡面含有了一個多餘的參數導致sign和mysign不等,這個多餘的參數是__URL__,分析這個參數還是因為thinkphp框架自己再處理提交的時候傳出去的,在代碼裡面過濾掉這個參數sign和mysign就正常了。
在alipay_function.php修改以下代碼。紅色部分就是我自定義的參數,過濾掉就好了
/**除去數組中的空值和簽名參數
*$parameter 簽名參數組
*return 去掉空值與簽名參數後的新簽名參數組
*/
function para_filter($parameter) {
$para = array();
while (list ($key, $val) = each ($parameter)) {
if($key == 「sign」 || $key == 「sign_type」 || $val == 「」 || $key == 『__URL__』 )continue;
else $para[$key] = $parameter[$key];
}
return $para;
}
附正常的支付介面返回的參數列表,大家可以作一個參數比較,方便檢查:
執行日期:20120619143609responseTxt=truenotify_url_log:sign=&mysign=,[email protected]&buyer_id=2088702249568542&exterface=create_direct_pay_by_user&is_success=T¬ify_id=RqPnCoPT3K9/¬ify_time=2011-10-11 17:48:46¬ify_type=trade_status_sync&out_trade_no=ai-20-1318325559&payment_type=1&seller_email=xxo@gmail.com& seller_id=2088002118761435&subject=充值&total_fee=0.01& trade_no=2011101140268254&trade_status=TRADE_SUCCESS&sign=&sign_type=MD5
在解決問題的過程中,還看到很多其他的情況導致sign和mysign不等,大家可以對比著看一下:
第一種情況:由於編碼導致中文傳回是亂碼的情況導致sign和mysign不等。可參考這篇文章的案例
http://www.imlqw.com/322.html
第二種情況:由於post和get提交的問題導致sign和mysign不等,可參考以下文章:
http://my.oschina.net/u/214582/blog/52140
第三種情況:由於官方提供的paraFilter方法bug問題導致sign和mysign不等,可參考一下文章:
http://club.alipay.com/read-htm-tid-10244623-page-e.html
第四種情況:由於參數問題導致的sign和mysign不等的情況。在這里再說明一下,前面三種是在遇到sign和mysign不等的時候查閱到的一些其他情況,我試驗過上面的方法,但都不是因為這些原因引起的,我的sign個mysign不等是因為thinkphp框架在提交信息的時候自動加入了參數造成的問題。大家在檢查參數的時候一定要考慮到框架的影響。
② 上傳寶貝失敗:違規校驗錯誤,錯誤信息: Invalid arguments:seller_cids
一、Invalid arguments:seller_cids,中文意思是:無效的論點,參數格式無效。
二、原因:
由於商品類目選擇太多,二淘寶助理規定類目選擇不得超過10個。