腾讯应用宝(道具直购模式)支付经验总结

本周主要在对接腾讯应用宝(道具直购模式)支付,期间遇到了几个大坑。现在以问答的形式总结如下,以免后来之人再纠结于相同问题。

一、配置支付通知地址为什么收不到腾讯服务器端发送来的支付通知?

在说明这个问题之前,必须明白对接腾讯应用宝(道具直购模式)支付,需要在腾讯后台配置一个腾讯云上的内网地址,并且通知地址必须使用9001端口。我公司服务器在腾讯云上很容易配置一个内网通知地址,不过配置之后测试多次都不能收到腾讯服务器端的支付通知。检查之后,确认网络正常,并且模拟一个支付通知,我方服务器可以接受和处理。多次和腾讯应用宝技术人员沟通之后,他们表示“可以通知到,不过你方服务器给他们返回0字节数据”。后面通过仿佛查看对方的开发文档和提供的错误日志,和大量网上查找资料,打算从“是否是对方使用了Https协议”和“假设已经收到数据了是不是我方服务器不能正常处理”。

将我们处理支付通知请求的tomcat容器,改造得能够同时处理Http和Https请求。按照网上文章(http://blog.csdn.net/lanwenbing/article/details/24741973)进行改造之后,我方服务器tomcat容器已经能够处理https请求了。再进行测试发现还是不行。使用命令sudo tcpdump  port  9001 -X 抓取监听端口数据包,之后看到如下数据。

        我方服务器端口收到的信息:

我方服务器回复的信息:


看到从端口的抓取的数据分析可知,端口确实返回了数据,我服务器却报404错误。现在只能怀疑为什么服务器收到数据却没有处理,仔细对比查发现腾讯服务器通知使用的HTTP/1.0(对比上图截图红框中内容)。在网上查找“HTTP1.1与HTTP1.0的比较”的文章,终于找到问题。


将tomcat的<Engine name="Catalina" defaultHost="处理支付请求的web站点">做一修改之后,问题解决,站点可以正常接收到腾讯服务器端发送的支付通知。


二、调用购买道具下单接口和服务器端支付通知的签名验证的时候都很容易报(sig error)签名错误怎么办?

调用购买道具下单接口报sig error错误,通常是你的参数值里面包含了一些特殊字符(比如空格、下划线等)。“(编码规则为:除了 0~9 a~z A~Z !*() 之外其他字符按其ASCII码的十六进制加%进行表示,例如“-”编码为“%2D”)”这是文档中着重强调的,但是使用的时候要注意接口传递的参数值和加密生sig的源字符串之间的区别,一定要统一和前后一致(我在尝试的时候,经常sig源字符串按照文档处理了,但是接口传递的参数值没有做一致性处理,导致一致sig error错误)。还要一个地方也要强调一下,因为sig是使用的HmacSHA1加密之后Base64之后的值,所以里面可能会出现"+",但是我们tomcat接收到参数值里面的“+”会自动把它转化为空格。所以为了避免这种情况下的验签失败,请比较之前先将这个字符替换一下。


参考文献:

1.http://blog.csdn.net/lanwenbing/article/details/24741973 将tomcat改造成支持Http和Https请求;

2.http://blog.csdn.net/woshixuye/article/details/18862361 HTTP1.1与HTTP1.0的比较;

3.http://open.qq.com/tools?,检查工具计算出的   腾讯官方加密工具;

4.http://blog.csdn.net/zzw182100/article/details/44199679 ASCII码与16进制转化对照表;

5.http://wiki.open.qq.com/wiki/回调发货URL的协议说明_V3  。



猜你喜欢

转载自blog.csdn.net/tongdao/article/details/48346583
今日推荐