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.
251 lines
6.4 KiB
251 lines
6.4 KiB
<template>
|
|
<view class="app column">
|
|
<view class="price-wrapper center column">
|
|
<text>支付金额</text>
|
|
<text class="price">{{ data.pay_price | price(2) }}</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 -->
|
|
<view class="cell row b-b" @click="checkType('balance')">
|
|
<image class="icon" :src="'/static/icon/balance.png'"></image>
|
|
<view class="column fill">
|
|
<text class="tit">余额</text>
|
|
<text class="tip">账户可用余额 ¥{{ userInfo.money | price }}</text>
|
|
</view>
|
|
<text v-if="curType === 'balance'" class="mix-icon icon-xuanzhong"></text>
|
|
</view>
|
|
|
|
<mix-button ref="confirmBtn" text="确认支付" marginTop="80rpx" @onConfirm="confirm"></mix-button>
|
|
<!-- 支付成功面板 -->
|
|
<success-modal ref="successModal" :price="data.pay_price" @onConfirm="successCallback"></success-modal>
|
|
<!-- 支付密码键盘 -->
|
|
<pay-password-keyboard ref="pwdKeyboard" @onConfirm="balancePay"></pay-password-keyboard>
|
|
|
|
<mix-loading v-if="isLoading" :mask="true"></mix-loading>
|
|
|
|
<mix-modal ref="mixModal" text="您还没有设置支付密码" confirmText="立即设置" @onConfirm="navTo('/pages/auth/payPassword')"></mix-modal>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import successModal from './components/success-modal.vue'
|
|
export default {
|
|
components: {
|
|
successModal
|
|
},
|
|
data() {
|
|
return {
|
|
curType: 'wxpay',
|
|
data: {
|
|
/* order_id: '5f1534f0bb1edd0001a93a2c',
|
|
pay_price: 450,
|
|
sourcePage: 'createOrder' */
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
userInfo(){
|
|
return this.$store.state.userInfo;
|
|
}
|
|
},
|
|
onLoad(options) {
|
|
const data = JSON.parse(options.data);
|
|
this.data = data;
|
|
},
|
|
methods: {
|
|
confirm(){
|
|
this.$util.throttle(()=>{
|
|
if(this.curType === 'balance'){
|
|
if(!this.userInfo.money || this.userInfo.money < this.data.pay_price){
|
|
this.$util.msg('余额不足');
|
|
this.$refs.confirmBtn.stop();
|
|
return;
|
|
}
|
|
if(!this.userInfo.pay_password){
|
|
this.$refs.mixModal.open();
|
|
this.$refs.confirmBtn.stop();
|
|
return;
|
|
}
|
|
//余额支付 打开支付密码键盘
|
|
this.$refs.pwdKeyboard.open();
|
|
this.$refs.confirmBtn.stop();
|
|
}else{
|
|
this.payByUnipay();
|
|
}
|
|
})
|
|
},
|
|
//余额支付 提交支付
|
|
async balancePay(pwd){
|
|
const res = await this.$request('order', 'payOrder', {
|
|
order_id: this.data.order_id,
|
|
pay_password: pwd,
|
|
pay_type: this.curType
|
|
}, {showLoading: true})
|
|
if(res.status === 1){
|
|
this.$store.dispatch('getUserInfo');
|
|
this.$refs.pwdKeyboard.close();
|
|
this.$refs.successModal.open();
|
|
}else{
|
|
this.$util.msg(res.msg);
|
|
this.$refs.pwdKeyboard.pwd = '';
|
|
}
|
|
},
|
|
//unipay
|
|
async payByUnipay(){
|
|
// #ifdef H5
|
|
this.$util.msg('h5支付功能正在开发中,请使用小程序或app支付');
|
|
this.$refs.confirmBtn.stop();
|
|
return;
|
|
// #endif
|
|
const res = await this.$request('order', 'payOrder', {
|
|
order_id: this.data.order_id,
|
|
pay_type: this.curType,
|
|
// #ifdef MP-WEIXIN
|
|
code: await this.getMpCode('weixin'),
|
|
// #endif
|
|
}, {showLoading: true})
|
|
if(res.status !== 1){
|
|
this.$refs.confirmBtn.stop();
|
|
console.log(res);
|
|
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.$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);
|
|
}
|
|
}
|
|
};
|
|
console.log(payParams);
|
|
uni.requestPayment(payParams);
|
|
},
|
|
//统一支付成功回调
|
|
successCallback(){
|
|
switch(this.data.sourcePage){
|
|
case 'createOrder':
|
|
uni.redirectTo({
|
|
url: '/pages/order/detail?id=' + this.data.order_id
|
|
})
|
|
break;
|
|
case 'orderList':
|
|
this.$util.prePage().refreshList(false);
|
|
uni.redirectTo({
|
|
url: '/pages/order/detail?id=' + this.data.order_id
|
|
})
|
|
break;
|
|
case 'orderDetail':
|
|
this.$util.prePage().loadData();
|
|
uni.navigateBack();
|
|
break;
|
|
}
|
|
},
|
|
//选择支付方式
|
|
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">
|
|
.app{
|
|
padding: 0 80rpx;
|
|
align-items: center;
|
|
|
|
/deep/{
|
|
.mix-btn-content{
|
|
width: 560rpx;
|
|
}
|
|
}
|
|
}
|
|
.price-wrapper {
|
|
background-color: #fff;
|
|
height: 260rpx;
|
|
font-size: 28rpx;
|
|
color: #909399;
|
|
|
|
.price{
|
|
font-size: 56rpx;
|
|
color: #333;
|
|
margin-top: 20rpx;
|
|
font-weight: 600;
|
|
|
|
&:before{
|
|
content: '¥';
|
|
font-size: 40rpx;
|
|
}
|
|
}
|
|
}
|
|
.cell{
|
|
width: 100%;
|
|
height: 124rpx;
|
|
|
|
.icon{
|
|
width: 44rpx;
|
|
height: 44rpx;
|
|
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>
|