315 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Vue
		
	
	
<template>
 | 
						|
	<view>
 | 
						|
		<view class="payment" :class="pay_close ? 'on' : ''">
 | 
						|
			<view class="title acea-row row-center-wrapper">
 | 
						|
				选择付款方式<text class="iconfont icon-guanbi" @click='close'></text>
 | 
						|
			</view>
 | 
						|
			<view class="item acea-row row-between-wrapper" @click='goPay(item.number || 0 , item.value)'
 | 
						|
				v-for="(item,index) in payMode" :key="index">
 | 
						|
				<view class="left acea-row row-between-wrapper">
 | 
						|
					<view class="iconfont" :class="item.icon"></view>
 | 
						|
					<view class="text">
 | 
						|
						<view class="name">{{item.name}}</view>
 | 
						|
						<view class="info" v-if="item.number">
 | 
						|
							{{item.title}} <span class="money">¥{{ item.number }}</span>
 | 
						|
						</view>
 | 
						|
						<view class="info" v-else>{{item.title}}</view>
 | 
						|
					</view>
 | 
						|
				</view>
 | 
						|
				<view class="iconfont icon-xiangyou"></view>
 | 
						|
			</view>
 | 
						|
		</view>
 | 
						|
		<view class="mask" @click='close' v-if="pay_close"></view>
 | 
						|
	</view>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
	import {
 | 
						|
		orderPay,
 | 
						|
		wechatOrderPay,
 | 
						|
		wechatQueryPayResult
 | 
						|
	} from '@/api/order.js';
 | 
						|
	import {
 | 
						|
		mapGetters
 | 
						|
	} from "vuex";
 | 
						|
	export default {
 | 
						|
		props: {
 | 
						|
			payMode: {
 | 
						|
				type: Array,
 | 
						|
				default: function() {
 | 
						|
					return [];
 | 
						|
				}
 | 
						|
			},
 | 
						|
			pay_close: {
 | 
						|
				type: Boolean,
 | 
						|
				default: false,
 | 
						|
			},
 | 
						|
			order_id: {
 | 
						|
				type: String,
 | 
						|
				default: ''
 | 
						|
			},
 | 
						|
			totalPrice: {
 | 
						|
				type: String,
 | 
						|
				default: '0'
 | 
						|
			}
 | 
						|
		},
 | 
						|
		data() {
 | 
						|
			return {
 | 
						|
 | 
						|
			};
 | 
						|
		},
 | 
						|
		computed: mapGetters(['systemPlatform']),
 | 
						|
		methods: {
 | 
						|
			close: function() {
 | 
						|
				this.$emit('onChangeFun', {
 | 
						|
					action: 'payClose'
 | 
						|
				});
 | 
						|
			},
 | 
						|
			goPay: function(number, paytype) {
 | 
						|
				let that = this;
 | 
						|
				let goPages = '/pages/order_pay_status/index?order_id=' + that.order_id;
 | 
						|
				if (!that.order_id) return that.$util.Tips({
 | 
						|
					title: '请选择要支付的订单'
 | 
						|
				});
 | 
						|
				if (paytype == 'yue' && parseFloat(number) < parseFloat(that.totalPrice)) return that.$util.Tips({
 | 
						|
					title: '余额不足!'
 | 
						|
				});
 | 
						|
				uni.showLoading({
 | 
						|
					title: '支付中'
 | 
						|
				});
 | 
						|
				wechatOrderPay({
 | 
						|
					orderNo: that.order_id,
 | 
						|
					// #ifdef MP
 | 
						|
					payChannel: 'routine',
 | 
						|
					// #endif
 | 
						|
					// #ifdef H5
 | 
						|
					payChannel: that.$wechat.isWeixin() ? 'public' : 'weixinh5',
 | 
						|
					// #endif
 | 
						|
					payType: paytype
 | 
						|
				}).then(res => {
 | 
						|
					let jsConfig = res.data.jsConfig;
 | 
						|
					that.order_id = res.data.orderNo;
 | 
						|
					switch (res.data.payType) {
 | 
						|
						case 'weixin':
 | 
						|
							// #ifdef MP
 | 
						|
							uni.requestPayment({
 | 
						|
								timeStamp: jsConfig.timeStamp,
 | 
						|
								nonceStr: jsConfig.nonceStr,
 | 
						|
								package: jsConfig.packages,
 | 
						|
								signType: jsConfig.signType,
 | 
						|
								paySign: jsConfig.paySign,
 | 
						|
								success: function(ress) {
 | 
						|
									uni.hideLoading();
 | 
						|
									wechatQueryPayResult(that.order_id).then(res => {
 | 
						|
										uni.hideLoading();
 | 
						|
										return that.$util.Tips({
 | 
						|
											title: "支付成功",
 | 
						|
											icon: 'success'
 | 
						|
										}, () => {
 | 
						|
											that.$emit('onChangeFun', {
 | 
						|
												action: 'pay_complete'
 | 
						|
											});
 | 
						|
										});
 | 
						|
									}).cache(err => {
 | 
						|
										uni.hideLoading();
 | 
						|
										return that.$util.Tips({
 | 
						|
											title: err
 | 
						|
										});
 | 
						|
									})
 | 
						|
								},
 | 
						|
								fail: function(e) {
 | 
						|
									uni.hideLoading();
 | 
						|
									return that.$util.Tips({
 | 
						|
										title: '取消支付'
 | 
						|
									}, () => {
 | 
						|
										that.$emit('onChangeFun', {
 | 
						|
											action: 'pay_fail'
 | 
						|
										});
 | 
						|
									});
 | 
						|
								},
 | 
						|
								complete: function(e) {
 | 
						|
									uni.hideLoading();
 | 
						|
									if (e.errMsg == 'requestPayment:cancel') return that.$util
 | 
						|
										.Tips({
 | 
						|
											title: '取消支付'
 | 
						|
										}, () => {
 | 
						|
											that.$emit('onChangeFun', {
 | 
						|
												action: 'pay_fail'
 | 
						|
											});
 | 
						|
										});
 | 
						|
								},
 | 
						|
							})
 | 
						|
							// #endif
 | 
						|
							// #ifdef H5
 | 
						|
							let datas = {
 | 
						|
								timestamp: jsConfig.timeStamp,
 | 
						|
								nonceStr: jsConfig.nonceStr,
 | 
						|
								package: jsConfig.packages,
 | 
						|
								signType: jsConfig.signType,
 | 
						|
								paySign: jsConfig.paySign
 | 
						|
							};
 | 
						|
							that.$wechat.pay(datas).then(res => {
 | 
						|
								if (res.errMsg == 'chooseWXPay:cancel') {
 | 
						|
									uni.hideLoading();
 | 
						|
									return that.$util.Tips({
 | 
						|
										title: '支付失败'
 | 
						|
									});
 | 
						|
								} else {
 | 
						|
									wechatQueryPayResult(that.order_id).then(res => {
 | 
						|
										uni.hideLoading();
 | 
						|
										return that.$util.Tips({
 | 
						|
											title: "支付成功",
 | 
						|
											icon: 'success'
 | 
						|
										}, () => {
 | 
						|
											that.$emit('onChangeFun', {
 | 
						|
												action: 'pay_complete'
 | 
						|
											});
 | 
						|
										});
 | 
						|
									}).cache(err => {
 | 
						|
										uni.hideLoading();
 | 
						|
										return that.$util.Tips({
 | 
						|
											title: err
 | 
						|
										});
 | 
						|
									})
 | 
						|
								}
 | 
						|
 | 
						|
							}).cache(errW => {
 | 
						|
								uni.hideLoading();
 | 
						|
								return that.$util.Tips({
 | 
						|
									title: errW
 | 
						|
								});
 | 
						|
							})
 | 
						|
							// #endif
 | 
						|
							break;
 | 
						|
						case 'yue':
 | 
						|
							uni.hideLoading();
 | 
						|
							return that.$util.Tips({
 | 
						|
								title: '余额支付成功',
 | 
						|
								icon: 'success'
 | 
						|
							}, () => {
 | 
						|
								that.$emit('onChangeFun', {
 | 
						|
									action: 'pay_complete'
 | 
						|
								});
 | 
						|
							});
 | 
						|
							break;
 | 
						|
						case 'weixinh5':
 | 
						|
							uni.hideLoading();
 | 
						|
							location.replace(jsConfig.mwebUrl + '&redirect_url=' + window.location.protocol +
 | 
						|
								'//' + window.location.host + goPages + '&status=1');
 | 
						|
							return that.$util.Tips({
 | 
						|
								title: "支付中",
 | 
						|
								icon: 'success'
 | 
						|
							}, () => {
 | 
						|
								that.$emit('onChangeFun', {
 | 
						|
									action: 'pay_complete'
 | 
						|
								});
 | 
						|
							});
 | 
						|
							break;
 | 
						|
					}
 | 
						|
				}).catch(err => {
 | 
						|
					uni.hideLoading();
 | 
						|
					return that.$util.Tips({
 | 
						|
						title: err
 | 
						|
					}, () => {
 | 
						|
						that.$emit('onChangeFun', {
 | 
						|
							action: 'pay_fail'
 | 
						|
						});
 | 
						|
					});
 | 
						|
				})
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
</script>
 | 
						|
 | 
						|
<style scoped lang="scss">
 | 
						|
	.payment {
 | 
						|
		position: fixed;
 | 
						|
		bottom: 0;
 | 
						|
		left: 0;
 | 
						|
		width: 100%;
 | 
						|
		border-radius: 16rpx 16rpx 0 0;
 | 
						|
		background-color: #fff;
 | 
						|
		padding-bottom: 60rpx;
 | 
						|
		z-index: 99;
 | 
						|
		transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
 | 
						|
		transform: translate3d(0, 100%, 0);
 | 
						|
	}
 | 
						|
 | 
						|
	.payment.on {
 | 
						|
		transform: translate3d(0, 0, 0);
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .title {
 | 
						|
		text-align: center;
 | 
						|
		height: 123rpx;
 | 
						|
		font-size: 32rpx;
 | 
						|
		color: #282828;
 | 
						|
		font-weight: bold;
 | 
						|
		padding-right: 30rpx;
 | 
						|
		margin-left: 30rpx;
 | 
						|
		position: relative;
 | 
						|
		border-bottom: 1rpx solid #eee;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .title .iconfont {
 | 
						|
		position: absolute;
 | 
						|
		right: 30rpx;
 | 
						|
		top: 50%;
 | 
						|
		transform: translateY(-50%);
 | 
						|
		font-size: 43rpx;
 | 
						|
		color: #8a8a8a;
 | 
						|
		font-weight: normal;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item {
 | 
						|
		border-bottom: 1rpx solid #eee;
 | 
						|
		height: 130rpx;
 | 
						|
		margin-left: 30rpx;
 | 
						|
		padding-right: 30rpx;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left {
 | 
						|
		width: 610rpx;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .text {
 | 
						|
		width: 540rpx;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .text .name {
 | 
						|
		font-size: 32rpx;
 | 
						|
		color: #282828;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .text .info {
 | 
						|
		font-size: 24rpx;
 | 
						|
		color: #999;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .text .info .money {
 | 
						|
		color: #ff9900;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .iconfont {
 | 
						|
		font-size: 45rpx;
 | 
						|
		color: #09bb07;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .iconfont.icon-zhifubao {
 | 
						|
		color: #00aaea;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .iconfont.icon-yuezhifu {
 | 
						|
		color: #ff9900;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .left .iconfont.icon-yuezhifu1 {
 | 
						|
		color: #eb6623;
 | 
						|
	}
 | 
						|
 | 
						|
	.payment .item .iconfont {
 | 
						|
		font-size: 0.3rpx;
 | 
						|
		color: #999;
 | 
						|
	}
 | 
						|
</style>
 |