微信支付获取 prepay id 出现失败问题
微信支付获取 prepay id 出现失败问题
发布时间:2016-01-16 来源:查字典编辑
摘要:微信支付获取prepayid出现失败问题微信支付会要求先从微信服务器获取prepayid。我们开发完成后(语言是PHP,使用微信的支付SDK...

微信支付获取 prepay id 出现失败问题

微信支付会要求先从微信服务器获取 prepay id 。我们开发完成后(语言是PHP,使用微信的支付SDK,请求时使用curl),在测试环境的机器上,基本没有发现请求失败的情况,上线后,却发现经常出现错误,概率1/5甚至更高。开始没有深究原因,采用重试的方式,不过发现,只要失败了,重试也会失败。

记录下 curl 的错误是:errno:35, error: SSL Connect Error。

网上查相关资料,没有找到解决方案。联系微信技术支持,他们没有任何建议,觉得是我们的问题,让我们自己查。

在我们服务器上通过 tcpdump 抓包: tcpdump -i eth1 ip host 140.207.69.102 -w wxpay.cap ,对比成功和失败的包(使用wireshark分析):

成功的数据包:

微信支付获取 prepay id 出现失败问题1

失败的数据包:

微信支付获取 prepay id 出现失败问题2

可以看到,失败的时候,TCP 3次握手后马上进行4次挥手操作 没有任何内容交互,而且 close 是客户端(我们这边)发起的。

推论:与remote服务端应该无关,还没开始https内容部分的交换,应该是本地在进行某些工作的时候发现异常,close了连接(但程序如果让我写会考虑先本地工作结束后再connect,不清楚为什么先connect然后再获取本地资源)。

可以通过 strace curl -X POST https://api.mch.weixin.qq.com/pay/unifiedorder 查看整个系统调用过程,是先 connect,然后从 系统本地etc目录下加载一些CA相关文件。

也可以通过 curl -v -X POST https://api.mch.weixin.qq.com/pay/unifiedorder 查看相关信息。对于 PHP 中,可以设置:curl_setopt($ch, CURLOPT_VERBOSE, true) 。

失败时是类似这样的输出:

* About to connect() to api.mch.weixin.qq.com port 443 (#0)

* Trying 140.207.69.102… connected

* Connected to api.mch.weixin.qq.com (140.207.69.102) port 443 (#0)

* Initializing NSS with certpath: sql:/etc/pki/nssdb

* CAfile: /etc/pki/tls/certs/ca-bundle.crt

CApath: none

* NSS error -5990

* Closing connection #0

* SSL connect error

curl: (35) SSL connect error

成功时输出如下(省略了response):

* About to connect() to api.mch.weixin.qq.com port 443 (#0)

* Trying 140.207.69.102… connected

* Connected to api.mch.weixin.qq.com (140.207.69.102) port 443 (#0)

* Initializing NSS with certpath: sql:/etc/pki/nssdb

* CAfile: /etc/pki/tls/certs/ca-bundle.crt

CApath: none

* NSS: client certificate not found (nickname not specified)

* SSL connection using TLS_DHE_RSA_WITH_AES_256_CBC_SHA

* Server certificate:

* subject: CN=payapp.weixin.qq.com,OU=R&D,O=Tencent Technology (Shenzhen) Company Limited,L=shenzhen,ST=guangdong,C=CN

* start date: 4月 28 00:00:00 2015 GMT

* expire date: 4月 27 23:59:59 2016 GMT

* common name: payapp.weixin.qq.com

* issuer: CN=GeoTrust SSL CA – G2,O=GeoTrust Inc.,C=US

> POST /pay/unifiedorder HTTP/1.1

> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2

> Host: api.mch.weixin.qq.com

> Accept: */*

总结:

1、从现象:有些机器有问题,有些没有问题;有些概率大,有些概率小;可大体上推断,跟机器有关系,可能机器环境不一样导致的;

2、抓包分析原因,进一步确认不是服务端(微信支付)的问题;

3、根据错误描述在网络上寻求帮助;

4、学习 curl 相关选项的使用;strace 的使用;

相关介绍:微信支付

微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。微信支付以绑定银行卡的快捷支付为基础,向用户提供安全、快捷、高效的支付服务。

2014年9月26日,腾讯公司发布的腾讯手机管家5.1版本为微信支付打造了“手机管家软件锁”,在安全入口上独创了“微信支付加密”功能,大大提高微信支付的安全性。

用户只需在微信中关联一张银行卡,并完成身份认证,即可将装有微信app的智能手机变成一个全能钱包,之后即可购买合作商户的商品及服务,用户在支付时只需在自己的智能手机上输入密码,无需任何刷卡步骤即可完成支付,整个过程简便流畅。

目前微信支付已实现刷卡支付、扫码支付、公众号支付、APP支付,并提供企业红包、代金券、立减优惠等营销新工具,满足用户及商户的不同支付场景。

微信支付支持以下银行发卡的贷记卡:深圳发展银行、宁波银行。此外,微信支付还支持以下银行的借记卡及信用卡:招商银行、建设银行、光大银行、中信银行、农业银行、广发银行、平安银行、兴业银行、民生银行。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新php教程学习
热门php教程学习
编程开发子分类