498 lines
10 KiB
Vue
498 lines
10 KiB
Vue
<template>
|
||
<view class="container">
|
||
<view class="card">
|
||
<view class="info-wrap">
|
||
<image class="cover" src="@/static/img_vipno_vip1-1.png" mode="aspectFill"></image>
|
||
<text class="t">{{ type == 1 ? '设备商城' : '在线支付' }}</text>
|
||
</view>
|
||
<view class="input-wrap">
|
||
<view class="input-cont">
|
||
<text class="i">¥</text>
|
||
<text class="num">{{ num }}</text>
|
||
</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">
|
||
<view class="label">
|
||
<image class="icon" src="../../static/4.png" mode="aspectFit"></image>
|
||
<text class="t">微信支付</text>
|
||
</view>
|
||
<uni-icons type="checkbox-filled" size="18" color="#54A347"></uni-icons>
|
||
</view>
|
||
</view>
|
||
<view class="num-wrap">
|
||
<text>实付:</text>
|
||
<text class="t b">¥{{ num || 0 }}</text>
|
||
</view>
|
||
</view>
|
||
<view class="btn-wrap">
|
||
<view class="btn" @click="submitHandle"><text>确认支付</text></view>
|
||
</view>
|
||
<u-popup :show="show" :closeable="false" round mode="bottom">
|
||
<view class="success-wrap">
|
||
<view class="title">{{ payState == 1 ? '支付成功' : '支付失败,请返回APP重新下单' }}</view>
|
||
<view class="content">
|
||
<image class="img" src="@/static/success.png" mode="widthFix"></image>
|
||
</view>
|
||
<view class="popup-buttn">
|
||
<button class="btn" type="primary" open-type="launchApp"><text>返回APP</text></button>
|
||
</view>
|
||
</view>
|
||
</u-popup>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
// import utils from '@/common/utils.js';
|
||
export default {
|
||
data() {
|
||
return {
|
||
type: 1,
|
||
num: '',
|
||
orderNumber: '',
|
||
show: false,
|
||
payState: 1,
|
||
options: {}
|
||
};
|
||
},
|
||
async onLoad(options) {
|
||
// // #ifdef MP-WEIXIN
|
||
// uni.login({
|
||
// provider: 'weixin',
|
||
// success: async (data) => {
|
||
// try {
|
||
// uni.cache.set('weixincode', data.code);
|
||
// let res = await this.api.userlogin({
|
||
// code: uni.cache.get('weixincode')
|
||
// })
|
||
// if (res) {
|
||
// uni.cache.set('loginuser', res);
|
||
// uni.cache.set('store_id', res.store_id) // 判断显示哪家的作品
|
||
// uni.cache.set('openId', res.userinfo.open_id);
|
||
// }
|
||
// } catch (e) {
|
||
// console.log(e)
|
||
// }
|
||
// }
|
||
// });
|
||
// // #endif
|
||
//此处保存openid
|
||
// uni.setStorageSync('openid', 'openid');
|
||
// await this.$store.dispatch('getLoginInfo');
|
||
this.orderNumber = options.orderNumber;
|
||
this.num = options.num;
|
||
if (options.type) {
|
||
this.type = options.type;
|
||
}
|
||
if (options.type && options.type == 2) {} else if (options.type && options.type != 1) {
|
||
this.options = options;
|
||
}
|
||
|
||
console.log({
|
||
openid: uni.getStorageSync('openId'),
|
||
orderNumber: this.orderNumber
|
||
});
|
||
|
||
// if (e.q) {
|
||
// this.userAppId = utils.getQueryString(decodeURIComponent(e.q), 'userAppId');
|
||
// this.getShopInfo();
|
||
// }
|
||
},
|
||
methods: {
|
||
// 付款
|
||
async submitHandle() {
|
||
try {
|
||
uni.showLoading({
|
||
title: '支付中...',
|
||
mask: true
|
||
});
|
||
let res = '';
|
||
if (this.type == 1) {
|
||
res = await this.requestHandle('/wechat/orderPay', {
|
||
openid: uni.getStorageSync('openId'),
|
||
orderNumber: this.orderNumber,
|
||
appId: 'wxcf9fdee37e8a4803'
|
||
});
|
||
} else if (this.type == 2) {
|
||
// 加油支付
|
||
res = await this.wxRequest('/order/orderPay', {
|
||
openid: uni.getStorageSync('openId'),
|
||
orderNumber: this.orderNumber
|
||
});
|
||
} else if (this.type == 3) {
|
||
res = await this.wxRequest('/order/createorderApp', {
|
||
openId: uni.getStorageSync('openId'),
|
||
mobile: this.options.mobile,
|
||
productId: this.options.productId,
|
||
provinceName: this.options.provinceName,
|
||
paymentType: this.options.paymentType,
|
||
orderId: this.options.orderId
|
||
});
|
||
} else if (this.type == 4) {
|
||
res = await this.wxRequest('/order/createshoporderApp', {
|
||
openId: uni.getStorageSync('openId'),
|
||
productId: this.options.productId,
|
||
orderId: this.options.orderId
|
||
});
|
||
} else if (this.type == 5) {
|
||
res = await this.wxRequest('/order/createoilshoporderApp', {
|
||
openId: uni.getStorageSync('openId'),
|
||
productId: this.options.productId,
|
||
orderId: this.options.orderId
|
||
});
|
||
}
|
||
|
||
console.log('options222222===', res);
|
||
|
||
uni.requestPayment({
|
||
provider: 'wxpay',
|
||
timeStamp: res.data.payTimeStamp,
|
||
nonceStr: res.data.paynonceStr,
|
||
package: res.data.payPackage,
|
||
signType: res.data.paySignType,
|
||
paySign: res.data.paySign,
|
||
success: (res) => {
|
||
uni.hideLoading();
|
||
this.show = true;
|
||
},
|
||
fail: (err) => {
|
||
this.show = true;
|
||
this.payState = 2;
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
title: '支付失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
});
|
||
} catch (e) {
|
||
this.show = true;
|
||
this.payState = 2;
|
||
uni.hideLoading();
|
||
uni.showModal({
|
||
title: '支付失败',
|
||
content: e,
|
||
showCancel: false
|
||
});
|
||
// uni.showToast({
|
||
// title: '支付失败2:' + JSON.stringify(e),
|
||
// icon: 'none'
|
||
// });
|
||
}
|
||
},
|
||
// 微信云托管请求封装
|
||
wxRequest(api = '', data = {}, method = 'post') {
|
||
console.log('data44444===', data);
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: `https://ky.sxczgkj.cn/wap${url}`,
|
||
method: method,
|
||
header: {
|
||
'Content-Type': 'application/x-www-form-urlencoded',
|
||
sourceId: 2
|
||
},
|
||
data: data,
|
||
success: (res) => {
|
||
console.log('err2===', res);
|
||
if (res.data.code == 0) {
|
||
resolve(res.data);
|
||
} else {
|
||
uni.showToast({
|
||
icon: 'none',
|
||
title: res.data.message
|
||
});
|
||
reject(res.data.message);
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
console.log('err1===', err);
|
||
reject(JSON.stringify(err));
|
||
}
|
||
});
|
||
});
|
||
},
|
||
// 封装请求
|
||
requestHandle(url = '', data = {}, method = 'post') {
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: `https://ky.sxczgkj.cn/wap${url}`,
|
||
method: method,
|
||
header: {
|
||
'content-type': 'application/json'
|
||
},
|
||
data: data,
|
||
success: (res) => {
|
||
if (res.data.code == 200) {
|
||
resolve(res.data);
|
||
} else {
|
||
uni.showToast({
|
||
icon: 'none',
|
||
title: res.data.message
|
||
});
|
||
reject(res.data.message);
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
reject(JSON.stringify(err));
|
||
}
|
||
});
|
||
});
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style scoped lang="scss">
|
||
.btn-wrap {
|
||
width: 100%;
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
padding: 28upx 28upx calc(env(safe-area-inset-bottom) + 28upx);
|
||
|
||
.btn {
|
||
padding: 20upx 0;
|
||
border-radius: 100upx;
|
||
background-color: #ffcc17;
|
||
color: #000;
|
||
font-size: 28upx;
|
||
display: flex;
|
||
justify-content: center;
|
||
}
|
||
}
|
||
|
||
.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;
|
||
// &::after {
|
||
// content: '';
|
||
// width: 4upx;
|
||
// height: 40upx;
|
||
// background-color: #333;
|
||
// position: absolute;
|
||
// top: 50%;
|
||
// margin-top: -24upx;
|
||
// right: 0;
|
||
// animation: ani 0.8s ease-in-out 1.4s infinite;
|
||
// }
|
||
// @keyframes ani {
|
||
// 0% {
|
||
// opacity: 0;
|
||
// }
|
||
// 100% {
|
||
// opacity: 1;
|
||
// }
|
||
// }
|
||
}
|
||
}
|
||
|
||
.tips {
|
||
display: flex;
|
||
padding-top: 24upx;
|
||
|
||
.input {
|
||
flex: 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
.pay-list {
|
||
.item {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
padding: 28upx 0;
|
||
|
||
.label {
|
||
display: flex;
|
||
align-items: center;
|
||
|
||
.icon {
|
||
$size: 60upx;
|
||
width: $size;
|
||
height: $size;
|
||
margin-right: 20upx;
|
||
}
|
||
|
||
.t {
|
||
font-size: 28upx;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.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> |