You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pifa/core/payment/wechat.js

181 lines
4.7 KiB

5 months ago
import platform from '@/core/platform'
import storage from '@/utils/storage'
import ClientEnum from '@/common/enum/Client'
import { PayMethodEnum } from '@/common/enum/payment'
/**
* 发起支付请求 (用于微信小程序)
* @param {Object} option 参数
*/
const paymentAsWxMp = option => {
const options = {
timeStamp: '',
nonceStr: '',
package: '',
signType: '',
paySign: '',
...option
}
return new Promise((resolve, reject) => {
uni.requestPayment({
provider: 'wxpay',
timeStamp: options.timeStamp,
nonceStr: options.nonceStr,
package: options.package,
signType: options.signType,
paySign: options.paySign,
success(res) {
const option = {
isRequireQuery: true, // 是否需要主动查单
outTradeNo: options.out_trade_no, // 交易订单号
method: 'wechat'
}
resolve({ res, option })
},
fail: res => reject(res)
})
})
}
/**
* 发起支付请求 (用于H5)
* @param {Object} option 参数
*/
const paymentAsH5 = option => {
const options = { orderKey: null, mweb_url: '', h5_url: '', ...option }
// 记录下单的信息
storage.set('tempUnifyData_' + options.orderKey, {
method: PayMethodEnum.WECHAT.value,
outTradeNo: options.out_trade_no
}, 60 * 60)
// 跳转到微信支付页
return new Promise((resolve, reject) => {
const url = options.mweb_url || options.h5_url
if (url) {
window.location.href = url
}
})
}
/**
* 发起支付请求 (用于微信公众号)
* @param {Object} option 参数
*/
const paymentAsOfficial = option => {
const options = {
appId: '',
timeStamp: '',
nonceStr: '',
package: '',
signType: '',
paySign: '',
...option
}
return onBridgeReady(options)
if (platform === ClientEnum.WXOFFICIAL.value) {
if (typeof WeixinJSBridge != 'undefined') {
return onBridgeReady(options)
}
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', () => onBridgeReady(options), false)
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', () => onBridgeReady(options))
document.attachEvent('onWeixinJSBridgeReady', () => onBridgeReady(options))
}
}
return new Promise((resolve, reject) => {
reject({ message: '当前不支持WeixinJSBridge11' })
})
}
/**
* 发起支付请求 (用于APP)
* @param {Object} option 参数
*/
const paymentAsApp = options => {
return new Promise((resolve, reject) => {
uni.requestPayment({
provider: 'wxpay',
orderInfo: {
partnerid: options.partnerid,
appid: options.appid,
package: 'Sign=WXPay',
noncestr: options.noncestr,
sign: options.sign,
prepayid: options.prepayid,
timestamp: options.timestamp
},
success(res) {
// isRequireQuery 是否需要主动查单
// outTradeNo 交易订单号
resolve({ res, option: { isRequireQuery: true, outTradeNo: options.out_trade_no, method: 'wechat' } })
},
fail: res => reject(res)
})
})
}
// 微信公众号调用微信支付
// #ifdef H5
const onBridgeReady = (options) => {
return new Promise((resolve, reject) => {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
appId: options.appId,
timeStamp: options.timeStamp,
nonceStr: options.nonceStr,
package: options.package,
signType: options.signType,
paySign: options.paySign,
},
res => {
if (res.err_msg == "get_brand_wcpay_request:ok") {
const option = {
isRequireQuery: true, // 是否需要主动查单
outTradeNo: options.out_trade_no, // 交易订单号
method: 'wechat'
}
resolve({ res, option })
} else {
reject(res)
}
})
})
}
// #endif
/**
* 统一下单API
*/
export const payment = (option) => {
const events = {
[ClientEnum.H5.value]: paymentAsH5,
[ClientEnum.MP_WEIXIN.value]: paymentAsWxMp,
[ClientEnum.WXOFFICIAL.value]: paymentAsOfficial,
[ClientEnum.APP.value]: paymentAsApp
}
return events[platform](option)
}
/**
* 统一下单API需要的扩展数据
*/
export const extraAsUnify = () => {
return {}
}
// H5端微信支付下单时的数据
// 用于从微信支付页返回到收银台页面后拿到下单数据
// #ifdef H5
export const performance = (orderKey) => {
if (window.performance && window.performance.navigation.type == 2) {
const tempUnifyData = storage.get('tempUnifyData_' + orderKey)
if (tempUnifyData) {
storage.remove('tempUnifyData_' + orderKey)
return tempUnifyData
}
}
return null
}
// #endif