文件
xionggeshop/xgsc.gynhc.com_wx/shopro/pay/index.js
2026-09-14 17:24:53 +08:00

317 行
7.5 KiB
JavaScript

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

import $http from '@/shopro/request/index'
// #ifdef H5
import wxsdk from '@/shopro/wechat/sdk'
// #endif
import wechat from '@/shopro/wechat/wechat'
import {
router as $Router
} from '@/shopro/router/index.js'
import store from '@/shopro/store';
import $platform from '@/shopro/platform';
/**
* 支付
*
* @param {String} payment = ['wechat','alipay','wallet'] - 支付方式
* @param {Object} order = {} - 订单详情
* @param {String} orderType = ['goods','recharge'] - 订单类型
*/
export default class ShoproPay {
// wxOfficialAccount wxMiniProgram App H5
// wechat 公众号JSSDK支付 小程序支付 微信开放平台支付 H5网页支付
// alipay 复制网址 复制网址 支付宝开放平台支付 直接跳转链接
// wallet v v v v
constructor(payment, order, orderType) {
this.payment = payment;
this.order = order;
this.orderType = orderType;
this.platform = $platform.get();
let payMehod = this.getPayMethod();
console.log(this.payment, this.payment, this.platform);
payMehod();
}
getPayMethod() {
var payMethod = {
'wxOfficialAccount': {
'wechat': () => {
this.wxOfficialAccountPay()
},
'alipay': () => {
this.copyPayLink()
},
'wallet': () => {
this.walletPay()
}
},
'wxMiniProgram': {
'wechat': () => {
this.wxMiniProgramPay()
},
'group': () => {
this.wxMiniProgramPay()
},
'alipay': () => {
this.copyPayLink()
},
'wallet': () => {
this.walletPay()
}
},
'App': {
'wechat': () => {
this.wechatPay()
},
'group': () => {
this.wechatPay()
},
'alipay': () => {
this.aliPay()
},
'wallet': () => {
this.walletPay()
},
},
'H5': {
'wechat': () => {
this.wechatWapPay()
},
'alipay': () => {
this.goToPayLink()
},
'wallet': () => {
this.walletPay()
},
},
}
return payMethod[this.platform][this.payment];
}
// 预支付
prepay() {
let that = this;
return new Promise((resolve, reject) => {
let params = {
order_id: that.order.id,
order_sn: that.order.order_sn,
payment: that.payment
}
if (uni.getStorageSync('openid')) {
params.openid = uni.getStorageSync('openid');
}
$http('money.prepay', params, '支付中').then(res => {
if (res.code === 1) {
if (res.data === 'no_openid') {
uni.showModal({
title: '微信支付',
content: '请先绑定微信再使用微信支付',
confirmText: '去绑定',
success: function(modalRes) {
if (modalRes.confirm) {
uni.navigateTo({
url: '/pages/user/info'
});
}
},
});
reject(new Error('no_openid'));
return;
}
// 余额支付:后端 walletPay 直接返回已支付订单,无 pay_data
if (that.payment === 'wallet') {
resolve(res);
return;
}
if (!res.data || !res.data.pay_data) {
reject(new Error(res.msg || '支付参数异常'));
return;
}
resolve(res);
return;
}
reject(new Error(res.msg || '预支付失败'));
}).catch(err => {
reject(err);
});
});
}
// 微信H5支付
async wxOfficialAccountPay() {
let that = this;
let result = await this.prepay();
wxsdk.wxpay(result.data.pay_data, (res) => {
res.errMsg == "chooseWXPay:ok" ? that.payResult('success') : that.payResult('fail')
});
}
// 浏览器微信支付
async wechatWapPay() {
let that = this;
let result = await this.prepay();
if (result.code === 1) {
var url = result.data.pay_data.match(/url\=\'(\S*)\'/);
let reg = new RegExp('&', 'g') //g代表全部
let newUrl = url[1].replace(reg, '&');
let domain = store.getters.initShop.domain; //域名需要https
let params = encodeURIComponent(
`${domain}pages/order/payment/result?orderId=${that.order.id}&type=${that.payment}&orderType=${that.orderType}`
)
window.location.href = newUrl + '&redirect_url=' + params;
}
}
// 微信小程序支付
async wxMiniProgramPay() {
let that = this;
try {
let result = await this.prepay();
const payData = result.data.pay_data;
uni.requestPayment({
provider: 'wxpay',
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType || 'RSA',
paySign: payData.paySign,
success: res => {
that.payResult('success')
},
fail: err => {
console.log('支付取消或者失败:', err);
err.errMsg !== "requestPayment:fail cancel" && that.payResult('fail')
}
});
} catch (err) {
console.log('预支付失败:', err);
}
}
// 余额支付
async walletPay() {
let that = this;
try {
let result = await this.prepay();
if (result.code === 1) {
that.payResult('success');
} else {
that.payResult('fail');
}
} catch (err) {
console.log('余额支付失败:', err);
if (err && err.message && err.message !== 'no_openid') {
uni.showToast({
title: err.message,
icon: 'none'
});
}
}
}
// 支付宝复制链接支付
async copyPayLink() {
let that = this;
let result = await this.prepay();
if (result.code === 1) {
//引入showModal 点击确认 复制链接;
uni.showModal({
title: '支付宝支付',
content: '复制链接到外部浏览器',
confirmText: '复制链接',
success: (res) => {
if (res.confirm) {
uni.setClipboardData({
data: result.data.pay_data,
success: function(data) {
that.$u.toast('已复制到剪切板');
}
});
}
}
})
}
}
// 支付链接
async goToPayLink() {
let that = this;
let result = await this.prepay();
if (result.code === 1) {
window.location = result.data.pay_data;
}
}
// 支付宝支付
async aliPay() {
let that = this;
let result = await this.prepay();
if (result.code === 1) {
uni.requestPayment({
provider: 'alipay',
orderInfo: result.data.pay_data, // 支付宝订单数据
success: res => {
that.payResult('success')
},
fail: err => {
console.log('支付取消或者失败:', err);
err.errMsg !== "requestPayment:fail cancel" && that.payResult('fail')
}
});
}
}
// 微信app支付
async wechatPay() {
let that = this;
let result = await this.prepay();
if (result.code === 1) {
uni.requestPayment({
provider: 'wxpay',
orderInfo: JSON.parse(result.data.pay_data), // 微信订单数据(官方说是string。实测为object)
// orderInfo: result.data.pay_data,
success: res => {
that.payResult('success')
},
fail: err => {
console.log('取消支付或支付失败:', err);
err.errMsg !== "requestPayment:fail cancel" && that.payResult(
'fail');
return;
uni.showModal({
title: '温馨提示',
content: `支付取消或者失败。errMsg:${err.errMsg}。errCode:${err.errCode}。code:${err.code}`,
showCancel: false,
success: ret => {
console.log('取消支付或支付失败:', err);
err.errMsg !== "requestPayment:fail cancel" && that.payResult(
'fail')
}
})
}
});
}
}
// 支付结果跳转,success:成功,fail:失败
payResult(resultType) {
const that = this;
$Router.replace({
path: '/pages/order/payment/result',
query: {
orderId: that.order.id,
type: that.payment, //重新支付的时候使用
payState: resultType,
orderType: that.orderType
}
});
}
}