本文示例基于 uniapp 的 uni.requestPayment() 微信支付拉起方法封装及调用示例:
方法封装
注:方法为 vue3 hooks 写法 可直接复制使用,但要注意传入的 data 参数中的各字段名,结合各自拉起支付时后端返回的参数字段做相应修改。
/*** 吊起微信支付* @param {Object} data 支付参数对象至少包含:timeStamp,nonceStr,package,signType,paySign* @param {String} successTip 支付成功后的提示文本,默认:支付成功* @param {String} failTip 支付失败 后的提示文本,默认:支付未完成*/
export function wxPay(data, successTip = '支付成功', failTip = '支付未完成') {return new Promise((resolve, reject) => {// 这里校验这5个参数是因为这个api拉起微信支付这5个参数是必填的,如果要拉起其他小程序的支付则不一定必须这5个if(!data?.timeStamp || !data?.nonceStr || !data?.package || !data?.signType || !data?.paySign) return resolve(false)uni.requestPayment({provider: 'wxpay',timeStamp: data.timeStamp,nonceStr: data.nonceStr,package: data.package,signType: data.signType,paySign: data.paySign,success(result) {uni.showToast({icon: 'success',title: successTip})resolve(true)},fail(e) {uni.$u.toast(failTip)resolve(false)}})})
}
调用示例
注:wxPay 方法会返回一个 Promise 所以可以使用 .then() 来获取支付结果,由上面方法可知,.then() 中会返回一个表示支付是否成功的 boolean 值。
// ...这里的 buyVip 为调用后端接口的 api 它会返回拉起微信支付所需参数
const res = await buyVip(params)
if (res.code == 200) {wxPay(res.data, '会员服务已开通').then(isPay => {if (isPay) { // 支付成功时 isPay 为 truegetUserDataDetail().then(data => {if (data.code === 200) {store.setUserInfo(data.data)}})}})
}