appointment_weapp/pages/order/paymentorder.vue

556 lines
12 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 class="container" :style="[theme]">
<view class="card">
<view class="info-wrap flex-colum">
<image class="cover" :src="list.store_avatar" mode="aspectFill"></image>
<text class="t">{{list.store_nickname}}</text>
</view>
<view class="input-wrap">
<view class="input-cont">
<text class="i"></text>
<input class="num" type="text" v-model="amount" :readonly="true" @input="checkNum($event)" />
</view>
<!-- <view class="tips"><input class="input" type="text" :maxlength="10" placeholder="添加付款备注最多10个字" v-model="remark" /></view> -->
</view>
</view>
<view class="card">
<view class="title"><text>支付方式</text></view>
<view class="pay-list">
<view class="item flex-between">
<view class="label">
<image class="icon" src="@/static/ye.png" mode="aspectFit"></image>
<view class="t flex-colum-start">
<text class="t_one">会员卡支付</text>
<text class="t_tow" style="color: #5B8FF9;">当前余额:{{list.user_balance}}</text>
</view>
</view>
<u-icon name="checkmark-circle-fill" size="18" color="#54A347" v-if="pay_type==2"></u-icon>
<view @click="pay_typeclick(2)"
style="border-radius: 50%; width:32rpx;height:32rpx;border: 1rpx solid #ccc;" v-else></view>
</view>
</view>
<!-- #ifdef MP-WEIXIN -->
<view class="pay-list">
<view class="item flex-between">
<view class="label">
<image class="icon" src="@/static/4.png" mode="aspectFit"></image>
<view class="t flex-colum-start">
<text class="t_one">微信支付</text>
<text class="t_tow">使用微信支付</text>
</view>
</view>
<u-icon name="checkmark-circle-fill" size="20" color="#54A347" v-if="pay_type==1"></u-icon>
<view @click="pay_typeclick(1)"
style="border-radius: 50%; width:32rpx;height:32rpx;border: 1rpx solid #ccc;" v-else></view>
</view>
</view>
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<view class="pay-list">
<view class="item flex-between">
<view class="label">
<image class="icon" src="@/static/4.png" mode="aspectFit"></image>
<view class="t flex-colum-start">
<text class="t_one">支付宝支付</text>
<text class="t_tow">使用支付宝支付</text>
</view>
</view>
<u-icon name="checkmark-circle-fill" size="20" color="#54A347" v-if="pay_type==1"></u-icon>
<view @click="pay_typeclick(1)"
style="border-radius: 50%; width:32rpx;height:32rpx;border: 1rpx solid #ccc;" v-else></view>
</view>
</view>
<!-- #endif -->
</view>
<view class="btn-wrap" v-if="mobiles">
<view class="btn" @click="showpopupclick"><text>确认支付</text></view>
</view>
<view v-else class="btn-wrap">
<button class="btn" style="padding: 0;" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber"><text>确认支付</text></button>
</view>
<u-popup :show="showpopup" @close="closepopup" @open="openpopup" mode="center" :round="10">
<view class="u-popupflex-colum flex-colum">
<view class="u-popupflex-columview">
请输入支付密码
</view>
<u-code-input v-model="ucodeinputvalue" :maxlength="6" dot :focus="true"
@finish="finish"></u-code-input>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
showpopup: false,
ucodeinputvalue: '',
amount: "",
pay_type: 1,
list: '',
mobiles: uni.cache.get('loginuser').userinfo.mobile,
};
},
async onLoad(options) {
this.reservationpaythebill()
},
computed: {
theme() {
return this.$store.getters.theme
},
},
onShow() {
this.$store.dispatch('storeuseruserinfo')
},
methods: {
async getPhoneNumber(res) { // 获取手机号
var resdataa = res
// #ifdef MP-WEIXIN
uni.login({
provider: 'weixin',
success: async (data) => {
let resdata = await this.api.usergetwechatphone({
code: data.code,
iv: resdataa.detail.iv,
encryptedData: resdataa.detail.encryptedData
})
try {
this.mobiles = resdata.mobile
} catch (e) {
uni.showToast({
title: '获取失败'
})
}
}
});
// #endif
},
// 方法
checkNum(e) {
let val = e.target.value.replace(/(^\s*)|(\s*$)/g, "")
console.log(val);
if (!val) {
this.amount = '';
return
}
var reg = /[^\d.]/g
// 只能是数字和小数点,不能是其他输入
val = val.replace(reg, "")
// // 保证第一位只能是数字,不能是点
val = val.replace(/^\./g, "");
// // 小数只能出现1位
val = val.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
// // 小数点后面保留2位
val = val.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
console.log(val);
this.$nextTick(() => {
this.amount = val;
})
},
pay_typeclick(e) {
this.pay_type = e
},
async reservationpaythebill() {
let res = await this.api.reservationpaythebill({
store_id: uni.cache.get('store_id') // 判断显示哪家的作品
})
this.list = res
},
openpopup() {
console.log('open');
},
closepopup() {
this.ucodeinputvalue = ''
this.showpopup = false
},
finish(e) {
this.showpopup = false
this.reservationmakenowsub()
},
async showpopupclick() {
if (this.amount == null || this.amount == '') {
uni.showToast({
title: '支付金额不能为0',
icon: 'none'
});
return false;
}
if (this.pay_type == 1) {
this.reservationmakenowsub()
}
if (this.pay_type == 2) {
let res = await this.api.useruserinfo() //p判断是否完成手机号
uni.cache.set('loginuser', res);
if (res.userinfo.mobile) {
if (this.list.user_sec_password == 0) {
uni.showModal({
title: '提示',
content: '您目前没有设置密码,请先设置支付密码',
success: function(res) {
if (res.confirm) {
uni.redirectTo({
url: '/pages/my/setup/repairpassword'
});
} else if (res.cancel) {}
}
});
} else {
this.showpopup = true
}
} else {
uni.showModal({
title: '提示',
content: '确认订单需要获取您的手机号',
success: function(res) {
if (res.confirm) {
uni.redirectTo({
url: '/pages/my/setup/index'
});
} else if (res.cancel) {}
}
});
}
}
},
async reservationmakenowsub() {
uni.showLoading({
title: '加载中',
mask: true
})
try {
var res = await this.api.reservationpaythebillsub({
store_id: uni.cache.get('store_id'), // 判断显示哪家的作品
amount: this.amount,
pay_type: this.pay_type,
sec_password: this.ucodeinputvalue
})
this.ucodeinputvalue = ''
if (res.pay_status == 0) {
// #ifdef MP-WEIXIN
uni.requestPayment({
provider: 'wxpay', //支付类型-固定值
partnerid: res.pay_data.payAppId, // 微信支付商户号
timeStamp: res.pay_data.payTimeStamp, // 时间戳(单位:秒)
nonceStr: res.pay_data.paynonceStr, // 随机字符串
package: res.pay_data.payPackage, // 固定值
signType: res.pay_data.paySignType, //固定值
paySign: res.pay_data.paySign, //签名
success: (res) => {
uni.hideLoading()
uni.showToast({
title: "支付成功"
})
setTimeout(res => {
uni.navigateBack()
}, 1500)
},
fail: (err) => {
setTimeout(res => {
uni.showToast({
icon: 'none',
title: '支付失败'
})
uni.hideLoading()
}, 2000)
}
});
// #endif
} else {
uni.hideLoading()
uni.showToast({
title: "支付成功"
})
setTimeout(res => {
uni.navigateBack()
}, 1500)
}
} catch (e) {
}
},
}
};
</script>
<style scoped lang="scss">
page {
background: #f8f7f7;
}
.u-popupflex-colum {
padding: 80rpx 40rpx;
border-radius: 50rpx;
background: #FFFFFF;
.u-popupflex-columview {
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #000;
font-weight: bold;
margin-bottom: 50rpx;
}
}
.btn-wrap {
width: 100%;
position: fixed;
bottom: 50rpx;
left: 0;
padding: 28upx 28upx calc(env(safe-area-inset-bottom) + 28upx);
.btn {
padding: 20upx 0;
background: var(--bg-color-button);
border-radius: 34rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
display: flex;
justify-content: center;
button::after {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
button {
background-color: transparent !important;
padding: 0 !important;
color: #FFFFFF;
line-height: inherit !important;
margin: 0 !important;
width: 100% !important;
font-weight: 500 !important;
border-radius: none !important;
}
}
}
.container {
padding: 28upx;
padding-bottom: 640upx;
}
.card {
padding: 28upx;
border-radius: 28upx;
background-color: #fff;
margin-bottom: 28upx;
.title {
font-size: 32upx;
}
}
.info-wrap {
display: flex;
align-items: center;
.cover {
$size: 80upx;
width: $size;
height: $size;
border-radius: 50%;
margin-right: 20upx;
background-color: #efefef;
}
.t {
font-size: 32upx;
}
}
.input-wrap {
padding: 28upx 0 0;
.input-cont {
display: flex;
align-items: center;
border-bottom: 1upx solid #ececec;
.i {
font-size: 42upx;
font-weight: bold;
margin-right: 12upx;
position: relative;
top: -4upx;
}
.num {
font-size: 48upx;
height: 80upx;
font-weight: bold;
position: relative;
padding-right: 14upx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.tips {
display: flex;
padding-top: 24upx;
.input {
flex: 1;
}
}
}
.pay-list {
.item {
padding: 28upx 0;
.label {
display: flex;
align-items: center;
.icon {
$size: 42upx;
width: $size;
height: $size;
margin-right: 20upx;
}
.t {
.t_one {
font-size: 28rpx;
font-family: SourceHanSansCN-Regular, SourceHanSansCN;
font-weight: 400;
color: #333333;
}
.t_tow {
font-size: 24rpx;
font-family: SourceHanSansCN-Regular, SourceHanSansCN;
font-weight: 400;
color: #999999;
}
}
}
}
}
.num-wrap {
display: flex;
align-items: center;
justify-content: flex-end;
.t {
font-size: 32upx;
}
.b {
font-weight: bold;
}
}
.number-key-wrap {
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #efefef;
z-index: 999;
padding: 28upx 28upx calc(env(safe-area-inset-bottom) + 28upx);
border-radius: 28upx 28upx 0 0;
$gap: 12upx;
$radius: 14upx;
$itemH: 120upx;
.number-key {
display: flex;
.item {
display: flex;
font-size: 48upx;
font-weight: bold;
align-items: center;
justify-content: center;
border-radius: $radius;
background-color: #fff;
&.active {
background-color: #d9d9d9;
}
}
.left {
flex: 1;
.num-list {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: $itemH $itemH $itemH;
grid-gap: $gap;
}
.num-foot {
padding-top: $gap;
display: grid;
grid-gap: $gap;
grid-template-columns: 2fr 1fr;
grid-template-rows: $itemH;
}
}
.right {
width: 160upx;
display: flex;
flex-direction: column;
margin-left: $gap;
.item {
flex: 1;
&:last-child {
margin-top: $gap;
font-size: 32upx;
}
&.confirm {
background-color: #ffcc17;
&.active {
background-color: #e1b516;
}
}
}
}
}
}
.success-wrap {
padding: 0 28upx calc(env(safe-area-inset-bottom) + 28upx);
.title {
padding: 28upx 0;
font-size: 32upx;
font-weight: bold;
display: flex;
justify-content: center;
}
.content {
.img {
width: 100%;
height: auto;
}
}
.btn {
padding: 12upx 0;
border-radius: 100upx;
font-size: 28upx;
background: #ffcc17;
color: #000;
}
}
</style>