code换取微信openid_微信JSAPI支付

        最近接到新的需求,需要在公众号引入微信支付。之前微信支付方式使用过Native当面付以及H5支付。Native支付有两个弊端所在:

        其一,Navicat支付最终会生成一个微信端链接,格式为:weixin://xxx,我们微信直接访问链接没毛病成功打开支付界面,但是支付的时候就报错了:当前交易不支持点击消息链接发起。

83503cb3b61faedba5e408697741f270.png

        其二:将支付链接转化成二维码扫码支付。第二个弊端出现了,将图片保存到本地通过微信扫描本地二维码又报错了:不支持从相册中选择二维码。

        那H5支付有何弊端呢?H5支付在外部浏览器正常使用,会直接从外部浏览器跳转到微信完成支付。在H5项目中我们一直正常使用H5微信支付,接到公众号支付的时候第一反应直接使用H5支付,这样用户使用浏览器打开一样可以使用微信支付,但是当我们支付接入才发现H5支付的弊端:只能在外部浏览器使用H5支付,在微信内无法使用微信支付。所以这时候最合适的支付方式就是JSAPI支付了。

        因为没有接触过公众号开发,第一反应当然是先看看支付文档:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1

        直接根据文档进行开发,首先前往微信商户平台设置支付目录:

53b673b75071118cd4c9e83dd4a42c54.png

公众号需要设置授权域名:

c9cc5206fe9939b5b45087676effb2a5.png

接下来先看看JSAPI支付业务流程:6cffc1e365f30c10c70acfc3c72e1fc6.png

服务端其实就是创建订单,然后调用统一下单接口。这里我们看下统一下单接口文档:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

文档中有个参数openid,对于这个参数文档的解释是:trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。

所以我们可以整理出整体的逻辑:

1.前端跳转授权界面,用户授权成功获取到code后调接口换取用户openid。2.服务端保存用户预支付订单。3.服务端调用统一下单接口,然后将参数返回给客户端。4.客户端调起支付,支付成功执行支付回调。

前端跳往授权界面,跳转的参数要求我们可以看看:

7f7474031d26ec17a5ccf063790bcdd1.png

这里参数需要注意的就是redirect_uri参数,用户授权成功会跳转到redirect_uri,后面会拼接code参数。redirect_uri必须是我们刚才设置的公众号授权域名下的地址,并且需要经过urlEncode

524022441ce5dd95b8914092c4b83549.png

点击授权后,调用接口用code换取用户openid。贴下关键代码:

ca4fa3d26f00b2ac493ce5ca0e678640.png

通过本接口我们可以成功获取到用户的openid。我们可以测试下:

fdb8d23d6ddcba9473173204db29d5d1.png

可以看到用户openid成功获取。然后我们为用户创建预支付订单,这边只贴下关键代码:

13544b799c884aecb4e6dd97486f3225.png

商品数据保存成功,调用统一下单接口取得统一下单接口返回的参数信息:

c53ad53630d41719ea662c9635b07bc7.png

我们可以打印下返回的参数信息:

4801bb88c9847ab0a6f071eb6b1b6150.png

到这里只剩下最后一步客户端发起支付,我们看下微信内H5调起支付的文档:

04e5603eaefe2715a5f7e91c630b27f6.png

首先先按照签名加密规则将参数加密生成签名paySign。加密算法规则如下:

84a408496dd338ca1ee2e33c69226b0e.png

先实现下签名生成算法:

079b801936939264ce697445fbe939cb.png

在用户点击微信支付按钮的时候调用服务端接口创建预支付订单并且返回统一下单接口参数给客户端:

7af8c7b13086da1620d59f8fa101894e.png

然后客户端调起支付,WeixinJSBridge内置对象只会在微信浏览器内生效,所以在其他浏览器打开会报错。贴下关键代码:

1c22adeb647ed782a3f46b0c19be0b98.png

我们可以测试是否能调起支付界面:

caa9d64c637abaea76fee21571ad4362.png

当我们完成支付的时候,微信服务器会异步执行我们统一订单接口设置的回调方法,回调方法需要特别注意的是微信回调给微信端返回格式为xml格式:

478f2d3407415d1302e5875767779da5.png

当我们支付完成的同时,微信会给客户端返回get_brand_wcpay_request:ok,客户端可以直接在支付完成的时候跳转到指定的界面,到这里成功完成JSAPI支付:

1fba374e0b1eef6f300de6140f12ff2d.png

5003473386c4cafc1b9830610190caf4.png

推荐阅读

阿里云--获取短信验证码

NodeJS源码解析--Node如何处理HTTP请求

NodeJS  require()源码解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值