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.
 
 
 
 

262 lines
6.0 KiB

<template>
<view class="app">
<view v-if="!openExamine">
<view class="page-tit">
<text>充值金额</text>
</view>
<view class="price-list">
<view
class="p-item center"
:class="{active: item.checked}"
v-for="(item, index) in moneyList"
:key="index"
@click="checkePrice(item)"
>
<text>{{ item.money }}元</text>
</view>
</view>
<view class="input-wrap row">
<text>其他金额</text>
<input v-model="money" type="number" maxlength="10" class="input" placeholder="请输入其他金额" placeholder-style="color: #999" />
</view>
<view class="page-tit">
<text class="f-b">选择支付方式</text>
</view>
<view class="cell row b-b" @click="checkType('wxpay')">
<image class="icon" :src="'/static/icon/wxpay.png'"></image>
<view class="column fill">
<text class="tit">微信支付</text>
</view>
<text v-if="curType === 'wxpay'" class="mix-icon icon-xuanzhong"></text>
</view>
<!-- #ifndef MP-WEIXIN -->
<view class="cell row b-b" @click="checkType('alipay')">
<image class="icon" :src="'/static/icon/alipay.png'"></image>
<view class="column fill">
<text class="tit">支付宝</text>
</view>
<text v-if="curType === 'alipay'" class="mix-icon icon-xuanzhong"></text>
</view>
<!-- #endif -->
<mix-button ref="confirmBtn" text="确认充值" marginTop="80rpx" @onConfirm="confirm"></mix-button>
</view>
<mix-empty v-else></mix-empty>
<mix-loading v-if="isLoading" :mask="true"></mix-loading>
<!-- 支付成功面板 -->
<success-modal ref="successModal" :price="payPrice" btnText="确定" tip="余额充值成功" @onConfirm="successCallback"></success-modal>
</view>
</template>
<script>
import successModal from './components/success-modal.vue'
export default {
components:{
successModal
},
data() {
return {
curType: 'wxpay',
moneyList: [
{money: 50, checked: true},
{money: 100, checked: false},
{money: 200, checked: false},
{money: 500, checked: false},
],
money: '',
payPrice: 0,
}
},
computed: {
openExamine(){
return this.$store.state.openExamine;
}
},
watch: {
money(val){
if(val){
this.moneyList.forEach(item=> {
item.checked = false;
})
}
}
},
onLoad() {
if(!this.openExamine){
uni.setNavigationBarTitle({
title: '余额充值'
})
}else{
uni.setNavigationBarTitle({
title: '消费明细'
})
}
},
methods: {
confirm(){
let {curType, moneyList, money} = this;
const mIndex = moneyList.findIndex(item=> item.checked);
if(!money && mIndex === -1){
this.$util.msg('请选择或输入充值金额');
this.$refs.confirmBtn.stop();
return;
}
money = this.money || this.moneyList[mIndex].money;
if(isNaN(money)){
this.$util.msg('请输入正确的充值金额');
this.$refs.confirmBtn.stop();
return;
}
this.$util.throttle(()=>{
this.wxpay((+money).toFixed(2));
})
},
//微信支付
async wxpay(money){
const res = await this.$request('payment', 'recharge', {
money: +money,
pay_type: 'wxpay',
// #ifdef MP-WEIXIN
code: await this.getMpCode('weixin'),
// #endif
}, {showLoading: true})
this.log(res)
if(res.status !== 1){
this.$refs.confirmBtn.stop();
this.$util.msg(res.msg);
return;
}
const orderInfo = res.data.orderInfo;
const {timeStamp, nonceStr, paySign} = orderInfo;
const payParams = {
provider: this.curType,
orderInfo: res.data.orderInfo,
timeStamp,
nonceStr,
package: orderInfo.package,
signType: 'MD5',
paySign,
success: e=>{
this.payPrice = money;
this.$refs.confirmBtn.death();
this.$refs.successModal.open();
},
fail: err=>{
this.$refs.confirmBtn.stop();
if(err.errMsg.indexOf('取消') > -1 || err.errMsg.indexOf('cancel') >1 || err.errMsg.indexOf('-2') > -1){
this.$util.msg('取消支付');
}else{
this.$util.msg('支付遇到错误,请稍候重试');
console.log(err);
}
}
};
uni.requestPayment(payParams);
},
//统一支付回调
successCallback(){
this.$store.dispatch('getUserInfo');
uni.navigateBack();
},
checkePrice(item){
this.moneyList.forEach(item=> {
item.checked = false;
})
this.money = '';
item.checked = true;
},
checkType(type){
this.curType = type;
},
//获取小程序code
// #ifdef MP
getMpCode(provider){
return new Promise((resolve)=>{
uni.login({
provider,
success(res) {
resolve(res.code)
}
})
})
}
// #endif
}
}
</script>
<style scoped lang="scss">
.page-tit{
padding: 40rpx 0 30rpx 40rpx;
font-size: 32rpx;
color: #333;
line-height: 48rpx ;
font-weight: 700;
}
.price-list{
display: flex;
flex-wrap: wrap;
padding-left: 40rpx;
.p-item{
width: 160rpx;
height: 78rpx;
border-radius: 14rpx;
margin-bottom: 20rpx;
margin-right: 10rpx;
background-color: #efefef;
font-size: 28rpx;
color: #999;
border: 1rpx solid #d7d7d7;
&.active{
background:linear-gradient(131deg, #ff7e94, #fb4361);
color: #fff;
border: 0;
}
}
}
.input-wrap{
height: 130rpx;
padding: 10rpx 40rpx 0;
font-size: 32rpx;
color: #333;
.input{
flex: 1;
text-align: right;
font-size: 28rpx;
color: #333;
}
}
.cell{
margin: 0 40rpx;
height: 124rpx;
.icon{
width: 40rpx;
height: 40rpx;
margin-right: 32rpx;
}
.tit{
flex: 1;
font-size: 30rpx;
color: #333;
font-weight: 700;
}
.tip{
margin-top: 14rpx;
font-size: 24rpx;
color: #999;
}
.icon-xuanzhong{
font-size: 36rpx;
color: $base-color;
}
}
</style>