关于微信H5公众号支付咱们踩过的坑(get_brand_wcpay_request:fail)

最近公司有了一个新的需求,学生在购买课时的时候,须要让家长或者朋友代付。这样的话我首先想到的就是微信的H5支付(微信内置浏览器调用支付模块)。当时想用这个支付的缘由由于是前端代码十分简单。。 
然而偏偏是由于本身选择了这个方法,让本身连续两天陷入了困境。 
下面是正文跟代码截图 
首先我们先来看下H5的支付文档说明 php


微信官方的H5支付文档
我们新手或者写过微信支付的童鞋都不难看懂 其实十分简单,须要的入参跟说明一目了然。可是H5支付的大前提很重要,就是须要用户的openid,否则你在调用微信统一下单的时候(其中交易类型:trade_type = JSAPI)它们会返回你说确实openid这个参数。问题是这个参数咱们从哪来呢? 
我直接搜一些资料贴给你们; 
据我所知目前有两个方式: 
1.微信OAuth网页受权。服务号(订阅号不行)能够在公众号后台开通微信OAuth网页受权,用户在网页中进行受权操做时你会获得用户的openid 
2.接入服务器。微信容许接入服务器进行开发,配置好接入服务器(参考微信的开发文档)后,用户发给公众号的消息所有会以一个xml表单的形式被转发到你的服务器上。 
我使用的是第一种方式,其实很简单,你们能够参考微信的demo微信H5demo 
其中参考example/WxPay.JsApiPay.php里面的GetOpenid方法。 
这样获取到openid再去调用统一下单接口就没问题,若是再有其余问题,能够打日志看微信返回错误,通常这个地方的返回错误比较明显,很容易查到缘由。最坑也是最泪崩的是之后的错误类型。 
咱们看到咱们调用统一接口成功以后会返现微信返回的结果里面有这些东西 前端


统一下单以后咱们拿到的东西 


从结果里面咱们不难看出调用微信支付的demo里面要的几个参数咱们所有有了,包括sign签名(这是一个坑)。这样的话 咱们只须要把这些参数返回给客户端直接组合数据应该就能成功了。 
此时咱们把数据返回给客户端 ,客户端组合数据以下 浏览器


前端代码

咱们测试以后发现。微信返回的是支付签名验证失败,通常通用错误类型会返回get_brand_wcpay_request:fail。这个时候 我又去看了一下文档,那个时间戳是十位,js这种方法是13位精确到毫秒的,因而我切割字符串,得到十位时间戳,这个时候再去测试仍然跟上次错误同样。因而我慢慢的冷静下来。开始在网上疯狂查资料。查找问题在哪?网上的答案通常是支付受权目录的问题,其实这个我早就设置好了的。没有问题的。因而我又一遍的啃起了他的官方文档,结合他们的demo从新理了一遍思路。原来文档里面几个参数中只有package这个参数会用统一下单返回的数据,真是中国文化博大精深啊,玩文字游戏啊。 
因而我猜测那么统一接口返回的sign也不能用楼。难不成所谓的sign是统一下单返回的结果从新用md5去生成么? 
我只能去测试验证个人结论了。很少说,贴代码 服务器


 


这组代码是我从统一订单返回结果以后 按照文档的说明,(大小写别写错),从新生成了sign,而后返回客户端,包括时间戳也返回。这样的话再去测试,它不会再报get_brand_wcpay_request:fail。它会给我报了另一个错误,提示我说当前页面为注册,同时弹了url出来(这一步,若是童鞋在公众号设置。微信支付-》支付受权目录)填写过的话,应该就没其余问题了。能够忽略。 
基本上H5内置浏览器调用微信支付模块就是这些东西。主要的坑在于签名。微信返回的错误类型是最坑爹的,全是通用的,根本不能快速定位。 微信

源码免费下载地址:http://www.jinhusns.com/Products/Download测试

相关文章
相关标签/搜索