Files
jianbing/pages/recharge/recharge.vue
2025-05-09 13:58:42 +08:00

334 lines
6.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<view class="bg-white u-m-32 u-p-32 br16 block">
<view class="nr">充值金额</view>
<view class="u-m-t-16">
<text class="price">{{ amount }}</text>
<text class="bold-400 nr u-m-l-16"></text>
</view>
<view class="u-m-t-32 xs">
<text class="recharge">充值金额</text>
<text>{{amount}}</text>
</view>
</view>
<view class="bg-white u-m-32 u-p-32 br16 block payment">
<view class="nr">选择支付方式</view>
<view class="payment-main">
<view class="payway-container u-skeleton-fillet">
<!-- Payway -->
<u-radio-group v-model="payway" style="width: 100%;">
<view class="payway">
<view class="payway-item" v-for="(item, index) in paywayList" :key="item.id"
@click="changePayway(item.pay_way)">
<u-image :src="item.icon" width="48" height="48" mode="scaleToFill" />
<view class="payway-item-content">
<text class="payway-item-content-name">{{ item.name }}</text>
<text class="payway-item-content-tips">{{ item.extra }}</text>
</view>
<u-radio shape="circle" :name="item.pay_way" :active-color="themeColor" />
</view>
</view>
</u-radio-group>
<template v-if="!paywayList.length">
<view class="payway-empty">暂无支付方式</view>
</template>
</view>
</view>
</view>
<view class="fixed left-0 right-0 bottom-0 u-m-64">
<u-button @click="handlePrepay" hover-class="none" :customStyle="{height: '76rpx', backgroundColor: themeColor, color: '#fff', border: 'none', borderRadius: '100rpx'}" :hair-line="false">立即支付</u-button>
</view>
</view>
</template>
<script>
import {prepay, getPayway} from '@/api/app'
import {
wxpay,
alipay
} from '@/utils/pay'
export default {
data() {
return {
pay: {
weixin: 0,
alipay: 0
},
from: '', // 订单来源
order_id: '', // 订单ID
amount: 0, // 支付金额
timeout: 0, // 倒计时间戳
payway: '', // 支付方式
paywayList: [], // 支付方式列表
}
},
onLoad(options) {
const from = options.from
const order_id = options.order_id
try {
if (!from && !order_id) throw new Error('页面参数有误')
this.from = from
this.order_id = order_id
this.initPageData()
} catch (err) {
console.log(err)
uni.navigateBack()
}
},
onUnload() {
this.handPayResult('fail')
},
methods: {
// 更改支付方式
changePayway(value) {
this.$set(this, 'payway', value)
},
// 初始化页面数据
initPageData() {
// 获取支付方式
getPayway({
from: this.from,
order_id: this.order_id,
}).then(res => {
if (res.code != 1) throw new Error(res.msg)
return res.data
}).then(data => {
this.loadingSkeleton = false
this.amount = data.order_amount
this.paywayList = data.pay
this.payway = this.paywayList[0]?.pay_way
// 倒计时
const startTimestamp = new Date().getTime() / 1000
const endTimestamp = data.cancel_time * 1
this.timeout = endTimestamp - startTimestamp
}).catch(err => {
throw new Error(err)
})
},
// 预支付处理
handlePrepay() {
if (this.loadingPay) return
this.loadingPay = true
prepay({
from: this.from,
order_id: this.order_id,
pay_way: this.payway,
}).then(({
code,
data
}) => {
switch (code) {
case 1:
this.handleWechatPay(data);
break;
case 10001:
this.handleAlipayPay(data);
break;
case 20001:
this.handleWalletPay();
break;
}
}).catch(err => {
}).finally(() => {
setTimeout(() => {
this.loadingPay = false
}, 500)
})
},
// 微信支付
handleWechatPay(data) {
wxpay(data).then(res => {
console.log("wechat res>>>", res);
this.handPayResult(res)
})
},
// 支付宝支付
handleAlipayPay(data) {
alipay(data).then(res => {
console.log("alipay res>>>", res);
this.handPayResult(res)
})
},
// 钱包余额支付
handleWalletPay() {
console.log('支付成功')
//余额支付成功
this.handPayResult('success')
},
// 支付后处理
handPayResult(result) {
switch (result) {
case 'success':
uni.$emit('payment', {
result: true,
order_id: this.order_id
});
break;
case 'fail':
default:
uni.$emit('payment', {
result: false,
order_id: this.order_id
})
}
// // 页面出栈
// uni.showLoading({
// title: '加载中',
// mask: true
// })
// //记录支付结果
// setTimeout(() => {
// uni.hideLoading()
// uni.navigateBack()
// }, 500)
}
}
}
</script>
<style lang="scss">
.block {
box-shadow: 0rpx 10rpx 10rpx -6rpx rgba(0,0,0,0.1), 0rpx 16rpx 20rpx 2rpx rgba(0,0,0,0.06), 0rpx 6rpx 28rpx 4rpx rgba(0,0,0,0.05);
}
.price {
font-size: 48rpx;
}
.unit {
color: #1f1f1f;
}
.recharge {
color: rgba(0, 0, 0, 0.6);
}
.payment {
display: flex;
flex-direction: column;
height: calc(100% - env(safe-area-inset-bottom));
&-header {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 300rpx;
background: linear-gradient(270deg, #355883 0%, #254062 100%);
color: #FFFFFF;
}
&-main {
flex: 1;
overflow: hidden;
}
&-footer {
display: flex;
align-items: center;
height: 100rpx;
padding: 0 20rpx;
background-color: #FFFFFF;
}
.payway-container {
border-radius: 7px;
background-color: #FFFFFF;
.payway-empty {
display: flex;
justify-content: center;
padding: 20rpx 0;
font-size: 26rpx;
color: $-color-muted;
}
}
.payway {
width: 100%;
&-item {
width: 100%;
display: flex;
align-items: center;
height: 120rpx;
&:nth-child(n+2) {
border-top: $-dashed-border;
}
&-content {
flex: 1;
display: flex;
flex-direction: column;
margin-left: 16rpx;
&-name {
font-size: 28rpx;
color: $-color-black;
}
&-tips {
font-size: 22rpx;
color: $-color-muted;
}
}
}
}
&-count-down {
display: flex;
justify-content: center;
align-items: center;
padding: 7rpx 25rpx;
border-radius: 60px;
margin-top: 10rpx;
font-size: 22rpx;
background-color: #FFFFFF;
color: $-color-normal;
}
&-submit {
flex: 1;
position: relative;
display: flex;
justify-content: center;
align-items: center;
height: 74rpx;
font-size: 28rpx;
border-radius: 60px;
background: linear-gradient(270deg, #355883 0%, #254062 100%);
color: #FFFFFF;
&--disabled::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
height: 100%;
display: block;
content: "";
background: rgba(255, 255, 255, .3) !important;
}
}
}
</style>