欢迎大家来到IT世界,在知识的湖畔探索吧!
前两天给商城加了个微信支付(非H5支付,相当于微信公众号网页支付)。。
真是一言难尽啊,我只能说菜是原罪!再次流下了没技术的眼泪!
总结一下,大概分为7个步骤~
第一步:用户触发微信支付事件时。
我们大概需要判断一下它是不是用微信客户端打开的,如果不是,提醒用户用微信客户端打开。
try {
WeixinJSBridge && this.weChatPayOrderId() // 调用后续步骤
} catch (e) {
this.close() // 关闭模态框
this.$toast('请在微信客户端打开')
}
欢迎大家来到IT世界,在知识的湖畔探索吧!
第二步:拿到订单ID
当用户触发支付按钮时,我们把这个商品的订单信息(商品数量,商品价格,支付方式之类的,后端会告诉你需要什么的)传递给后端,拿到后端返回的订单主键。
欢迎大家来到IT世界,在知识的湖畔探索吧! // 微信支付第二步,拿到订单编号
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()
}
})
},
当我们拿到订单主键之后,我们就可以开展后续操作,前往微信给的页面拿到 code。
// 微信支付第三步,前往微信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是微信给你们公众号的。
当我们执行完第三步之后,微信那边会瞬间重定向回来,重定向的地址即为你页面设置的地址,比如我设置的为当前页面:
微信支付第四步,拿到微信那边返回的code
因为微信那边是瞬间重定向回来的,这时候它会携带code重定向回来,所有我们需要在页面加载完之后就解析一下url路径中有没有code,如果有,则说明这个页面是微信那边重定向回来的,它是微信支付页面,没有则说明这是一个用户正常进入的页面。
解析方式:
欢迎大家来到IT世界,在知识的湖畔探索吧! // 微信支付第四步,拿到具体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
},
这个函数会返回一个code(可以直接复制粘贴)
所以我们会解析url路径之后,我们只需要在页面进入之后执行一下这个函数,看看是不是微信那边重定向回来的,如果是,则进入第五步。
微信支付第五步,code换openid
后端需要 code 字段才可以请求微信那边的接口,拿到用户在该公众号的唯一标识,当然啦,这些都不是我们操心的,我们只需要把 code 传给后端,拿到它给的 openid 就可以啦。
// 微信支付第五步,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)
})
},
拿到的信息大概是这样的。
对,没错,你如果能直接拿到这些信息可以直接调用微信支付(不过一般来说还是要一直步骤的,起码openid跑不了),拿到这些,我们就可以把它传到微信,调微信的支付接口了。
传递微信支付参数列表,获取微信支付回调
嗯,官方文档是这样的:
哇塞,看起来超简单,复制粘贴一把梭:
WeixinJSBridge.invoke('getBrandWCPayRequest', wechatObj, function (res) {
this.$router.push({
name: 'total-order-index',
query: {
orderType: 1
}
})
})
但是有坑啊!!!!我每次按官方文档调用的时候,它是偶尔可以调用成功,偶尔失败,嗯~,上周日还特意加班过来搞这个,网上查说是后端的原因~,总之就是各种不顺利(微信支付没法在开发者工具调试),后来实在没招了,在外面包裹了一个定时器!!!我靠我靠,可以啦~真是的,花里胡哨的!
我一直以为它这个回调是支付成功之后的回调,所有无关异步,可是加了延迟直接就可以确是不争的时候~有点懵,不知道它内部怎么实现的。
相比之下,支付宝支付就简单太多了,阿里还是那个阿里
嗯~,这只是我自己的实现步骤,不代表其它的就不行昂~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17581.html