mall-uniapp/sheep/platform/pay.js

367 lines
10 KiB
JavaScript
Raw Normal View History

2023-12-13 03:35:02 +00:00
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';
2023-12-13 03:35:02 +00:00
/**
* 支付
*
2023-12-19 15:10:50 +00:00
* @param {String} payment = ['wechat','alipay','wallet','mock'] - 支付方式
2023-12-13 03:35:02 +00:00
* @param {String} orderType = ['goods','recharge','groupon'] - 订单类型
* @param {String} id - 订单号
2023-12-13 03:35:02 +00:00
*/
export default class SheepPay {
constructor(payment, orderType, id) {
2023-12-13 03:35:02 +00:00
this.payment = payment;
this.id = id;
2023-12-13 03:35:02 +00:00
this.orderType = orderType;
this.payAction();
}
payAction() {
const payAction = {
WechatOfficialAccount: {
wechat: () => {
this.wechatOfficialAccountPay();
},
alipay: () => {
this.redirectPay(); // 现在公众号可以直接跳转支付宝页面
},
wallet: () => {
this.walletPay();
2023-12-13 03:35:02 +00:00
},
2023-12-19 15:10:50 +00:00
mock: () => {
this.mockPay();
},
2023-12-13 03:35:02 +00:00
},
WechatMiniProgram: {
wechat: () => {
this.wechatMiniProgramPay();
},
alipay: () => {
this.copyPayLink();
},
wallet: () => {
this.walletPay();
2023-12-13 03:35:02 +00:00
},
2023-12-19 15:10:50 +00:00
mock: () => {
this.mockPay();
},
2023-12-13 03:35:02 +00:00
},
App: {
wechat: () => {
this.wechatAppPay();
},
alipay: () => {
this.alipay();
},
wallet: () => {
this.walletPay();
2023-12-13 03:35:02 +00:00
},
2023-12-19 15:10:50 +00:00
mock: () => {
this.mockPay();
},
2023-12-13 03:35:02 +00:00
},
H5: {
wechat: () => {
this.wechatWapPay();
},
alipay: () => {
this.redirectPay();
},
wallet: () => {
this.walletPay();
2023-12-13 03:35:02 +00:00
},
2023-12-19 15:10:50 +00:00
mock: () => {
this.mockPay();
},
2023-12-13 03:35:02 +00:00
},
};
return payAction[sheep.$platform.name][this.payment]();
}
// 预支付
prepay(channel) {
return new Promise(async (resolve, reject) => {
2023-12-13 03:35:02 +00:00
let data = {
id: this.id,
channelCode: channel,
channelExtras: {},
2023-12-13 03:35:02 +00:00
};
// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid
2023-12-24 05:16:45 +00:00
if (['wx_pub', 'wx_lite'].includes(channel)) {
const openid = await sheep.$platform.useProvider('wechat').getOpenid();
// 如果获取不到 openid微信无法发起支付此时需要引导
if (!openid) {
this.bindWeixin();
return;
}
data.channelExtras.openid = openid;
2023-12-13 03:35:02 +00:00
}
2023-12-24 05:16:45 +00:00
// 发起预支付 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();
}
2023-12-13 03:35:02 +00:00
}
});
});
}
// #ifdef H5
// 微信公众号 JSSDK 支付
2023-12-13 03:35:02 +00:00
async wechatOfficialAccountPay() {
let { code, data } = await this.prepay('wx_pub');
if (code !== 0) {
2023-12-13 03:35:02 +00:00
return;
}
const payConfig = JSON.parse(data.displayContent);
$wxsdk.wxpay(payConfig, {
2023-12-13 03:35:02 +00:00
success: () => {
this.payResult('success');
2023-12-13 03:35:02 +00:00
},
cancel: () => {
sheep.$helper.toast('支付已手动取消');
2023-12-13 03:35:02 +00:00
},
fail: (error) => {
if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) {
sheep.$helper.toast(
'发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付',
);
return;
}
this.payResult('fail');
2023-12-13 03:35:02 +00:00
},
});
}
// 浏览器微信 H5 支付 TODO 芋艿待接入注意H5 支付是给普通浏览器,不是微信公众号的支付,绝大多数人用不到,可以忽略)
2023-12-13 03:35:02 +00:00
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}`;
2023-12-13 03:35:02 +00:00
location.href = `${data.pay_data.h5_url}&redirect_url=${encodeURIComponent(redirect_url)}`;
}
}
// 支付链接(支付宝 wap 支付)
2023-12-13 03:35:02 +00:00
async redirectPay() {
let { code, data } = await this.prepay('alipay_wap');
if (code !== 0) {
return;
2023-12-13 03:35:02 +00:00
}
location.href = data.displayContent;
2023-12-13 03:35:02 +00:00
}
// #endif
2023-12-24 05:16:45 +00:00
// 微信小程序支付
2023-12-13 03:35:02 +00:00
async wechatMiniProgramPay() {
2023-12-24 05:16:45 +00:00
// let that = this;
let { code, data } = await this.prepay('wx_lite');
if (code !== 0) {
return;
}
// 调用微信小程序支付
const payConfig = JSON.parse(data.displayContent);
2023-12-13 03:35:02 +00:00
uni.requestPayment({
provider: 'wxpay',
2023-12-24 05:16:45 +00:00
timeStamp: payConfig.timeStamp,
nonceStr: payConfig.nonceStr,
package: payConfig.packageValue,
signType: payConfig.signType,
paySign: payConfig.paySign,
2023-12-13 03:35:02 +00:00
success: (res) => {
2023-12-24 05:16:45 +00:00
this.payResult('success');
2023-12-13 03:35:02 +00:00
},
fail: (err) => {
if (err.errMsg === 'requestPayment:fail cancel') {
sheep.$helper.toast('支付已手动取消');
} else {
2023-12-24 05:16:45 +00:00
this.payResult('fail');
2023-12-13 03:35:02 +00:00
}
},
});
}
// 余额支付
async walletPay() {
const { code } = await this.prepay('wallet');
code === 0 && this.payResult('success');
2023-12-13 03:35:02 +00:00
}
2023-12-19 15:10:50 +00:00
// 模拟支付
async mockPay() {
const { code } = await this.prepay('mock');
code === 0 && this.payResult('success');
2023-12-13 03:35:02 +00:00
}
// 支付宝复制链接支付(通过支付宝 wap 支付实现)
2023-12-13 03:35:02 +00:00
async copyPayLink() {
let { code, data } = await this.prepay('alipay_wap');
if (code !== 0) {
return;
2023-12-13 03:35:02 +00:00
}
// 引入 showModal 点击确认:复制链接;
uni.showModal({
title: '支付宝支付',
content: '复制链接到外部浏览器',
confirmText: '复制链接',
success: (res) => {
if (res.confirm) {
sheep.$helper.copyText(data.displayContent);
}
},
});
2023-12-13 03:35:02 +00:00
}
// 支付宝支付App TODO 芋艿:待接入【暂时没打包 app所以没接入一般人用不到】
2023-12-13 03:35:02 +00:00
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('支付已手动取消');
} else {
that.payResult('fail');
}
},
});
}
}
// 微信支付App TODO 芋艿:待接入:待接入【暂时没打包 app所以没接入一般人用不到】
2023-12-13 03:35:02 +00:00
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) {
goPayResult(this.id, this.orderType, resultType);
2023-12-13 03:35:02 +00:00
}
// 引导绑定微信
bindWeixin() {
uni.showModal({
title: '微信支付',
content: '请先绑定微信再使用微信支付',
success: function (res) {
if (res.confirm) {
sheep.$platform.useProvider('wechat').bind();
}
},
});
}
2023-12-13 03:35:02 +00:00
}
export function getPayMethods(channels) {
const payMethods = [
{
icon: '/static/img/shop/pay/wechat.png',
title: '微信支付',
value: 'wechat',
disabled: true,
},
{
icon: '/static/img/shop/pay/alipay.png',
title: '支付宝支付',
value: 'alipay',
disabled: true,
},
{
icon: '/static/img/shop/pay/wallet.png',
title: '余额支付',
value: 'wallet',
disabled: true,
},
{
icon: '/static/img/shop/pay/apple.png',
title: 'Apple Pay',
value: 'apple',
disabled: true,
},
{
icon: '/static/img/shop/pay/wallet.png',
title: '模拟支付',
value: 'mock',
disabled: true,
},
];
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 === 'H5' && channels.includes('alipay_wap')) ||
(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;
}
return payMethods;
}
// 支付结果跳转,success:成功fail:失败
export function goPayResult(id, orderType, resultType) {
sheep.$router.redirect('/pages/pay/result', {
id,
orderType,
payState: resultType,
});
}