import sheep from '@/sheep'; // #ifdef H5 import $wxsdk from '@/sheep/libs/sdk-h5-weixin'; // #endif import { getRootUrl } from '@/sheep/helper'; import PayOrderApi from '@/sheep/api/pay/order'; import { t } from '@/locale'; /** * 支付 * * @param {String} payment = ['wechat','alipay','wallet','mock'] - 支付方式 * @param {String} orderType = ['goods','recharge','groupon'] - 订单类型 * @param {String} id - 订单号 * @param {String} orderType2 = ['1','2'] - 中星订单类型,1商品 2消费分充值 */ export default class SheepPay { constructor(payment, orderType, id, orderType2) { this.payment = payment; this.id = id; this.orderType = orderType; this.orderType2 = orderType2; this.payAction(); } payAction() { const payAction = { WechatOfficialAccount: { wechat: () => { this.wechatOfficialAccountPay(); }, JSAPI:() => { this.fuYouWechatOfficialAccountPay(); }, alipay: () => { this.redirectPay(); // 现在公众号可以直接跳转支付宝页面 }, wallet: () => { this.walletPay(); }, mock: () => { this.mockPay(); }, wx_pub:() => { payAction.WechatOfficialAccount.wechat(); } }, WechatMiniProgram: { wechat: () => { this.wechatMiniProgramPay(); }, JSAPI:() => { this.fuYouWechatOfficialAccountPay(); }, alipay: () => { this.copyPayLink(); }, wallet: () => { this.walletPay(); }, mock: () => { this.mockPay(); }, wx_pub:() => { this.wechatMiniProgramPay(); } }, App: { wechat: () => { this.wechatAppPay(); }, JSAPI:() => { this.fuYouWechatOfficialAccountPay(); }, alipay: () => { this.alipay(); }, wallet: () => { this.walletPay(); }, mock: () => { this.mockPay(); } }, H5: { wechat: () => { this.wechatWapPay(); }, JSAPI:() => { this.fuYouWechatOfficialAccountPay(); }, alipay: () => { this.redirectPay(); }, wallet: () => { this.walletPay(); }, mock: () => { this.mockPay(); }, wx_pub:() => { payAction.WechatOfficialAccount.wechat(); } }, }; // console.log(payAction[sheep.$platform.name],this.payment) return payAction[sheep.$platform.name][this.payment](); } // 预支付 prepay(channel) { return new Promise(async (resolve, reject) => { let data = { id: this.id, channelCode: channel, channelExtras: {}, orderType:this.orderType2 }; // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid if (['wx_pub', 'wx_lite'].includes(channel)) { const openid = await sheep.$platform.useProvider('wechat').getOpenid(true); // 如果获取不到 openid,微信无法发起支付,此时需要引导 if (!openid) { this.bindWeixin(); return; } data.channelExtras.openid = openid; } // 发起预支付 API 调用 PayOrderApi.submitOrder(data).then((res) => { // 成功时 res.code === 0 && resolve(res); // 失败时 if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) { // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况 if (res.msg.indexOf('无效的openid') >= 0 // 获取的 openid 不正确时,或者随便输入了个 openid || res.msg.indexOf('下单账号与支付账号不一致') >= 0 ){ // https://developers.weixin.qq.com/community/develop/doc/00008c53c347804beec82aed051c00 this.bindWeixin(); } } }); }); } // 富友预支付 fuYouPrePay(channel) { return new Promise(async (resolve, reject) => { let data = { id: this.id, channelCode:channel, orderType:this.orderType2, req: { trade_type: channel, } }; // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid if (['wx_pub', 'wx_lite','JSAPI'].includes(channel)) { const openid = await sheep.$platform.useProvider('wechat').getOpenid(true); // 如果获取不到 openid,微信无法发起支付,此时需要引导 if (!openid) { this.bindWeixin(); return; } data.req.sub_openid = openid; } // console.log("富友支付",data) // 发起预支付 API 调用 PayOrderApi.fuYouSubmitOrder(data).then((res) => { // 成功时 res.code === 0 && resolve(res); // 失败时 if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) { // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况 if (res.msg.indexOf('无效的openid') >= 0 // 获取的 openid 不正确时,或者随便输入了个 openid || res.msg.indexOf('下单账号与支付账号不一致') >= 0 ) { // https://developers.weixin.qq.com/community/develop/doc/00008c53c347804beec82aed051c00 this.bindWeixin(); } } }); }); } // #ifdef H5 // 富友微信公众号 JSSDK 支付 async fuYouWechatOfficialAccountPay(orderType2) { // console.log("富友微信公众号 JSSDK 支付"); let { code, data } = await this.fuYouPrePay('JSAPI'); if (code !== 0) { return; } let newJsonString = data.replace(/"sdk_package":/g, '"packageValue":'); const payConfig = JSON.parse(newJsonString); // console.log('payConfig',payConfig); // return; $wxsdk.wxpay(payConfig, { success: () => { this.payResult('success'); }, cancel: () => { sheep.$helper.toast(t('common.payment_manually_cancelled')); }, fail: (error) => { if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) { sheep.$helper.toast('发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付'); return } this.payResult('fail'); }, }); } // 微信公众号 JSSDK 支付 async wechatOfficialAccountPay(orderType2) { let { code, data } = await this.prepay('wx_pub'); if (code !== 0) { return; } const payConfig = JSON.parse(data.displayContent); $wxsdk.wxpay(payConfig, { success: () => { this.payResult('success'); }, cancel: () => { sheep.$helper.toast(t('common.payment_manually_cancelled')); }, fail: (error) => { if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) { sheep.$helper.toast('发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付'); return } this.payResult('fail'); }, }); } // 浏览器微信 H5 支付 TODO 非繁人:待接入 async wechatWapPay() { const { error, data } = await this.prepay(); if (error === 0) { const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`; location.href = `${data.pay_data.h5_url}&redirect_url=${encodeURIComponent(redirect_url)}`; } } // 支付链接 TODO 非繁人:待接入 async redirectPay() { let { error, data } = await this.prepay(); if (error === 0) { const redirect_url = `${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`; location.href = data.pay_data + encodeURIComponent(redirect_url); } } // #endif // 微信小程序支付 async wechatMiniProgramPay() { // let that = this; let { code, data } = await this.prepay('wx_lite'); if (code !== 0) { return; } // 调用微信小程序支付 const payConfig = JSON.parse(data.displayContent); uni.requestPayment({ provider: 'wxpay', timeStamp: payConfig.timeStamp, nonceStr: payConfig.nonceStr, package: payConfig.packageValue, signType: payConfig.signType, paySign: payConfig.paySign, success: (res) => { this.payResult('success'); }, fail: (err) => { if (err.errMsg === 'requestPayment:fail cancel') { sheep.$helper.toast(t('common.payment_manually_cancelled')); } else { this.payResult('fail'); } }, }); } // 余额支付 async walletPay() { const { code } = await this.prepay('wallet'); code === 0 && this.payResult('success'); } // 模拟支付 async mockPay() { const { code } = await this.prepay('mock'); code === 0 && this.payResult('success'); } // 支付宝复制链接支付 TODO 非繁人:待接入 async copyPayLink() { let that = this; let { error, data } = await this.prepay(); if (error === 0) { // 引入showModal 点击确认 复制链接; uni.showModal({ title: t('common.alipay_payment'), content: t('common.copy_link_to_browser'), confirmText: t('common.copy_link'), success: (res) => { if (res.confirm) { sheep.$helper.copyText(data.pay_data); } }, }); } } // 支付宝支付 TODO 非繁人:待接入 async alipay() { let that = this; const { error, data } = await this.prepay(); if (error === 0) { uni.requestPayment({ provider: 'alipay', orderInfo: data.pay_data, //支付宝订单数据 success: (res) => { that.payResult('success'); }, fail: (err) => { if (err.errMsg === 'requestPayment:fail [paymentAlipay:62001]user cancel') { sheep.$helper.toast(t('common.payment_manually_cancelled')); } else { that.payResult('fail'); } }, }); } } // 微信支付 TODO 非繁人:待接入 async wechatAppPay() { let that = this; let { error, data } = await this.prepay(); if (error === 0) { uni.requestPayment({ provider: 'wxpay', orderInfo: data.pay_data, //微信订单数据(官方说是string。实测为object) success: (res) => { that.payResult('success'); }, fail: (err) => { err.errMsg !== 'requestPayment:fail cancel' && that.payResult('fail'); }, }); } } // 支付结果跳转,success:成功,fail:失败 payResult(resultType) { // console.log(this.id) sheep.$router.redirect('/pages/pay/resultYuan', { id: this.id, orderType: this.orderType, payState: resultType }); } // 引导绑定微信 bindWeixin() { uni.showModal({ title: t('common.wechat_payment'), content: t('common.bind_wechat_for_payment'), confirmText: t('common.bind'), success: function(res) { if (res.confirm) { sheep.$platform.useProvider('wechat').bind(); } }, }); } } export function getPayMethods(channels) { // console.log("来拿支付渠道",channels) let payMethods = [ { icon: '/static/images/wechat.png', title: t('common.wechat_payment'), value: 'wx_pub', disabled: false, }, { icon: '/static/images/wechat.png', title: t('common.wechat_payment'), value: 'JSAPI', disabled: false, }, { icon: '/static/images/alipay.png', title: t('common.alipay_payment'), value: 'alipay', disabled: false, }, { icon: '/static/images/wallet.png', title: t('common.balance_payment'), value: 'wallet', disabled: false, }, { icon: '/static/images/apple.png', title: 'Apple Pay', value: 'apple', disabled: false, }, { icon: '/static/images/wallet.png', title: t('common.mock_payment'), value: 'mock', disabled: false, } ]; const platform = sheep.$platform.name // 1. 处理【微信支付】 const wechatMethod = payMethods[0]; if ((platform === 'WechatOfficialAccount' && channels.includes('wx_pub')) || (platform === 'WechatMiniProgram' && channels.includes('wx_lite')) || (platform === 'App' && channels.includes('wx_app'))) { wechatMethod.disabled = false; } // 2. 处理【支付宝支付】 const alipayMethod = payMethods[1]; if ((platform === 'WechatOfficialAccount' && channels.includes('alipay_wap')) || platform === 'WechatMiniProgram' && channels.includes('alipay_wap') || platform === 'App' && channels.includes('alipay_app')) { alipayMethod.disabled = false; } // 3. 处理【余额支付】 const walletMethod = payMethods[2]; if (channels.includes('wallet')) { walletMethod.disabled = false; } // 4. 处理【苹果支付】TODO 非繁人:未来接入 // 5. 处理【模拟支付】 const mockMethod = payMethods[4]; if (channels.includes('mock')) { mockMethod.disabled = false; } function filterPayMethods(payMethods, channels) { for (let i = payMethods.length - 1; i >= 0; i--) { if (!channels.includes(payMethods[i].value)) { payMethods.splice(i, 1); } } } // 示例:channels 只包含 'wechat' 和 'alipay' filterPayMethods(payMethods,channels); console.log(payMethods) return payMethods; }