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.
517 lines
11 KiB
517 lines
11 KiB
5 months ago
|
<template>
|
||
|
<view>
|
||
|
<form class="form" @submit="checkForm" :style="colorStyle">
|
||
|
<view class="input-section">
|
||
|
<view class="section-hd">{{ $t(`支付金额`) }}</view>
|
||
|
<view class="section-bd">
|
||
|
<view class="input-group">
|
||
|
{{ $t(`¥`) }}
|
||
|
<input v-model.number="money" class="input" name="money" type="digit" @input="inputChange" placeholder="0.00" />
|
||
|
</view>
|
||
|
<view v-if="payPrice && show" class="discount">{{ $t(`会员优惠价`) }}:{{ $t(`¥`) }}{{ payPrice || 0 }}</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
<view class="radio-section">
|
||
|
<view class="section-hd">{{ $t(`支付方式`) }}</view>
|
||
|
<radio-group class="section-bd" name="method">
|
||
|
<label class="item" v-if="yuePay">
|
||
|
<text class="iconfont icon-yue"></text>
|
||
|
<view class="name">
|
||
|
<text>{{ $t(`余额支付`) }}</text>
|
||
|
<text class="money">{{ $t(`可用余额`) }}:{{ $t(`¥`) }}{{ now_money || 0 }}</text>
|
||
|
</view>
|
||
|
<radio value="yue" :checked="payType === 'yue'" />
|
||
|
</label>
|
||
|
<label v-if="wxpay" class="item">
|
||
|
<text class="iconfont icon-weixinzhifu"></text>
|
||
|
<text class="name">{{ $t(`微信支付`) }}</text>
|
||
|
<radio value="weixin" :checked="payType === 'weixin'" />
|
||
|
</label>
|
||
|
</radio-group>
|
||
|
</view>
|
||
|
<button class="button" form-type="submit">{{ $t(`确认`) }}</button>
|
||
|
<view class="alipay" v-html="alipayHtml"></view>
|
||
|
</form>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import { offlineCheckPrice, offlineCreate, orderOfflinePayType } from '@/api/order.js';
|
||
|
import { toLogin } from '@/libs/login.js';
|
||
|
import { mapGetters } from 'vuex';
|
||
|
import colors from '@/mixins/color';
|
||
|
const app = getApp();
|
||
|
export default {
|
||
|
mixins: [colors],
|
||
|
data() {
|
||
|
return {
|
||
|
money: '',
|
||
|
payPrice: '',
|
||
|
payType: 'weixin',
|
||
|
alipayHtml: '',
|
||
|
alipay: false,
|
||
|
wxpay: false,
|
||
|
yuePay: false,
|
||
|
paying: false,
|
||
|
now_money: 0,
|
||
|
isWeixin: false,
|
||
|
site_name: '',
|
||
|
isCommitted: false,
|
||
|
show: false
|
||
|
};
|
||
|
},
|
||
|
computed: mapGetters(['isLogin']),
|
||
|
onLoad(options) {
|
||
|
if (!this.isLogin) {
|
||
|
toLogin();
|
||
|
}
|
||
|
// #ifdef H5
|
||
|
if (options.code) {
|
||
|
let spread = app.globalData.spid ? app.globalData.spid : '';
|
||
|
wechatAuthV2(options.code, spread).then((res) => {
|
||
|
location.href = decodeURIComponent(decodeURIComponent(options.back_url));
|
||
|
});
|
||
|
}
|
||
|
// #endif
|
||
|
},
|
||
|
onShow() {
|
||
|
if (this.isLogin) {
|
||
|
this.getPayType();
|
||
|
}
|
||
|
//#ifdef H5
|
||
|
this.isWeixin = this.$wechat.isWeixin();
|
||
|
//#endif
|
||
|
},
|
||
|
methods: {
|
||
|
inputChange(e) {
|
||
|
var that = this;
|
||
|
e.target.value = e.target.value.match(/^\d*(.?\d{0,2})/g)[0] || '';
|
||
|
this.$nextTick(() => {
|
||
|
this.money = e.target.value;
|
||
|
this.checkPrice();
|
||
|
});
|
||
|
},
|
||
|
getPayType() {
|
||
|
orderOfflinePayType()
|
||
|
.then((res) => {
|
||
|
const { ali_pay_status, pay_weixin_open, yue_pay_status, offline_pay_status, site_name, now_money } = res.data;
|
||
|
this.alipay = ali_pay_status;
|
||
|
this.wxpay = pay_weixin_open;
|
||
|
this.yuePay = yue_pay_status;
|
||
|
this.now_money = now_money;
|
||
|
this.site_name = site_name;
|
||
|
if (!offline_pay_status) {
|
||
|
uni.showModal({
|
||
|
title: this.$t(`支付提醒`),
|
||
|
content: this.$t(`线下支付已关闭,请点击确认按钮返回主页`),
|
||
|
showCancel: false,
|
||
|
success() {
|
||
|
uni.switchTab({
|
||
|
url: '/pages/index/index'
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
if (site_name) {
|
||
|
uni.setNavigationBarTitle({
|
||
|
title: site_name
|
||
|
});
|
||
|
}
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
uni.showToast({
|
||
|
title: err,
|
||
|
icon: 'none'
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
checkForm(e) {
|
||
|
const { money, method } = e.detail.value;
|
||
|
if (money) {
|
||
|
this.combData(method);
|
||
|
} else {
|
||
|
uni.showToast({
|
||
|
title: this.$t(`请输入支付金额`),
|
||
|
icon: 'none'
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
// 优惠价
|
||
|
checkPrice() {
|
||
|
offlineCheckPrice({
|
||
|
pay_price: this.money
|
||
|
})
|
||
|
.then((res) => {
|
||
|
this.payPrice = res.data.pay_price;
|
||
|
this.show = res.data.show;
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
uni.showToast({
|
||
|
title: err,
|
||
|
icon: 'none'
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
// 组合数据
|
||
|
combData(payType) {
|
||
|
let data = {
|
||
|
type: 3,
|
||
|
pay_type: payType,
|
||
|
// #ifdef H5
|
||
|
from: this.isWeixin ? 'weixin' : 'weixinh5',
|
||
|
// #endif
|
||
|
// #ifdef MP
|
||
|
from: 'routine',
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
from: 'weixin',
|
||
|
// #endif
|
||
|
price: this.payPrice || this.money,
|
||
|
money: this.money
|
||
|
};
|
||
|
|
||
|
// #ifdef H5
|
||
|
if (this.isWeixin) {
|
||
|
data.from = 'weixin';
|
||
|
}
|
||
|
// #endif
|
||
|
// #ifdef MP
|
||
|
data.from = 'routine';
|
||
|
// #endif
|
||
|
if (this.paying) {
|
||
|
return;
|
||
|
}
|
||
|
this.paying = true;
|
||
|
uni.showLoading({
|
||
|
title: this.$t(`正在确认`)
|
||
|
});
|
||
|
offlineCreate(data)
|
||
|
.then((res) => {
|
||
|
uni.hideLoading();
|
||
|
this.callPay(res);
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
this.paying = false;
|
||
|
uni.showToast({
|
||
|
title: err,
|
||
|
icon: 'none'
|
||
|
});
|
||
|
});
|
||
|
},
|
||
|
formpost(url, postData) {
|
||
|
let tempform = document.createElement('form');
|
||
|
tempform.action = url;
|
||
|
tempform.method = 'post';
|
||
|
tempform.target = '_self';
|
||
|
tempform.style.display = 'none';
|
||
|
for (let x in postData) {
|
||
|
let opt = document.createElement('input');
|
||
|
opt.name = x;
|
||
|
opt.value = postData[x];
|
||
|
tempform.appendChild(opt);
|
||
|
}
|
||
|
document.body.appendChild(tempform);
|
||
|
this.$nextTick((e) => {
|
||
|
tempform.submit();
|
||
|
});
|
||
|
},
|
||
|
// 调用支付
|
||
|
callPay(res) {
|
||
|
const { status, result } = res.data,
|
||
|
{ orderId, jsConfig } = result,
|
||
|
goPages = '/pages/annex/offline_result/index?site_name=' + this.site_name;
|
||
|
switch (status) {
|
||
|
case 'ORDER_EXIST':
|
||
|
case 'EXTEND_ORDER':
|
||
|
case 'ALLINPAY_PAY':
|
||
|
uni.hideLoading();
|
||
|
// #ifdef MP
|
||
|
this.initIn = true;
|
||
|
wx.openEmbeddedMiniProgram({
|
||
|
appId: 'wxef277996acc166c3',
|
||
|
extraData: {
|
||
|
cusid: jsConfig.cusid,
|
||
|
appid: jsConfig.appid,
|
||
|
version: jsConfig.version,
|
||
|
trxamt: jsConfig.trxamt,
|
||
|
reqsn: jsConfig.reqsn,
|
||
|
notify_url: jsConfig.notify_url,
|
||
|
body: jsConfig.body,
|
||
|
remark: jsConfig.remark,
|
||
|
validtime: jsConfig.validtime,
|
||
|
randomstr: jsConfig.randomstr,
|
||
|
paytype: jsConfig.paytype,
|
||
|
sign: jsConfig.sign,
|
||
|
signtype: jsConfig.signtype
|
||
|
}
|
||
|
});
|
||
|
this.jumpData = {
|
||
|
orderId: data.data.result.orderId,
|
||
|
msg: data.msg
|
||
|
};
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
plus.runtime.openURL(jsConfig.payinfo);
|
||
|
setTimeout((e) => {
|
||
|
uni.reLaunch({
|
||
|
url: '/pages/annex/offline_pay/index'
|
||
|
});
|
||
|
}, 1000);
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
this.formpost(res.data.result.pay_url, jsConfig);
|
||
|
// #endif
|
||
|
break;
|
||
|
case 'PAY_ERROR':
|
||
|
this.paying = false;
|
||
|
this.$util.Tips(
|
||
|
{
|
||
|
title: res.msg
|
||
|
},
|
||
|
{
|
||
|
tab: 5,
|
||
|
url: goPages
|
||
|
}
|
||
|
);
|
||
|
break;
|
||
|
case 'SUCCESS':
|
||
|
this.paying = false;
|
||
|
this.money = '';
|
||
|
this.$util.Tips(
|
||
|
{
|
||
|
title: res.msg,
|
||
|
icon: 'success'
|
||
|
},
|
||
|
{
|
||
|
tab: 5,
|
||
|
url: goPages
|
||
|
}
|
||
|
);
|
||
|
break;
|
||
|
case 'WECHAT_PAY':
|
||
|
// #ifdef MP
|
||
|
let that = this;
|
||
|
let mp_pay_name = '';
|
||
|
if (uni.requestOrderPayment) {
|
||
|
mp_pay_name = 'requestOrderPayment';
|
||
|
} else {
|
||
|
mp_pay_name = 'requestPayment';
|
||
|
}
|
||
|
uni[mp_pay_name]({
|
||
|
timeStamp: jsConfig.timestamp,
|
||
|
nonceStr: jsConfig.nonceStr,
|
||
|
package: jsConfig.package,
|
||
|
signType: jsConfig.signType,
|
||
|
paySign: jsConfig.paySign,
|
||
|
success: function (res) {
|
||
|
that.$util.Tips(
|
||
|
{
|
||
|
title: that.$t(`支付成功`),
|
||
|
icon: 'success'
|
||
|
},
|
||
|
{
|
||
|
tab: 5,
|
||
|
url: '/pages/annex/offline_result/index'
|
||
|
}
|
||
|
);
|
||
|
},
|
||
|
fail: function () {
|
||
|
uni.showToast({
|
||
|
title: that.$t(`取消支付`),
|
||
|
icon: 'none',
|
||
|
success: function () {
|
||
|
that.paying = false;
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
complete: function () {
|
||
|
that.paying = false;
|
||
|
uni.hideLoading();
|
||
|
}
|
||
|
});
|
||
|
// #endif
|
||
|
// #ifndef MP
|
||
|
this.$wechat
|
||
|
.pay(result.jsConfig)
|
||
|
.then((res) => {
|
||
|
this.paying = false;
|
||
|
this.$util.Tips(
|
||
|
{
|
||
|
title: this.$t(`支付成功`),
|
||
|
icon: 'success'
|
||
|
},
|
||
|
{
|
||
|
tab: 5,
|
||
|
url: '/pages/annex/offline_result/index'
|
||
|
}
|
||
|
);
|
||
|
})
|
||
|
.catch((err) => {
|
||
|
this.paying = false;
|
||
|
if (err.errMsg == 'chooseWXPay:cancel') {
|
||
|
uni.showToast({
|
||
|
title: this.$t(`取消支付`),
|
||
|
icon: 'none'
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
// #endif
|
||
|
break;
|
||
|
case 'PAY_DEFICIENCY':
|
||
|
this.paying = false;
|
||
|
this.$util.Tips({
|
||
|
title: res.msg
|
||
|
});
|
||
|
break;
|
||
|
case 'WECHAT_H5_PAY':
|
||
|
this.paying = false;
|
||
|
uni.showToast({
|
||
|
title: res.msg,
|
||
|
success() {
|
||
|
location.href = jsConfig.h5_url;
|
||
|
}
|
||
|
});
|
||
|
break;
|
||
|
case 'ALIPAY_PAY':
|
||
|
this.paying = false;
|
||
|
// #ifdef H5
|
||
|
if (this.$wechat.isWeixin()) {
|
||
|
uni.navigateTo({
|
||
|
url: `/pages/users/alipay_invoke/index?id=${orderId}&link=${jsConfig.qrCode}`
|
||
|
});
|
||
|
} else {
|
||
|
this.alipayHtml = jsConfig;
|
||
|
this.$nextTick(() => {
|
||
|
document.getElementById('alipaysubmit').submit();
|
||
|
});
|
||
|
}
|
||
|
// #endif
|
||
|
// #ifdef MP
|
||
|
uni.navigateTo({
|
||
|
url: `/pages/users/alipay_invoke/index?id=${orderId}&link=${jsConfig.qrCode}`
|
||
|
});
|
||
|
// #endif
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
</script>
|
||
|
|
||
|
<style>
|
||
|
page {
|
||
|
background-color: #ffffff;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<style lang="scss" scoped>
|
||
|
/deep/uni-radio .uni-radio-input.uni-radio-input-checked {
|
||
|
border: 1px solid #fdc383 !important;
|
||
|
background-color: #fdc383 !important;
|
||
|
}
|
||
|
.input-section {
|
||
|
.section-hd {
|
||
|
padding: 30rpx;
|
||
|
font-size: 28rpx;
|
||
|
color: #666666;
|
||
|
}
|
||
|
|
||
|
.section-bd {
|
||
|
padding-right: 30rpx;
|
||
|
padding-left: 30rpx;
|
||
|
}
|
||
|
|
||
|
.input-group {
|
||
|
display: flex;
|
||
|
align-items: flex-end;
|
||
|
padding: 45rpx 20rpx 47rpx;
|
||
|
font-size: 80rpx;
|
||
|
color: #999999;
|
||
|
}
|
||
|
|
||
|
.input {
|
||
|
flex: 1;
|
||
|
height: 110rpx;
|
||
|
margin-left: 15rpx;
|
||
|
font-size: 100rpx;
|
||
|
color: #282828;
|
||
|
}
|
||
|
|
||
|
.discount {
|
||
|
padding: 27rpx 20rpx;
|
||
|
border-top: 1rpx solid #eeeeee;
|
||
|
font-size: 28rpx;
|
||
|
color: #e93323;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.radio-section {
|
||
|
border-top: 20rpx solid #f5f5f5;
|
||
|
|
||
|
.section-hd {
|
||
|
padding: 30rpx;
|
||
|
font-size: 28rpx;
|
||
|
color: #666666;
|
||
|
}
|
||
|
|
||
|
.section-bd {
|
||
|
padding-left: 50rpx;
|
||
|
}
|
||
|
|
||
|
.item {
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
padding-top: 30rpx;
|
||
|
padding-right: 30rpx;
|
||
|
padding-bottom: 30rpx;
|
||
|
border-bottom: 1rpx solid #f5f5f5;
|
||
|
.name {
|
||
|
display: flex;
|
||
|
align-items: center;
|
||
|
justify-content: space-between;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.iconfont {
|
||
|
font-size: 44rpx;
|
||
|
}
|
||
|
|
||
|
.icon-yue {
|
||
|
color: #fe960f;
|
||
|
}
|
||
|
|
||
|
.icon-weixinzhifu {
|
||
|
color: #41b035;
|
||
|
}
|
||
|
|
||
|
.icon-zhifubao {
|
||
|
color: #099bdf;
|
||
|
}
|
||
|
|
||
|
.name {
|
||
|
flex: 1;
|
||
|
margin-left: 30rpx;
|
||
|
font-size: 30rpx;
|
||
|
color: #333333;
|
||
|
}
|
||
|
|
||
|
.money {
|
||
|
float: right;
|
||
|
padding-right: 20rpx;
|
||
|
font-size: 20rpx;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.button {
|
||
|
height: 86rpx;
|
||
|
border-radius: 43rpx;
|
||
|
margin: 114rpx 30rpx 30rpx;
|
||
|
background: linear-gradient(90deg, #fee2b7 0%, #fdc383 100%);
|
||
|
font-size: 30rpx;
|
||
|
line-height: 86rpx;
|
||
|
color: #5d3324;
|
||
|
}
|
||
|
.alipay {
|
||
|
display: none;
|
||
|
}
|
||
|
</style>
|