网站接入易宝支付遇上的问题

[文章作者:磨延城 转载请注明原文出处: 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秒后跳转到商家页面,或点此[直接跳转]

QQ截图20150605094352_副本.jpg

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元

看到了吗,小数点不见了!

后来易宝支付的技术人员这么回复我:不好意思啊,,这个产品好多年了,,之前就是这样设计的

QQ图片20150613142456.png

我不禁想问,有什么理由选择易宝支付呢?

    评论:

    1. 撒哈拉的小猫 回复2015年06月16日 20时54分
      磨者
      新版的京东钱包挺好用的啊、。。。
      以前做过全民付的支付也很坑,各种阴招,得使用*.php的才能获取到异步回调

    2. Yee 回复2016年01月12日 10时59分
      磨者
      表单里面只有商品名称、商品种类、商品描述、商户扩展信息4个字段需要转码。
      但是在使用icnov时出现"诺"之类的乱码,不知道博主有没有遇到这样的情况?

    3. 我来说两句:

        切换  

      磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

        切换  

      磨途歌随机验证码