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

因为工作的需要,就接触了易宝支付。本以为根据易宝支付提供的demo跟文档就能快速的完成接入工作,可是这一过程并不顺利,耽误了不少时间,所以我就把遇上的问题给记录下来,也许能帮到更多朋友。

1)文档选择

存在两份文档:最新的文档没有demo,而且测试提供的接口响应速度让人无法忍受;最后还是选了带有demo的文档,虽然最后更新时间为200X年

2)编码问题

易宝支付的接口使用的是GBK/GB2312编码,如果我们使用的是UTF8编码,就需要把字符串编码转成GBK,所以我们得给form表单添加一个属性,标识数据编码为gbk,代码如下:

磨途歌-易宝支付

接下来的问题是,易宝支付返回的数据也是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秒后跳转到商家页面,或点此[直接跳转]

94ea3407ca7b4f4c4e567201d7b3a677.gif

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元

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

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

94ea3407ca7b4f4c4e567201d7b3a677.gif

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

1.文件列表说明 |-----------YeePayCommon.php(共通函数文件,不需要进行任何修改) |-----------merchantProperties.php(商家属性文件,商家可以在此文件中修改商家的ID和密钥和支付返回地址等信息) |-----------req.php (支付请求文件,通过此文件发起支付请求,商家可以在此文件中写入自己的订单信息等,然后把请求提交给易宝支付) |-----------callback.php(支付结果返回文件,通过此文件商家判断对应订单的支付成功状态,并且根据结果修改自己数据库中的订单状态) |-----------QueryOrder.php (易宝支付查询接口主程序) |-----------HttpClient.class.php (共通函数文件,用于服务器通讯) 2.商家测试可以先用易宝支付的测试商家测试成功再在merchantProperties.php文件中修改成自己的商家ID和密钥信息 $p1_MerId = "10001126856"; $merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; 商家ID和密钥需要同时修改才有效 3.支付成功的返回URL请在merchantProperties.php文件中进行修改 $merchantCallbackURL = "http://localhost/callback.php"; 商家正式运行时,必须把自己的服务器部署在公网上的服务器上,这样支付成功后易宝支付的服务器才能支付结果及时返回给商家 为了商家技术工程师开发的方便,如果测试服务器在工程师自己的服务器上,可以把URL设定为localhost的方式,浏览器可以正式返回。 4.共通文件采用服务器包含的方式进行处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值