【支付页】

1. 初步接入 pc、wap 支付
2. 清理多余的变量
pull/1/MERGE
YunaiV 2023-07-04 20:31:21 +08:00
parent be43aaafd8
commit 965d6683bf
1 changed files with 112 additions and 272 deletions

View File

@ -1,9 +1,9 @@
<template> <template>
<view class="page" v-if="payPriceShow"> <view class="page" v-if="payPrice">
<view class="pay-price"> <view class="pay-price">
<view class="price"> <view class="price">
<text class="unit"></text> <text class="unit"></text>
<numberScroll :num='(payPriceShow / 100.0).toFixed(2)' color="#E93323" width='30' height='50' fontSize='50' /> <numberScroll :num='(payPrice / 100.0).toFixed(2)' color="#E93323" width='30' height='50' fontSize='50' />
</view> </view>
<view class="count-down"> <view class="count-down">
支付剩余时间 支付剩余时间
@ -16,28 +16,26 @@
支付方式 支付方式
</view> </view>
<view class="item acea-row row-between-wrapper" v-for="(item,index) in cartArr" :key="index" <view class="item acea-row row-between-wrapper" v-for="(item,index) in cartArr" :key="index"
v-show='item.payStatus' @click="payType(item.number || 0, item.value, index, item.channelCode)"> v-show='item.status' @click="payType(item.channelCode)">
<view class="left acea-row row-between-wrapper"> <view class="left acea-row row-between-wrapper">
<view class="iconfont" :class="item.icon"></view> <view class="iconfont" :class="item.icon"></view>
<view class="text"> <view class="text">
<view class="name">{{item.name}}</view> <view class=name>{{item.name}}</view>
<view class="info" v-if="item.value == 'yue'"> <view class="info" v-if="item.value == 'yue'">
{{item.title}} <span class="money">{{ item.number }}</span> {{item.title}} <span class="money">{{ item.number }}</span>
</view> </view>
<view class="info" v-else>{{item.title}}</view> <view class="info" v-else>{{item.title}}</view>
</view> </view>
</view> </view>
<view class="iconfont" :class="active==index?'icon-xuanzhong11 font-num':'icon-weixuan'"></view> <view class="iconfont" :class="item.channelCode === channelCode?'icon-xuanzhong11 font-num':'icon-weixuan'" />
</view> </view>
</view> </view>
<view class="btn"> <view class="btn">
<view class="button acea-row row-center-wrapper" @click='goPay(number, paytype, channelCode)'>确认支付</view> <view class="button acea-row row-center-wrapper" @click='goPay(channelCode)'>确认支付</view>
<view class="wait-pay" @click="waitPay"></view> <view class="wait-pay" @click="goReturnUrl"></view>
</view> </view>
<view v-show="false" v-html="formContent"></view>
</view> </view>
</template> </template>
<script> <script>
import CountDown from "@/components/countDown"; import CountDown from "@/components/countDown";
import numberScroll from '@/components/numberScroll.vue' import numberScroll from '@/components/numberScroll.vue'
@ -49,6 +47,39 @@
}, },
data() { data() {
return { return {
orderId: 0, //
returnUrl: '', //
payPrice: 0, //
invalidTime: 0, //
cartArr: [{ //
name: '微信支付',
icon: "icon-weixin2",
title: '使用微信快捷支付',
status: 1,
channelCode: "wx_pub" // TODO
}, {
name: '支付宝支付',
icon: "icon-zhifubao",
title: '使用支付宝支付',
status: 1,
channelCode: "alipay_wap"
}, {
name: '余额支付',
icon: "icon-yuezhifu",
title: '可用余额',
status: 1,
},
//
{
name: '支付宝支付PC',
icon: "icon-zhifubao",
value: 'alipay_pc',
title: '使用支付宝支付',
status: 1,
channelCode: "alipay_pc"
}],
channelCode: '', //
bgColor: { bgColor: {
'bgColor': '#fff', 'bgColor': '#fff',
'Color': '#E93323', 'Color': '#E93323',
@ -56,140 +87,44 @@
'timeTxtwidth': '16rpx', 'timeTxtwidth': '16rpx',
'isDay': true 'isDay': true
}, },
checked: false,
datatime: 1676344056, //
//
cartArr: [{
"name": '微信支付',
"icon": "icon-weixin2",
value: 'weixin',
title: '使用微信快捷支付',
payStatus: 1,
"channelCode": "wx_pub" // TODO
},
{
"name": '支付宝支付',
"icon": "icon-zhifubao",
value: 'alipay',
title: '使用支付宝支付',
payStatus: 1,
"channelCode": "alipay_wap" // TODO
},
{
"name": '余额支付',
"icon": "icon-yuezhifu",
value: 'yue',
title: '可用余额',
payStatus: 1,
}],
orderId: 0,
// fromType: '', // TODO
active: 0,
payPrice: 0,
payPriceShow: 0,
payPostage: 0,
invalidTime: 0,
initIn: false,
jumpData: {
orderId: '',
msg: ''
},
formContent: '',
channelCode: '', //
form: { // form // TODO
html: '', formContent: '',
}, }
}
},
watch: {
cartArr: {
handler(newV, oldValue) {
let newPayList = [];
newV.forEach((item, index) => {
if (item.payStatus) {
item.index = index;
newPayList.push(item)
}
});
this.active = newPayList[0].index;
this.paytype = newPayList[0].value;
this.number = newPayList[0].number || 0;
this.channelCode = newPayList[0].channelCode || '';
},
immediate: true,
deep: true
}
}, },
onLoad(options) { onLoad(options) {
if (options.order_id) this.orderId = options.order_id if (options.order_id) {
if (options.from_type) this.fromType = options.from_type this.orderId = options.order_id
}
if (options.returnUrl) {
this.returnUrl = options.returnUrl
}
this.getCashierOrder() this.getCashierOrder()
}, },
onShow() {
let options = wx.getEnterOptionsSync();
console.log(options)
if (options.scene == '1038' && options.referrerInfo.appId == 'wxef277996acc166c3' && this.initIn) {
//
let extraData = options.referrerInfo.extraData;
this.initIn = false
if (!extraData) {
// "";
this.$util.Tips({
title: '取消支付'
}, {
tab: 5,
url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`取消支付`)}&type=3&totalPrice=${this.payPriceShow}&status=2`
});
} else {
if (extraData.code == 'success') {
this.$util.Tips({
title: '支付成功',
icon: 'success'
}, {
tab: 5,
url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.jumpData.msg}&type=3&totalPrice=${this.payPriceShow}`
});
} else if (extraData.code == 'cancel') {
// "";
this.$util.Tips({
title: '取消支付'
}, {
tab: 5,
url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`取消支付`)}&type=3&totalPrice=${this.payPriceShow}&status=2`
});
} else {
// "" + extraData.errmsg;
uni.reLaunch({
url: `/pages/goods/order_pay_status/index?order_id=${this.orderId}&msg=${this.$t(`支付失败`)}&totalPrice=${this.payPriceShow}`
})
}
}
}
},
methods: { methods: {
getCashierOrder() { getCashierOrder() {
uni.showLoading({ uni.showLoading({
title: '创建订单中' title: '加载订单中'
}); });
PayOrderApi.getOrder(this.orderId).then(res => { PayOrderApi.getOrder(this.orderId).then(res => {
console.log(res) console.log(res)
this.payPrice = this.payPriceShow = res.data.price this.payPrice = res.data.price
this.payPostage = res.data.pay_postage
this.invalidTime = res.data.expireTime this.invalidTime = res.data.expireTime
// TODO // TODO
// this.cartArr[0].payStatus = res.data.wechat_pay_status || 0 // this.cartArr[0].status = res.data.wechat_pay_status || 0
this.cartArr[0].payStatus = res.data.wechat_pay_status || 1 this.cartArr[0].status = res.data.wechat_pay_status || 1
// TODO // TODO
// this.cartArr[1].payStatus = res.data.ali_pay_status || 0; // this.cartArr[1].status = res.data.ali_pay_status || 0;
this.cartArr[1].payStatus = res.data.ali_pay_status || 1; this.cartArr[1].status = res.data.ali_pay_status || 1;
//#ifdef MP //#ifdef MP
this.cartArr[1].payStatus = false; this.cartArr[1].status = false;
//#endif //#endif
// //
// that.cartArr[2].title = ':' + res.data.userInfo.now_money; // that.cartArr[2].title = ':' + res.data.userInfo.now_money;
this.cartArr[2].number = res.data.now_money; this.cartArr[2].number = res.data.now_money;
this.cartArr[2].payStatus = res.data.yue_pay_status this.cartArr[2].status = res.data.yue_pay_status
this.channelCode = this.cartArr[0].channelCode;
uni.hideLoading(); uni.hideLoading();
}).catch(err => { }).catch(err => {
uni.hideLoading(); uni.hideLoading();
@ -198,83 +133,24 @@
}) })
}) })
}, },
payType(number, paytype, index, channelCode) { goPay(channelCode) {
this.active = index;
this.paytype = paytype;
this.number = number;
this.channelCode = channelCode
this.payPriceShow = this.payPrice;
},
formpost(url, postData) {
let tempform = document.createElement("form");
tempform.action = url;
tempform.method = "post";
tempform.target = "_self";
tempform.style.display = "none";
if (postData) {
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();
})
},
waitPay() {
uni.reLaunch({
url: '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=取消支付&type=3' +
'&status=2&totalPrice=' + this.payPriceShow
})
},
goPay(number, paytype, channelCode) {
let that = this; let that = this;
if (!that.orderId) return that.$util.Tips({ if (!that.orderId) return that.$util.Tips({
title: '请选择要支付的订单' title: '请选择要支付的订单'
}); });
if (paytype === 'yue' && parseFloat(number) < parseFloat(that.payPriceShow)) return that.$util.Tips({ if (channelCode === 'yue' && parseFloat(number) < parseFloat(that.payPrice)) return that.$util.Tips({
title: '余额不足' title: '余额不足'
}); });
uni.showLoading({ uni.showLoading({
title: '支付中' title: '支付中'
}); });
if (paytype === 'friend' && that.orderId) {
uni.hideLoading();
return uni.navigateTo({
url: '/pages/users/payment_on_behalf/index?order_id=' + that.orderId + '&spread=' +
this.$store.state.app.uid,
success: res => {},
fail: () => {},
complete: () => {}
});
}
PayOrderApi.submitOrder({ PayOrderApi.submitOrder({
id: that.orderId, id: that.orderId,
channelCode: channelCode, channelCode: channelCode,
displayMode: 'url', // TODO displayMode: 'url', // TODO
returnUrl: this.getPayReturnUrl(),
// TODO
uni: that.orderId,
paytype: paytype,
type: that.friendPay ? 1 : 0,
// TODO quitUrl pc wap
// TODO returnUrl
// #ifdef H5
quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location
.port +
'/pages/goods/order_details/index?order_id=' + this.orderId : location.protocol +
'//' + location.hostname +
'/pages/goods/order_details/index?order_id=' + this.orderId
// #endif
// #ifdef APP-PLUS
quitUrl: '/pages/goods/order_details/index?order_id=' + this.orderId
// #endif
}).then(res => { }).then(res => {
// TODO this.handleSubmitOrderResult(res.data);
this.formpost(res.data.displayContent)
if (true) { if (true) {
return; return;
@ -283,94 +159,20 @@
orderId = res.data.result.orderId, orderId = res.data.result.orderId,
jsConfig = res.data.result.jsConfig, jsConfig = res.data.result.jsConfig,
goPages = '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=' + goPages = '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=' +
res res.msg + '&type=3' + '&totalPrice=' + this.payPrice;
.msg +
'&type=3' + '&totalPrice=' + this.payPriceShow,
friendPay = '/pages/users/payment_on_behalf/index?order_id=' + this.orderId +
'&spread=' +
this.$store.state.app.uid
switch (status) { switch (status) {
case 'ORDER_EXIST':
case 'EXTEND_ORDER':
uni.hideLoading();
return that.$util.Tips({
title: res.msg
}, {
tab: 5,
url: goPages
});
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: res.data.result.orderId,
msg: res.msg,
}
// #endif
// #ifdef APP-PLUS
plus.runtime.openURL(jsConfig.payinfo);
setTimeout(e => {
uni.reLaunch({
url: goPages
})
}, 1000)
// #endif
// #ifdef H5
this.formpost(res.data.result.pay_url, jsConfig)
// #endif
break;
case 'PAY_ERROR':
uni.hideLoading();
return that.$util.Tips({
title: res.msg
}, {
tab: 5,
url: goPages
});
break;
case 'SUCCESS': case 'SUCCESS':
uni.hideLoading(); uni.hideLoading();
if (paytype !== 'friend') { return that.$util.Tips({
return that.$util.Tips({ title: res.msg,
title: res.msg, icon: 'success'
icon: 'success' }, {
}, { tab: 4,
tab: 4, url: goPages
url: goPages });
});
} else {
return that.$util.Tips({
title: res.msg,
icon: 'success'
}, {
tab: 4,
url: friendPay
});
}
break;
case 'WECHAT_PAY': case 'WECHAT_PAY':
that.toPay = true; that.toPay = true;
// #ifdef MP // #ifdef MP
/* that.toPay = true; */
let mp_pay_name = '' let mp_pay_name = ''
if (uni.requestOrderPayment) { if (uni.requestOrderPayment) {
mp_pay_name = 'requestOrderPayment' mp_pay_name = 'requestOrderPayment'
@ -510,7 +312,6 @@
location.href = res.data.result.jsConfig.h5_url; location.href = res.data.result.jsConfig.h5_url;
}, 1500); }, 1500);
break; break;
case 'ALIPAY_PAY': case 'ALIPAY_PAY':
//#ifdef H5 //#ifdef H5
uni.hideLoading(); uni.hideLoading();
@ -582,9 +383,48 @@
}); });
}); });
}) })
} },
}
handleSubmitOrderResult(data) {
const displayMode = data.displayMode;
const displayContent = data.displayContent
// 2.1 URL
if (displayMode === 'url') {
window.location = displayContent;
return;
}
// 2.2
},
/**
* 设置支付方式
*/
payType(channelCode) {
this.channelCode = channelCode
},
/**
* 获得支付的 return url
*/
getPayReturnUrl() {
// #ifdef H5
return location.port
? location.protocol + '//' + location.hostname + ':' + location.port + '/pages/goods/cashier/index?order_id=' + this.orderId
: location.protocol + '//' + location.hostname + '/pages/goods/cashier/index?order_id=' + this.orderId;
// #endif
// #ifdef APP-PLUS
return '/pages/goods/order_details/index?order_id=' + this.orderId;
// #endif
return '';
},
/**
* 回到业务的 URL
*/
goReturnUrl() {
uni.reLaunch({
url: this.returnUrl
})
},
}
} }
</script> </script>