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.
418 lines
12 KiB
418 lines
12 KiB
4 months ago
|
<template>
|
||
|
<view :style="colorStyle">
|
||
|
<view class="topdaohang" @click="fanhui">
|
||
|
<uni-icons type="left" size="18" color="white"></uni-icons>
|
||
|
<text >订单支付</text>
|
||
|
</view>
|
||
|
<view class="flex-col flex-center py-78">
|
||
|
<baseMoney :money="payPriceShow" symbolSize="48" integerSize="64" decimalSize="48" color="#D64D22" weight></baseMoney>
|
||
|
<view class="flex-y-center mt-20">
|
||
|
<text class="fs-24 colorfff lh-36rpx pr-10">支付剩余时间</text>
|
||
|
<countDown
|
||
|
:is-day="false"
|
||
|
tip-text=" "
|
||
|
day-text=" "
|
||
|
hour-text=":"
|
||
|
minute-text=":"
|
||
|
second-text=" "
|
||
|
bgColor="#FFFFFF"
|
||
|
dotColor="var(--view-theme)"
|
||
|
:datatime="invalidTime"></countDown>
|
||
|
</view>
|
||
|
</view>
|
||
|
<view class="px-20">
|
||
|
<view class="bgfot rd-24rpx pay_card">
|
||
|
<view class="flex-between-center pay_item"
|
||
|
v-for="(item, index) in payTypeList" :key="index"
|
||
|
@tap="payType(item.value, index)">
|
||
|
<view class="flex-y-center">
|
||
|
<image class="w-52 h-52" :src="item.icon"></image>
|
||
|
<view class="pl-20">
|
||
|
<view class="colorfff fs-28 lh-38rpx">{{item.name}}</view>
|
||
|
<view class="fs-22 text--w111-999 lh-30rpx mt-8"
|
||
|
v-if="item.value == 'yue'">可用余额¥{{now_money}}</view>
|
||
|
<view class="fs-22 text--w111-999 lh-30rpx mt-8" v-else>{{item.title}}</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
<text class="iconfont fs-40 text--w111-999" :class="active==index ? 'icon-a-ic_CompleteSelect' : 'icon-ic_unselect'"></text>
|
||
|
</view>
|
||
|
</view>
|
||
|
</view>
|
||
|
<view class="w-full h-128 fixed-lb pb-safe flex-center">
|
||
|
<view class="w-710 h-80 flex-center rd-40rpx colorhei bg-color-huang fs-28" @click="goPay()">确认付款</view>
|
||
|
</view>
|
||
|
<view v-show="false" v-html="formContent"></view>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
import { mapGetters } from "vuex";
|
||
|
import countDown from '@/components/countDown';
|
||
|
import colors from "@/mixins/color";
|
||
|
import { getCashierOrder, orderPay } from "@/api/order";
|
||
|
import { rechargePayAPi, memberCardPayApi } from "@/api/user.js"
|
||
|
import { HTTP_REQUEST_URL } from '@/config/app';
|
||
|
export default {
|
||
|
data() {
|
||
|
return {
|
||
|
invalidTime: 0,
|
||
|
checked:false,
|
||
|
orderId: 0,
|
||
|
fromType: '',
|
||
|
active: -1,
|
||
|
payPrice: 0,
|
||
|
payPriceShow: 0,
|
||
|
now_money:'',
|
||
|
payPostage: 0,
|
||
|
offlinePostage: false,
|
||
|
invalidTime: 0,
|
||
|
initIn: false,
|
||
|
jumpData: {
|
||
|
orderId: '',
|
||
|
msg: ''
|
||
|
},
|
||
|
formContent: '',
|
||
|
cartArr: [
|
||
|
{
|
||
|
"name": "微信支付",
|
||
|
"icon": HTTP_REQUEST_URL + "/statics/images/order/wx_pay.png",
|
||
|
value: 'weixin',
|
||
|
title: '使用微信快捷支付',
|
||
|
payStatus: 1,
|
||
|
},
|
||
|
{
|
||
|
"name": "支付宝支付",
|
||
|
"icon": HTTP_REQUEST_URL + "/statics/images/order/alipay.png",
|
||
|
value: 'alipay',
|
||
|
title: '使用线上支付宝支付',
|
||
|
payStatus: 1,
|
||
|
},
|
||
|
{
|
||
|
"name": "余额支付",
|
||
|
"icon": HTTP_REQUEST_URL + "/statics/images/order/yue_pay.png",
|
||
|
value: 'yue',
|
||
|
title: '可用余额:',
|
||
|
payStatus: 1,
|
||
|
},
|
||
|
{
|
||
|
"name": "线下支付",
|
||
|
"icon": HTTP_REQUEST_URL + "/statics/images/order/xianxia_pay.png",
|
||
|
value: 'offline',
|
||
|
title: '选择线下付款方式',
|
||
|
payStatus: 2,
|
||
|
}
|
||
|
],
|
||
|
paytype:''
|
||
|
}
|
||
|
},
|
||
|
mixins: [colors],
|
||
|
components: {
|
||
|
countDown,
|
||
|
},
|
||
|
computed:{
|
||
|
...mapGetters(['cartNum']),
|
||
|
payTypeList(){
|
||
|
let list = [];
|
||
|
this.cartArr.forEach(item=>{
|
||
|
if(item.payStatus == 1){
|
||
|
list.push(item);
|
||
|
}
|
||
|
})
|
||
|
list.length && this.payType(list[0].value, 0)
|
||
|
return list
|
||
|
}
|
||
|
},
|
||
|
onLoad(options) {
|
||
|
if (options.order_id) this.orderId = options.order_id;
|
||
|
if (options.from_type) this.fromType = options.from_type;
|
||
|
this.getCashierOrder();
|
||
|
},
|
||
|
methods: {
|
||
|
fanhui(){
|
||
|
uni.navigateBack()
|
||
|
},
|
||
|
payType(paytype, index) {
|
||
|
this.active = index;
|
||
|
this.paytype = paytype;
|
||
|
if (this.offlinePostage) {
|
||
|
if (paytype == 'offline') {
|
||
|
this.payPriceShow = this.$util.$h.Sub(this.payPrice, this.payPostage);
|
||
|
} else {
|
||
|
this.payPriceShow = this.payPrice;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
getCashierOrder() {
|
||
|
getCashierOrder(this.orderId, this.fromType).then(res => {
|
||
|
if(this.fromType == 'order'){
|
||
|
uni.$emit('newCartNum',res.data.cart_info);
|
||
|
let totalNum = 0;
|
||
|
res.data.cart_info.forEach(item=>{
|
||
|
totalNum = totalNum + item.cart_num
|
||
|
})
|
||
|
let colNum = this.cartNum - totalNum;
|
||
|
this.$store.commit('indexData/setCartNum', colNum +'');
|
||
|
}
|
||
|
//微信支付是否开启
|
||
|
this.cartArr[0].payStatus = res.data.pay_weixin_open || 0
|
||
|
//支付宝是否开启
|
||
|
// #ifdef MP-WEIXIN
|
||
|
/*微信小程序环境中不允许支付宝支付*/
|
||
|
this.cartArr[1].payStatus = 0;
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
/*微信公众号环境中不允许支付宝支付*/
|
||
|
this.cartArr[1].payStatus = this.$wechat.isWeixin() ? 0 : res.data.ali_pay_status;
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
this.cartArr[1].payStatus = res.data.ali_pay_status || 0;
|
||
|
// #endif
|
||
|
//余额支付是否开启
|
||
|
this.cartArr[2].payStatus = res.data.yue_pay_status;
|
||
|
this.now_money = res.data.now_money;
|
||
|
//线下支付是否开启
|
||
|
if (res.data.offline_pay_status == 1) {
|
||
|
this.cartArr[3].payStatus = 1
|
||
|
} else {
|
||
|
this.cartArr[3].payStatus = 0
|
||
|
}
|
||
|
// 订单价格
|
||
|
this.payPrice = this.payPriceShow = res.data.pay_price
|
||
|
//剩余时间
|
||
|
this.invalidTime = res.data.invalid_time;
|
||
|
// 邮费
|
||
|
this.payPostage = res.data.pay_postage;
|
||
|
this.getShowPay();
|
||
|
}).catch(err => {
|
||
|
uni.hideLoading();
|
||
|
return this.$util.Tips({
|
||
|
title: err
|
||
|
})
|
||
|
})
|
||
|
},
|
||
|
getShowPay(){
|
||
|
//付费会员购买和余额充值不允许使用线下支付和余额支付,未开启线上支付支付的话给出提示并且返回上一页
|
||
|
//检查支付类型列表数组的payStatus是不是都是0或者2
|
||
|
const isAllPayStatusZero = this.cartArr.every(item => item.payStatus == 0 || item.payStatus == 2);
|
||
|
if(isAllPayStatusZero && ['vip','recharge'].includes(this.fromType)){
|
||
|
return this.$util.Tips({
|
||
|
title: '未开启线上支付,请联系管理员'
|
||
|
}, {
|
||
|
tab: 3,
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
goPay(){
|
||
|
let that = this;
|
||
|
if(that.active == -1) return that.$util.Tips({
|
||
|
title: '请选择付款方式'
|
||
|
});
|
||
|
if (!that.orderId) return that.$util.Tips({
|
||
|
title: '请选择要支付的订单'
|
||
|
});
|
||
|
if (that.paytype == 'yue' && parseFloat(this.now_money) < parseFloat(that.payPriceShow)) return that.$util.Tips({
|
||
|
title: '余额不足'
|
||
|
});
|
||
|
|
||
|
uni.showLoading({
|
||
|
title: '支付中'
|
||
|
});
|
||
|
|
||
|
let funApi = '';
|
||
|
if(this.fromType == 'order'){
|
||
|
funApi = orderPay({
|
||
|
uni: that.orderId,
|
||
|
paytype: that.paytype,
|
||
|
// #ifdef MP
|
||
|
'from': 'routine',
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
'from': this.$wechat.isWeixin() ? 'weixin' : 'weixinh5',
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location.port + '/pages/goods/order_pay_status/index?order_id=' + this.orderId : location.protocol + '//' + location.hostname +'/pages/goods/order_pay_status/index?order_id=' + this.orderId
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
quitUrl: '/pages/goods/order_pay_status/index?order_id=' + this.orderId
|
||
|
// #endif
|
||
|
})
|
||
|
}else if(this.fromType == 'recharge'){
|
||
|
funApi = rechargePayAPi({
|
||
|
uni: this.orderId,
|
||
|
paytype: that.paytype,
|
||
|
// #ifdef MP
|
||
|
'from': 'routine',
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
'from': this.$wechat.isWeixin() ? 'weixin' : 'weixinh5',
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
quitUrl: location.port ? location.protocol + '//' + location.hostname + ':' + location.port + '/pages/users/user_payment/index' : location.protocol + '//' + location.hostname +'/pages/users/user_payment/index'
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
quitUrl: '/pages/users/user_payment/index'
|
||
|
// #endif
|
||
|
})
|
||
|
}else if(this.fromType == 'vip'){
|
||
|
funApi = memberCardPayApi({
|
||
|
uni: this.orderId,
|
||
|
paytype: this.paytype,
|
||
|
// #ifdef MP
|
||
|
'from': 'routine',
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
'from': this.$wechat.isWeixin() ? 'weixin' : 'weixinh5',
|
||
|
quitUrl: '/pages/annex/vip_paid/index',
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
quitUrl: '/pages/annex/vip_paid/index',
|
||
|
// #endif
|
||
|
})
|
||
|
}
|
||
|
|
||
|
funApi.then(res=>{
|
||
|
let status = res.data.status,
|
||
|
orderId = res.data.result.order_id || '',
|
||
|
jsConfig = res.data.result.jsConfig;
|
||
|
//页面回调地址
|
||
|
let PageObj = {
|
||
|
'order': '/pages/goods/order_pay_status/index?order_id=' + this.orderId + '&msg=' +res.msg +'&type=3' + '&totalPrice=' + this.payPriceShow,
|
||
|
'recharge': '/pages/users/user_payment/index',
|
||
|
'vip': '/pages/annex/vip_paid/index',
|
||
|
};
|
||
|
let backUrl = PageObj[this.fromType];
|
||
|
switch (status) {
|
||
|
case 'ORDER_EXIST':
|
||
|
case 'EXTEND_ORDER':
|
||
|
case 'PAY_ERROR':
|
||
|
this.pageReject(res.msg,backUrl);
|
||
|
break;
|
||
|
case 'SUCCESS':
|
||
|
this.pageReject(res.msg,backUrl);
|
||
|
break;
|
||
|
case 'WECHAT_PAY':
|
||
|
this.wechatPayFun(jsConfig,backUrl);
|
||
|
break;
|
||
|
case 'PAY_DEFICIENCY':
|
||
|
uni.hideLoading();
|
||
|
this.pageReject(res.msg,backUrl);
|
||
|
break;
|
||
|
case "WECHAT_H5_PAY":
|
||
|
uni.hideLoading();
|
||
|
// that.$util.Tips({
|
||
|
// title: '订单创建成功!'
|
||
|
// });
|
||
|
setTimeout(() => {
|
||
|
location.href = res.data.result.jsConfig.mweb_url;
|
||
|
}, 500);
|
||
|
break;
|
||
|
|
||
|
case 'ALIPAY_PAY':
|
||
|
//#ifdef H5
|
||
|
uni.hideLoading();
|
||
|
that.formContent = res.data.result.jsConfig;
|
||
|
that.$nextTick(() => {
|
||
|
document.getElementById('alipaysubmit').submit();
|
||
|
})
|
||
|
//#endif
|
||
|
// #ifdef APP-PLUS
|
||
|
uni.requestPayment({
|
||
|
provider: 'alipay',
|
||
|
orderInfo: jsConfig,
|
||
|
success: (e) => {
|
||
|
that.pageReject('支付成功',backUrl);
|
||
|
},
|
||
|
fail: (e) => {
|
||
|
that.pageReject('支付失败',backUrl);
|
||
|
},
|
||
|
complete: () => {
|
||
|
uni.hideLoading();
|
||
|
},
|
||
|
});
|
||
|
// #endif
|
||
|
break;
|
||
|
}
|
||
|
}).catch(err=>{
|
||
|
uni.hideLoading();
|
||
|
return that.$util.Tips({
|
||
|
title: err
|
||
|
});
|
||
|
})
|
||
|
},
|
||
|
wechatPayFun(jsConfig, backUrl){
|
||
|
let that = this;
|
||
|
// #ifdef MP
|
||
|
uni.requestPayment({
|
||
|
timeStamp: jsConfig.timestamp,
|
||
|
nonceStr: jsConfig.nonceStr,
|
||
|
package: jsConfig.package,
|
||
|
signType: jsConfig.signType,
|
||
|
paySign: jsConfig.paySign,
|
||
|
success: function(res) {
|
||
|
console.log("success");
|
||
|
that.pageReject('支付成功',backUrl);
|
||
|
},
|
||
|
fail: function(e) {
|
||
|
console.log("fail");
|
||
|
that.pageReject('支付失败',backUrl);
|
||
|
},
|
||
|
})
|
||
|
// #endif
|
||
|
// #ifdef H5
|
||
|
this.$wechat.pay(jsConfig).then(res => {
|
||
|
this.pageReject('支付成功',backUrl);
|
||
|
}).catch(res => {
|
||
|
if (!this.$wechat.isWeixin()) {
|
||
|
this.pageReject('支付失败',backUrl);
|
||
|
}
|
||
|
if (res.errMsg == 'chooseWXPay:cancel') {
|
||
|
this.pageReject('取消支付',backUrl);
|
||
|
}
|
||
|
})
|
||
|
// #endif
|
||
|
// #ifdef APP-PLUS
|
||
|
uni.requestPayment({
|
||
|
provider: 'wxpay',
|
||
|
orderInfo: jsConfig,
|
||
|
success: (e) => {
|
||
|
that.pageReject('支付成功',backUrl);
|
||
|
},
|
||
|
fail: (e) => {
|
||
|
that.pageReject('支付失败',backUrl);
|
||
|
},
|
||
|
});
|
||
|
// #endif
|
||
|
},
|
||
|
pageReject(msg,backUrl){
|
||
|
uni.hideLoading();
|
||
|
return this.$util.Tips({
|
||
|
title: msg
|
||
|
}, {
|
||
|
tab: 5,
|
||
|
url: backUrl
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss">
|
||
|
/deep/ .styleAll{
|
||
|
padding: 0 6rpx;
|
||
|
border: 1rpx solid #DDDDDD;
|
||
|
border-radius: 8rpx;
|
||
|
}
|
||
|
.pay_card{
|
||
|
padding: 40rpx 32rpx;
|
||
|
}
|
||
|
.pay_item ~ .pay_item{
|
||
|
margin-top: 56rpx;
|
||
|
}
|
||
|
.icon-ic_unselect{
|
||
|
color: #ccc;
|
||
|
}
|
||
|
.icon-a-ic_CompleteSelect{
|
||
|
color: var(--view-theme)
|
||
|
}
|
||
|
</style>
|