本文是关于支付宝接口接入时权限验证失败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=52a02aab9e9c391caed9f6aa35efef35&mysign=52a02aab9e9c391caed9f6aa35efef35,buyer_email=xx@163.com&buyer_id=2088702249568542&exterface=create_direct_pay_by_user&is_success=T¬ify_id=RqPnCoPT3K9/vwbh3I7w7d8Xsk11CUE4io8QGNCyMM3bpbfPoBkG6cCiPbYxpBa09uc4¬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=52a02aab9e9c391caed9f6aa35efef35&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框架在提交信息的时候自动加入了参数造成的问题。大家在检查参数的时候一定要考虑到框架的影响。