code换取微信openid_微信支付JSAPI攻略

前两天给商城加了个微信支付(非H5支付,相当于微信公众号网页支付)。。

真是一言难尽啊,我只能说菜是原罪!再次流下了没技术的眼泪!

总结一下,大概分为7个步骤~

第一步:用户触发微信支付事件时。

99bb2daa7b9ff736a6a2d59e896f23ae.png

我们大概需要判断一下它是不是用微信客户端打开的,如果不是,提醒用户用微信客户端打开。

 try { WeixinJSBridge && this.weChatPayOrderId() // 调用后续步骤 } catch (e) { this.close() // 关闭模态框 this.$toast('请在微信客户端打开') }
627356dbd893ea6757fea94b429e1cc9.png

第二步:拿到订单ID

当用户触发支付按钮时,我们把这个商品的订单信息(商品数量,商品价格,支付方式之类的,后端会告诉你需要什么的)传递给后端,拿到后端返回的订单主键。

 // 微信支付第二步,拿到订单编号 weChatPayOrderId () { let obj = this.orderData() obj.payType = 21 // 微信支付为 21 addOrder(obj).then(res => { if (res.status === 0) { this.$toast(res.msg) this.close() } else { // 获取orderId,第六步时候需要用// alert(`第二步骤获取orderId:${res.content}`) Cookies.set('orderId', res.content) // 微信支付第三步,前往微信code获取页面 this.getWechatCodeCallback() } }) },
caab4b512541072bbdb1f943c4a09e14.png

当我们拿到订单主键之后,我们就可以开展后续操作,前往微信给的页面拿到 code。

2e0e48ee8b24790e7f9ee185894ac473.png
 // 微信支付第三步,前往微信code获取页面 getWechatCodeCallback () { let pageUrl = window.location.href .replace(/[/]/g, '%2f') .replace(/[:]/g, '%3a') .replace(/[#]/g, '%23') .replace(/[&]/g, '%26') .replace(/[=]/g, '%3d') window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri=' + pageUrl + '&response_type=code&scope=snsapi_userinfo#wechat_redirect' },

这一步大家可以直接复制粘贴,但是需要把 appid 换一下,appid是微信给你们公众号的。

f3a9db22a0a559ce4d4ed8abbd4fe3d0.png

当我们执行完第三步之后,微信那边会瞬间重定向回来,重定向的地址即为你页面设置的地址,比如我设置的为当前页面:

974cae213d47599b45d917daba32333f.png

微信支付第四步,拿到微信那边返回的code

因为微信那边是瞬间重定向回来的,这时候它会携带code重定向回来,所有我们需要在页面加载完之后就解析一下url路径中有没有code,如果有,则说明这个页面是微信那边重定向回来的,它是微信支付页面,没有则说明这是一个用户正常进入的页面。

解析方式:

 // 微信支付第四步,拿到具体code getWechatCode () { function parse_url (url) { // 定义函数 var pattern = /(w+)=(w+)/gi // 定义正则表达式 var parames = {} // 定义数组 url.replace(pattern, function (a, b, c) { parames[b] = c }) return parames // 返回这个数组. } // 获取当前url 取到code let url = window.location.href let params = parse_url(url) return params.code },
eaf580225b68142f89ec2d91a778e25e.png

这个函数会返回一个code(可以直接复制粘贴)

所以我们会解析url路径之后,我们只需要在页面进入之后执行一下这个函数,看看是不是微信那边重定向回来的,如果是,则进入第五步。

a01b060dddd273382b3b94b6ff1f2d23.png

微信支付第五步,code换openid

后端需要 code 字段才可以请求微信那边的接口,拿到用户在该公众号的唯一标识,当然啦,这些都不是我们操心的,我们只需要把 code 传给后端,拿到它给的 openid 就可以啦。

968262bb9e64f751393745c540a0c059.png
 // 微信支付第五步,code换openid getOpenid (code) { getOpenid({ code }).then(res => { // alert(`微信支付第五步code换openid后端返回的参数:${JSON.stringify(res)}`) if (res.status === 0) return this.$toast(res.msg) let openid = res.content.openid// 调用支付第六步 this.callWeChat(openid) }) },

如果请求成功,则此刻我们已经拿到openid,调用第六步即可。

微信支付第六步,openid加orderId调取支付接口

反正我们后端是让我拿 openid(用户唯一标识)和orderid(该订单主键)来获取调用微信支付的相关信息,之前前面的几步就是为了拿到那些信息。

 // 微信支付第六步,openid加订单主键调取支付接口 callWeChat (openid) { getWechatPay({ orderId: Cookies.get('orderId'), openid }).then(res => { // alert(`微信支付第五步openid加orderId调取支付接口后端返回参数: ${JSON.stringify(res)}`) if (res.status === 0) return this.$toast(res.msg) this.wechatObj = res.content this.onBridgeReady(this.wechatObj) }) },
a6bd003d65c3762057066f0c5faaf44e.png

拿到的信息大概是这样的。

793b473dc9fdd8eacd505a76ea6ee564.png

对,没错,你如果能直接拿到这些信息可以直接调用微信支付(不过一般来说还是要一直步骤的,起码openid跑不了),拿到这些,我们就可以把它传到微信,调微信的支付接口了。

传递微信支付参数列表,获取微信支付回调

嗯,官方文档是这样的:

1f0c3d637369b033cbaac5c5e0648583.png

哇塞,看起来超简单,复制粘贴一把梭:

WeixinJSBridge.invoke('getBrandWCPayRequest', wechatObj, function (res) {this.$router.push({name: 'total-order-index',query: {orderType: 1}})})
2db645a0f6312e7d8687d4c32ccf0fa8.png

但是有坑啊!!!!我每次按官方文档调用的时候,它是偶尔可以调用成功,偶尔失败,嗯~,上周日还特意加班过来搞这个,网上查说是后端的原因~,总之就是各种不顺利(微信支付没法在开发者工具调试),后来实在没招了,在外面包裹了一个定时器!!!我靠我靠,可以啦~真是的,花里胡哨的!

ae65c12c31978e43c9f09faa182c83e4.png
e249e0196d51064966711a4e06173f64.png

我一直以为它这个回调是支付成功之后的回调,所有无关异步,可是加了延迟直接就可以确是不争的时候~有点懵,不知道它内部怎么实现的。

相比之下,支付宝支付就简单太多了,阿里还是那个阿里

f997e022495a54137b9d2d859edf468f.png

嗯~,这只是我自己的实现步骤,不代表其它的就不行昂~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值