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
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>
|