在vue中获取微信支付code及code被占用问题的解决?

这个地方坑比较多,查看网上并没有详细的文档,新手一般写到这里很痛苦。这里我只介绍一下我解决的方案,虽然它不是最好的,但是可行的方案;

总体分两步
1)跳到微信支付链接,它会自动拼接上code
2)获取本网址,截取code;

在vue中哪里获取code?

在路由钩子函数beforeEach获取。(如果想了解beforeEach的用法,请关注我下一篇博客)。
1329237-20181227140033798-1389799940.png
我们去请求微信网址"https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +appid +"&redirect_uri=" + spa +
"&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
它会自动带上code ,我们在去截取到code,把code 传给后端,后端便可以拿到opinid.
如果是微信登录,我们会去请求后台验证接口验证是否登录,拿到登录返回信息,保存本地或者vuex;
如果是微信支付,我们同样去请求后台接口,此时code可能提示被占用,我们需要在beforeEach 中重新获取一遍code,官方文档说code 五分钟变化一次;
1329237-20181227141501535-1104125829.png
如果没有if条件的判断,它会反复跳正在登录中(包括登录的code获取也是,谁知道请留言告知一下),window.localStorage.getItem('realCode') 是定义在支付页面。
这样拿到code整个流程就通了。但是我们去获取code后,有时会用手机返回键,它又会跳到微信获取code的那个网址,这样就很烦了,只好在mounted钩子函数监听物理返回键,跳到指定的页面;虽然问题暂时解决了,但是体验感觉不是很好,有种闪屏的感觉;

其中遇到的坑有:支付一闪而过

1)原因找了很多,像目录是否配置正确,如:http://element.eleme.io/#/zh-CN/component/button 需写成http://element.eleme.io/#/zh-CN/component/
2) 签名错误 这个没办法了。是后台的方法写错了,排查了好久;

还有一个坑就是请求网址的转义问题:

redirect_uri 回调地址中需要把特殊符号转义掉,如果实在不知道可以百度在线转义,把网址复制进去就可以了;
redirect_uri的前缀http://不能省略

response_type=code (请求带回来的code)
scope=snsapi_base snsapi_base只能获取access_token和openID (静默授权); snsapi_userinfo可以获取更详细的用户资料,比如头像、昵称、性别等(需要点击授权)
state=123 (随便填)

转载于:https://www.cnblogs.com/panax/p/10184986.html

Vue.js 2.x集成微信支付,你需要先安装一些相关的npm包,例如 `vue-element-wxapi` 或 `vue-wechat-pay`。以下是基本步骤: 1. **安装依赖**: ```bash npm install vue-element-wxapi ``` 2. **引入并注册插件**: 在main.js或其他全局文件,注册微信支付插件: ```javascript import VueWechatPay from 'vue-element-wxapi'; Vue.use(VueWechatPay); ``` 3. **初始化配置**: 需要在组件设置公众号AppID、商户号、公众平台证书路径等信息: ```javascript const app = new Vue({ el: '#app', data: { wxConfig: { appId: 'your_app_id', timestamp: '', nonceStr: '', signature: '', jsApiList: ['getJsApi', 'chooseWXPay'] } }, mounted() { this.initWxConfig(); }, methods: { async initWxConfig() { // 获取支付所需的配置数据,这部分通常由后台提供 const res = await axios.get('your_payment_config_api'); if (res.data.code === 0) { this.wxConfig = res.data.data; WechatPay.config(this.wxConfig); } else { console.error(res.data.message); } } } }); ``` 4. **调用微信支付功能**: 使用`WechatPay.createOrder`创建订单,`WechatPay.pay`发起支付请求: ```javascript createOrder(orderData) { return WechatPay.createOrder(orderData).then((result) => { // 打印预支付交易会话标识 console.log(result.prepayId); // 跳转到微信支付页面 window.location.href = result.url; }); }, async pay(prepayId) { try { const result = await WechatPay.checkJsApi(); // 检查JSAPI是否可用 if (result.verifyResult) { await WechatPay.pay({ _prepayId, }); } else { alert('缺少必要的JSAPI'); } } catch (error) { console.error(error); } } ``` 5. **处理回调**: 微信支付完成之后,用户会被重定向回应用,这时需要处理返回的code或者notify_url(通知地址)以处理支付结果。 注意:以上示例简化了一些细节,实际项目可能需要处理更多边缘情况和安全性问题。同时,微信支付官方文档是最佳参考资料,务必查阅其最新指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值