<!-- 场内支付---停车场 --> <template> <view class="parking-lock"> <view class="parking-lock-box"> <view class="parking-lock-pay"> <view class="parking-lock-title">支付停车费</view> <view class="parking-lock-tips">请您确认停车费用,确认后请支付费用,结束停车。谢谢您的使用!</view> <view class="parking-lock-info"> <view class="parking-lock-info-item" v-for="(item, index) in fieldList" :key="index"> <view>{{ item.label }}</view> <view :class="item.money ? 'really-money' : ''">{{ orderInfo[item.key] }}</view> </view> </view> <view class="parking-lock-pay-btn" v-if="orderInfo.payAmount && Number(orderInfo.payAmount) > 0"> <button type="default" @click="payMoney" :disabled="!orderInfo.id">立即支付</button> </view> <view class="parking-lock-pay-attention"> <text>温馨提示:支付完成请尽快离场,超过免费时长将会重新计费</text> </view> </view> <!-- 支付方式 --> <ChoosePayment ref="choosePayment" :curOrderList="orderList" :jumpUrl="jumpUrl" :isIndoor="true" /> </view> <u-toast ref="uToast" /> </view> </template> <script> import ChoosePayment from '@/pages/choosePayment/choosePayment.vue'; export default { components: { ChoosePayment }, data() { return { // 支付订单编号 orderList: [], // 订单信息 orderInfo: {}, // 回调地址 jumpUrl: '', // 显示的字段集合 fieldList: [ { key: 'vehicleNo', label: '车牌号' }, { key: 'parkingName', label: '停车场名称' }, { key: 'entranceName', label: '入场车道' }, { key: 'inTime', label: '入场时间' }, { key: 'freeDuration', label: '免费时长' }, { key: 'calcDuration', label: '计费时长' }, { key: 'duration', label: '累计停车时长' }, { key: 'payAmount', label: '应缴金额', money: true }, { key: 'id', label: '订单编号' } ], paramsObj: { vehicleNo: '', parkNo: '' }, timer: null, polyOrderId: undefined, // 预支付订单id isBack: 0, needPay: '' }; }, onLoad(options) { console.log('options', options); const { vehicleNo, parkNo, isBack, polyOrderId, needPay } = options; if (vehicleNo && parkNo) { // 车牌号进行base64加密解密 防止贵州银行支付报错 this.paramsObj.vehicleNo = new Buffer(vehicleNo, 'base64').toString('utf8'); this.paramsObj.parkNo = parkNo; this.isBack = isBack ?? 0; this.polyOrderId = polyOrderId; this.needPay = needPay; console.log('isBack', Number(this.isBack) !== 1); if (needPay && needPay === 'not') { this.$u.route({ url: '/pages/center/order/order', type: 'redirectTo' }); } else if (Number(this.isBack) !== 1) { this.getOrderDetails(this.paramsObj.vehicleNo, parkNo); } this.jumpUrl = `${location.origin}/#/pages/OnsitePayment/OnsitePayment?vehicleNo=${vehicleNo}&parkNo=${parkNo}&isBack=1`; console.log(this.jumpUrl); } else { uni.showModal({ title: '提示', content: '参数丢失, 返回首页', showCancel: false, success: function (res) { if (res.confirm) { uni.switchTab({ url: '/pages/index/index' }); } } }); } }, onShow() { const { isBack, polyOrderId, needPay } = this; if (Number(isBack) === 1 && polyOrderId && needPay !== 'not') { uni.showLoading({ title: '支付查询中...', mask: true }); this.timer = setInterval(() => { this.handlePayStatus(this.polyOrderId); }, 2000); } }, methods: { /** * 立即支付 * @date 2023-02-22 * @returns {any} */ payMoney() { this.$nextTick(() => { this.$refs['choosePayment'].openPopup({ ...this.orderInfo }, 'single', 'parking'); }); }, /** * 根据订单id查询订单信息 * @date 2023-02-22 * @param {any} vehicleNo * @param {any} parkNo * @returns {any} */ async getOrderDetails(vehicleNo, parkNo) { try { const { code, data } = await this.$u.api.getOrderInfoByParknoApi({ vehicleNo, parkNo }); if (code === 200) { const { id } = data; this.orderList = [id]; this.orderInfo = data; if (Number(data?.payStatus) === 1) { this.$refs.uToast.show({ title: '该订单已支付完成!', type: 'success', url: '/pages/common/paymentSuccess/paymentSuccess', callback: () => { // this.loading = false; } }); } } } catch (error) { this.showToast(error?.msg, 'error'); } }, /** * 反复查询支付状态 * @param { String } orderId */ async handlePayStatus(orderId) { try { const { code, data } = await this.$u.api.getOrderInfo({ orderId }); if (code === 200) { if (data?.payStatus === 1 || data?.payStatus === 3) { clearInterval(this.timer); this.$refs.uToast.show({ title: '该订单已支付成功!', type: 'success', url: '/pages/common/paymentSuccess/paymentSuccess', callback: () => { uni.hideLoading(); } }); } } } catch (error) { clearInterval(this.timer); uni.hideLoading(); } }, /** * @description: 显示提示信息 * @param {*} title * @param {*} type * @return {*} */ showToast(title = '操作失败', type = 'error') { this.$refs.uToast.show({ title, type }); } } }; </script> <style lang="scss" scoped> @import './OnsitePayment.scss'; </style>