网站接入易宝支付遇上的问题
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/143/ ]
因为工作的需要,就接触了易宝支付.本以为根据易宝支付提供的demo跟文档就能快速的完成接入工作,可是这一过程并不顺利,耽误了不少时间,所以我就把遇上的问题给记录下来,也许能帮到更多朋友.
因为工作的需要,就接触了易宝支付。本以为根据易宝支付提供的demo跟文档就能快速的完成接入工作,可是这一过程并不顺利,耽误了不少时间,所以我就把遇上的问题给记录下来,也许能帮到更多朋友。
1)文档选择
存在两份文档:最新的文档没有demo,而且测试提供的接口响应速度让人无法忍受;最后还是选了带有demo的文档,虽然最后更新时间为200X年
2)编码问题
易宝支付的接口使用的是GBK/GB2312编码,如果我们使用的是UTF8编码,就需要把字符串编码转成GBK,所以我们得给form表单添加一个属性,标识数据编码为gbk,代码如下:
<html> <head> <title>磨途歌-易宝支付</title> </head> <body onLoad='document.yeepay.submit();'> <form name='yeepay' action='{$reqURL_onLine}' method='post' accept-charset='gbk'> <input type='hidden' name='p0_Cmd' value='{$p0_Cmd}'> <input type='hidden' name='p1_MerId' value='{$p1_MerId}'> <input type='hidden' name='p2_Order' value='{$p2_Order}'> <input type='hidden' name='p3_Amt' value='{$p3_Amt}'> <input type='hidden' name='p4_Cur' value='{$p4_Cur}'> <input type='hidden' name='p5_Pid' value='{$p5_Pid}'> <input type='hidden' name='p6_Pcat' value='{$p6_Pcat}'> <input type='hidden' name='p7_Pdesc' value='{$p7_Pdesc}'> <input type='hidden' name='p8_Url' value='{$p8_Url}'> <input type='hidden' name='p9_SAF' value='{$p9_SAF}'> <input type='hidden' name='pa_MP' value='{$pa_MP}'> <input type='hidden' name='pd_FrpId' value='{$pd_FrpId}'> <input type='hidden' name='pr_NeedResponse' value='{$pr_NeedResponse}'> <input type='hidden' name='hmac' value='{$hmac}'> </form> </body> </html>
接下来的问题是,易宝支付返回的数据也是GBK的,我们看一下易宝支付提供的HmacMd5函数
function HmacMd5($data,$key) { // RFC 2104 HMAC implementation for php. // Creates an md5 HMAC. // Eliminates the need to install mhash to compute a HMAC // Hacked by Lance Rushing(NOTE: Hacked means written) //需要配置环境支持iconv,否则中文参数不能正常处理 $key = iconv("GB2312","UTF-8",$key); $data = iconv("GB2312","UTF-8",$data); $b = 64; // byte length for md5 if (strlen($key) > $b) { $key = pack("H*",md5($key)); } $key = str_pad($key, $b, chr(0x00)); $ipad = str_pad('', $b, chr(0x36)); $opad = str_pad('', $b, chr(0x5c)); $k_ipad = $key ^ $ipad ; $k_opad = $key ^ $opad; return md5($k_opad . pack("H*",md5($k_ipad . $data))); }
这里易宝支付假定用户全部使用的是GB2312编码,导致UTF8编码的网站无法直接使用demo提供的代码,所以我们也得做修改,以下只显示修改的部分代码:
function HmacMd5($data,$key,$true = false) { if($true) { $key = iconv("GB2312","UTF-8",$key); $data = iconv("GB2312","UTF-8",$data); }
再修改getCallbackHmacString函数:
//return HmacMd5($sbOld,MERCHANTKEY); return HmacMd5($sbOld,MERCHANTKEY,true);
接下来给大家分析一下为什么这么修改:
1)易宝支付demo默认处理的是GBK/GB2312编码的字符串
2)加密过程需要使用iconv函数,把GBK转码成UTF8
但是如果是UTF8编码的网站,字符串已经是UTF8了,执行操作2)就会出问题,导致生成的加密字符串有误。所以我们添加了一个if条件,来控制转码操作,默认不转码。
什么情况需要转码呢?我们先看一下哪些地方调用了HmacMd5函数:
1)getReqHmacString,在demo中,该函数基于网站提供的参数生成form表单中的hmac值,因为网站已经是UTF8编码了,所以不需要转码。
2)getCallbackHmacString,在demo中,该函数基于易宝支付接口返回的参数生成hmac值,因为易宝支付返回的是GBK编码的字符串,需要转码,所以就有了上边的修改。
3)易宝支付回调操作
充值成功后,易宝支付有两种类型的回调操作:
1)前端回调,浏览器能看到提示:支付成功,10秒后跳转到商家页面,或点此[直接跳转]
2)服务器回调:避免前端回调页面被意外关闭
这里主要说一下服务器回调。
为了防止被已知的恶意工具检测网站,就做了一些安全配置。例如使用nginx屏蔽掉一些请求,配置代码如下:
if ($http_user_agent ~ ApacheBench|WebBench|Java|Http_load|Wget) { return 403; }
通过测试,得出易宝支付使用的是JAVA程序执行的回调操作。所以上述nginx的配置就把易宝支付的服务器回调给屏蔽了,只好把Java给去掉
if ($http_user_agent ~ ApacheBench|WebBench|Http_load|Wget) { return 403; }
4)易宝支付,订单信息问题
易宝支付会把订单名称跟订单金额拼接在一起,生成新的订单信息,看起来这没什么问题。但是,如果订单金额有小数点的时候,问题就来了。例如:
1)订单名称:磨途歌服务器续费
2)订单金额:888.88(单位:元)
拼接后的字符串为:磨途歌服务器续费88888元
看到了吗,小数点不见了!
后来易宝支付的技术人员这么回复我:不好意思啊,,这个产品好多年了,,之前就是这样设计的
我不禁想问,有什么理由选择易宝支付呢?
我来说两句: