业余做了一个HTTP代理IP网站,米扑代理:http://proxy.mimvp.com

自己通过Chrome,Firefox,IE9+,Opera,Safari,搜狗,腾讯,360等浏览器测试都OK,

但用户支付时偶尔反馈支付错误,错误代码如下:

alipay_error

用户问题无小事,赶紧把所有浏览器再次测试一遍,没问题;安装更低版本浏览器再测一遍,终于在IE8浏览器复现了问题。

 

网上原因分析

原因1: 所有参数列表中不能有乱码,所以把这个页面设置下字符集即可(默认php + utf-8)

                header("Content-type:text/html;charset=utf-8");

效果1:在 apipay.php, apipay_return.php, apipay_notify.php 等文件里,都添加上面一行,如下图:

              paypal-error-code-illegal-sign-01

           在IE8 ——》 查看 ——》 编码 ——》 默认仍然为GB2312,url框中显示乱码,没解决

 

原因2: 中文编码的问题,不同网站采用不同的中文编码

支付宝开发包,默认有utf-8,gbk,gb2312,iso-8859-1等编码格式,而程序中md5对中文签名会不一样,造成显示该错误。现asp的程序没有直接utf-8编码的md5。PHP和jsp.net程序都是支持该编码的,您可以通过支付接口的 _input_charset = “utf-8” 参数设置制定的字符集,并且我们返回通知也会使用该字符集,解决乱码的问题。

效果2: 按照上述描述,PHP + utf-8,在IE8浏览器中仍然错误,支付失败!

 

原因3: 该错误的引起因素有好几点:

1、传递的参数有空值。在支付宝的支付请求url中,某个参数是空值。这样空值在经过md5签名以后,比对会报错,所以请注意您传递过来的url中无空值。建议检查您购物车的支付宝代码,例如:subject=“shop”而非subject= “”

2、程序中安全校验码填写错误(请务必保存好该码,泄漏出去有可能被人伪造消息)。在您拿到不同测试中都有一个key的参数,该参数代表支付宝的安全校验码。从账户内复制过来的时候,会多余空格,请消息检查。例如某一个用户的key是kXXXXXXXXXXXXXXXXXXXXXXXXXXXati,复制到程序中key=“ kXXXXXXXXXXXXXXXXXXXXXXXXXXXati ”多了空格的。

3、中文编码的问题,不同网站采用不同的中文编码支付宝开发包,默认有utf-8,gbk,gb2312,iso-8859-1等编码格式,而程序中md5对中文签名会不一样,造成显示该错误。现asp的程序没有直接utf-8编码的md5。PHP和jsp.net程序都是支持该编码的,您可以通过支付接口的 _input_charset = “utf-8” 参数设置制定的字符集,并且我们返回通知也会使用该字符集,解决乱码的问题。

1. 建议您使用支付宝提供的事例程序中的函数进行签名。(照做

2. 检查并确保协议参数中的partner和签名用的安全校验码没有错误。照做

3. 若签名函数由自己开发,请检查待签名前排好顺序的签名串是否按照字母序排序。

4. 签名时使用的字符集编码是否有问题,例如:您系统默认字符集编码为UTF-8,传递到支付宝时请指定_input_charset为UTF-8。照做

5. 提交到支付宝的地址请使用https://www.alipay.com/cooperate/gateway.do,如果使用http://www.alipay.com/cooperate/gateway.do的在表单POST时,支付宝服务器会做一个到https的跳转,转到https接口时POST传递过来的参数会丢失。照做

效果3:上述每一条都试过,在IE8中仍然乱码,支付失败!

 

百般无奈与彷徨之际,灵光一现:何不让用户换一个浏览器呢?

既然测试了那么多浏览器都OK,说明支付流程和逻辑是没问题的,唯一可能出现的问题是浏览器自己的编码问题,导致urlencode后传给支付宝的“中文乱码”,造成md5签名错误!

因此,解决办法是让用户换一个浏览器,例如高版本的IE9+,firefox,chrome(推荐)