判断是否微信环境
isWechatBrowser() {
let status = navigator.userAgent.toLowerCase()
return (status.match(/MicroMessenger/i) == "micromessenger")
},
获取code
getCodeUrl() {
const APPID = 'xxxxxxxxxxxxx'
const REDIRECT_URI = encodeURIComponent('https://xxxxx')
const SCOPE = 'snsapi_base'
var url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=` + APPID +
`&redirect_uri=` + REDIRECT_URI + `&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect`
return url
},
获取网页地址中的参数
getUrlParam(name) {
return this.getParam(window.location.href, name)
},
getParam(url, name) {
url = url.substr(url.indexOf("?"))
const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i")
const r = url.substr(1).match(reg)
if (r != null) {
return decodeURIComponent(r[2]).replace("#", "")
}
return ""
},
获取openid完整逻辑
getOpenid() {
return new Promise((resolve, reject) => {
let openid = this.getOpenid()
if (openid) {
logger.debug('从缓存获得openid', openid)
resolve(openid)
return
} else {
logger.info('开始获取openid')
if (this.isWechatBrowser()) {
let code = this.getUrlParam('code')
if (code) {
logger.info('获取到code', code)
http.getOpenid({
code: code,
appId: 'xxxxxxxxxxxxx'
})
.then(r => {
logger.debug('从服务器获得openid', r)
this.setOpenid(r.data)
resolve(r.data)
})
.catch(e => {
logger.error('获取openid错误', e)
window.location.href = this.getCodeUrl()
})
} else {
window.location.href = this.getCodeUrl()
}
} else {
logger.warn('非微信环境,无法获取openid')
}
}
})
},
调用微信支付(pay.js)
preOrder(options, resolve, reject) {
http.preOrder(options)
.then(r => {
resolve(r)
})
.catch(r => {
reject(r)
})
},
jsPay(openid, orderNo, price, resolve, reject) {
http.createJsOrder({
orderNo: orderNo,
openid: openid,
price: price,
appId: common.config().mpAppId
})
.then(r => {
logger.warn('WeixinJSBridge拉起支付', r)
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": r.data.appId,
"timeStamp": r.data.timeStamp,
"nonceStr": r.data.nonceStr,
"package": r.data.packageVal,
"signType": r.data.signType,
"paySign": r.data.paySign,
}, r => {
if (r.err_msg === "get_brand_wcpay_request:ok") {
logger.info('WeixinJSBridge支付成功', r)
resolve(r)
} else {
logger.error('WeixinJSBridge支付失败', r)
reject(r)
}
})
})
.catch(e => {
logger.error('createJsOrder支付异常', e)
reject(e)
})
},
调用微信支付(vue)
preOrder(callback, failed) {
let params = {
}
pay.preOrder(params, r => {
logger.info('预下单', r)
this.yu_data = r.data
if (callback != null) callback()
}, e => {
if (failed != null) failed(e)
})
},
this.preOrder(() => {
var getData = this.yu_data
this.$http.action({
message: '重新进行预下单生成新的单号成功H5'
})
pay.jsPay(common.getOpenid(), this.yu_data.orderNo, this.yu_data.price,
r => {
console.log('拉起支付成功', r)
}, e => {
console.log('拉起支付失败', e)
})
}, (e) => {
console.log('预下单失败', e)
})
return