金诚优选前端代码
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.
 
 
 
 
 

735 lines
19 KiB

<template>
<view id="store-payment">
<form @submit="formSubmit" :report-submit="report">
<view class="order-item" v-if="order.status === 1 && init">
<view class="title mx-1px-bottom">
商品清单
</view>
<view class="goods info" v-for="(item, index) in order.items" :key="index">
<view class="goods-item">
<view class="item-left">
<image :src="item.item_meta.image"></image>
</view>
<view class="item-right">
<view class="goods-name item">
<view class="name">
{{item.item_name}}
</view>
<view>
{{item.quantity}}件
</view>
</view>
<view class="goods-money item">
<view>
{{item.item_meta.specs_text}}
</view>
<view>
¥{{item.total / 100}}
</view>
</view>
</view>
</view>
</view>
<view class="order-item" v-if="order.balance_paid == 0">
<view class="title mx-1px-bottom">
余额
</view>
<view class="balance info" v-if="balance">
<view class="num">
<span>¥</span>
<input type="digit" @input="modifyBalance" :value="inputBalance" :placeholder="'可使用' + paybalance.balance / 100 + '元'"></input>
<i class="iconfont icon-delete" v-if="inputBalance" @tap="cancel"></i>
</view>
<view class="text" @tap="useAll">
全部使用
</view>
</view>
<view class="no-balance" v-else>
您暂无可用余额
</view>
</view>
<view class="pay-balance" v-else>
您已使用余额支付{{order.balance_paid / 100}}元
</view>
<view class="order-item" v-if="paybalance.balance != (inputBalance * 100) || paybalance.balance == 0">
<view class="title mx-1px-bottom">
支付方式
</view>
<view class="type info">
<radio-group class="radio-group">
<label class="radio">
<radio checked="true" color="red"></radio>
<!-- #ifdef H5 -->
<text v-if="env.isWechat">微信支付</text>
<text v-else>支付宝支付</text>
<!-- #endif -->
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
<text>微信支付</text>
<!-- #endif -->
</label>
</radio-group>
</view>
</view>
<view class="order-info">
<view v-if="order.balance_paid == 0">
<view class="item">
<view class="left">
余额支付
</view>
<view class="num">
¥{{inputBalance || 0}}
</view>
</view>
<view class="item">
<!-- #ifdef H5 -->
<view class="left" v-if="env.isWechat">
微信支付
</view>
<view class="left" v-else>
支付宝支付
</view>
<!-- #endif -->
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
<view class="left">
微信支付
</view>
<!-- #endif -->
<view class="num">
¥{{countMoney || order.total / 100}}
</view>
</view>
</view>
<view v-else>
<view class="item">
<view class="left" >
余额支付
</view>
<view class="num">
¥{{order.balance_paid / 100}}
</view>
</view>
<!-- #ifdef H5 -->
<view class="item">
<view class="left" v-if="env.isWechat">
微信支付
</view>
<view class="left" v-else>
支付宝支付
</view>
<view class="num">
¥{{((order.total - order.balance_paid) / 100)}}
</view>
</view>
<!-- #endif -->
<!-- #ifdef APP-PLUS || MP-WEIXIN -->
<view class="item">
<view class="left">
微信支付
</view>
<view class="num">
¥{{((order.total - order.balance_paid) / 100)}}
</view>
</view>
<!-- #endif -->
</view>
</view>
<button :style="'background: ' + config.mainColor" form-type="submit" :loading="loading">立即支付</button>
</view>
<view class="order-over" v-if="order.status != 1 && init">
<view>
订单已支付
</view>
<view class="over-btn" @tap="jumpOrderDetail">
查看订单详情
</view>
</view>
</form>
</view>
</template>
<script>
var app = getApp();
import {pageLogin, getUrl,config,is} from '@/common/js/utils.js';
export default {
data() {
return {
order: {},
order_no: '',
channel: 'wx_lite',
amount: 0,
loading: false,
inputBalance: '',
balance: '',
paybalance: {
balance: 0,
inputBalance: 0
},
countMoney: '',
config: '',
report: true,
formId: '',
init: false,
// #ifdef H5
env:{
isIPad: /ipad/i.test(window.navigator.userAgent),
isIphone: /iphone|ipad|ipod/i.test(window.navigator.userAgent),
isWechat: /MicroMessenger/i.test(window.navigator.userAgent)
}
// #endif
};
},
onShow() {
this.queryUserSum();
},
onLoad(e) {
// 第三方平台配置颜色
var gbConfig = this.$cookieStorage.get('globalConfig') || '';
this.setData({
config: gbConfig
});
this.setData({
order_no: e.order_no,
loading: false
});
},
methods: {
jumpOrderDetail() {
wx.redirectTo({
url: `/pages/order/detail/detail?no=${this.order_no}`
});
},
modifyBalance(e) {
var val = e.detail.value;
var min = 0;
var balance = this.paybalanceF(val);
var max = (balance.balance / 100).toFixed(2);
if (!val) {
val = '';
} else if (/\S*$/.test(val)) {
val = val.replace(/[^\d\.]|^\./g, '').replace(/\.{2}/g, '.').replace(/^([1-9]\d*|0)(\.\d{1,2})(\.|\d{1})?$/, '$1$2').replace(/^0\d{1}/g, '0');
}
if (Number(val) < min) {
val = min;
} else if (Number(val) > max) {
val = max;
}
this.setData({
inputBalance: val
});
this.paybalanceF(val);
this.countMoneyF();
return val;
},
useAll() {
var balance = this.paybalanceF(this.order.total / 100);
this.setData({
inputBalance: (balance.balance / 100).toFixed(2)
});
this.countMoneyF();
},
cancel() {
this.setData({
inputBalance: '',
channel: 'wx_lite'
});
this.countMoneyF();
},
paybalanceF(val) {
var total = this.order.total;
var balance = Math.min(this.balance, total);
var inputBalance = val;
/*if ((inputBalance * 100) == balance && balance != 0) {
this.setData({
channel: 'balance'
})
} else {
this.setData({
channel: 'wx_lite'
})
}*/
var data = {
balance,
inputBalance
};
this.setData({
paybalance: data
});
return data;
},
queryOrderDetail(order_no) {
var oauth = this.$cookieStorage.get('user_token');
this.$http.get({
api: `api/order/${order_no}`,
header: {
Authorization: oauth
}
}).then(res => {
if (res.statusCode == 200) {
res = res.data;
if (res.status) {
this.$cookieStorage.set('service_retreat', res.data);
this.setData({
order: res.data,
init: true
});
this.paybalanceF(0);
} else {
wx.showModal({
content: res.message || '获取订单数据失败',
showCancel: false
});
}
wx.hideLoading();
} else {
wx.showModal({
content: '获取订单数据失败',
showCancel: false
});
wx.hideLoading();
}
}).catch(rej => {
wx.hideLoading();
wx.showModal({
content: '获取订单数据失败',
showCancel: false
});
});
},
// 新版支付
newcharge(success, charge) {
if (success) {
var that = this;
if (charge.pay_scene == 'test') {
wx.showModal({
content: '不支持模拟支付',
showCancel: false
});
this.setData({
loading: false
});
} else {
wx.requestPayment({
"timeStamp": charge.credential.wechat.timeStamp,
"nonceStr": charge.credential.wechat.nonceStr,
"package": charge.credential.wechat.package,
"signType": charge.credential.wechat.signType,
"paySign": charge.credential.wechat.paySign,
success: res => {
if (res.errMsg == 'requestPayment:ok') {
this.setData({
loading: false
});
wx.redirectTo({
url: `/pages/store/success/success?order_no=${that.order_no}&amount=${that.amount}&channel=${that.channel}&formId=${this.formId}`
});
} else {
wx.showModal({
content: '调用支付失败!',
showCancel: false
});
}
},
fail: err => {
this.setData({
loading: false
});
if (err.errMsg == 'requestPayment:fail cancel') {
wx.redirectTo({
url: `/pages/order/detail/detail?no=${that.order_no}`
});
} else {
wx.showModal({
content: '调用支付失败!',
showCancel: false
});
}
}
});
}
} else {
this.setData({
loading: false
});
wx.showModal({
content: charge || '请求支付失败,请重试!',
showCancel: false
});
}
},
//app支付
appPayment(success,orderInfo) {
var that = this;
if (success) {
// 获取服务供应商
uni.getProvider({
service:'payment',
success:ret=>{
uni.requestPayment({
provider:'wxpay',
orderInfo:orderInfo,
success: res => {
if (res.errMsg == 'requestPayment:ok') {
this.setData({
loading: false
});
wx.redirectTo({
url: `/pages/store/success/success?order_no=${that.order_no}&amount=${that.amount}&channel=${that.channel}&formId=${this.formId}`
});
} else {
wx.showModal({
content: '调用支付失败!',
showCancel: false
});
}
},
fail: err => {
this.setData({
loading: false
});
if (err.errMsg == 'requestPayment:fail:[payment微信:-2]User canceled') {
wx.redirectTo({
url: `/pages/order/detail/detail?no=${that.order_no}`
});
} else {
wx.showModal({
content: '调用支付失败!',
showCancel: false
});
}
}
});
}
})
} else {
this.setData({
loading: false
});
wx.showModal({
content: charge || '请求支付失败,请重试!',
showCancel: false
});
}
},
// 纯余额支付
balanceCharge() {
this.setData({
loading: false
});
wx.redirectTo({
url: `/pages/store/success/success?order_no=${this.order_no}&amount=${this.amount}&channel=${this.channel}&formId=${this.formId}`
});
},
// 查询用户余额信息
queryUserSum() {
var oauth = this.$cookieStorage.get('user_token');
wx.showLoading({
title: '加载中',
mask: true
});
this.$http.get({
api: 'api/users/balance/sum',
header: {
Authorization: oauth
}
}).then(res => {
if (res.statusCode == 200) {
res = res.data;
if (res.status) {
this.setData({
balance: res.data.sum
});
this.queryOrderDetail(this.order_no);
} else {
wx.hideLoading();
wx.showModal({
content: res.message || '请求失败',
showCancel: false
});
}
} else {
wx.hideLoading();
wx.showModal({
content: '请求失败',
showCancel: false
});
}
});
},
getOpenid() {
return new Promise((resolve, reject) => {
wx.login({
success: res => {
this.$http.get({
api: `api/oauth/miniprogram/openid`,
data: {
code: res.code
}
}).then(res => {
res = res.data;
resolve(res.data.openid);
}).catch(() => {
reject('获取openid失败');
});
},
fail: () => {
wx.showModal({
content: "接口请求失败",
showCancel: false
});
}
});
});
},
// #ifdef MP-WEIXIN
formSubmit(e) {
if (this.loading) return;
this.setData({
loading: true
});
var oauth = this.$cookieStorage.get('user_token');
this.getOpenid().then(res => {
var data = {
channel: this.channel,
openid: res,
order_no: this.order_no,
balance: Number(this.inputBalance)
};
if (this.$cookieStorage.get('agent_code')) {
data.agent_code = this.$cookieStorage.get('agent_code');
}
this.$http.post({
api: `api/shopping/order/charge`,
data: data,
header: {
Authorization: oauth
}
}).then(res => {
res = res.data;
if (res.status) {
this.formId = e.detail.formId || '';
if (res.data.name == 'balance') {
this.balanceCharge();
} else {
this.newcharge(true, res.data.charge);
}
} else {
this.newcharge(false, res.message);
}
})
}).catch(() => {
this.setData({
loading: false
});
wx.showModal({
content: '支付失败',
showCancel: false
});
});
},
// #endif
//h5支付
// #ifdef H5
formSubmit(e) {
if (this.loading) return;
this.setData({
loading: true
});
let env = {
isIPad: /ipad/i.test(window.navigator.userAgent),
isIphone: /iphone|ipad|ipod/i.test(window.navigator.userAgent),
isWechat: /MicroMessenger/i.test(window.navigator.userAgent)
}
if(this.channel=='wx_lite'){
if(env.isWechat){
this.channel='wx_pub';
} else{
this.channel='alipay_wap';
}
}
var oauth = this.$cookieStorage.get('user_token');
if(env.isWechat){
var openid = this.$cookieStorage.get('openid');
} else{
var openid = '';
}
let origin = window.location.origin;
let pathname = window.location.pathname;
var url = origin+'/pages/store/success/success?order_no='+this.order_no;
var fail_url = origin+'/pages/order/detail/detail?no='+this.order_no;
var data = {
channel: this.channel,
order_no: this.order_no,
balance: Number(this.inputBalance),
extra:{
openid:openid,
successUrl:url,
failUrl:fail_url
}
};
this.$http.post({
api:'api/shopping/order/charge',
data:data,
header:{
Authorization: oauth
}
}).then(res=>{
res = res.data;
if(res.status){
if(res.data.redirect_url){
var redirect_url = res.data.redirect_url
window.location.href=redirect_url;
}
}else{
wx.showModal({
content: res.message||'支付失败',
showCancel: false
});
}
}).catch(rej=>{
this.setData({
loading: false
});
wx.showModal({
content: rej.message||'支付失败',
showCancel: false
});
})
},
// #endif
// app支付
// #ifdef APP-PLUS
formSubmit(e) {
if (this.loading) return;
this.setData({
loading: true
});
if(this.channel=='wx_lite'){
this.channel='wx_app';
}
var oauth = this.$cookieStorage.get('user_token');
var data = {
channel: this.channel,
order_no: this.order_no,
balance: Number(this.inputBalance)
};
if (this.$cookieStorage.get('agent_code')) {
data.agent_code = this.$cookieStorage.get('agent_code');
}
this.$http.post({
api: `api/shopping/order/charge`,
data: data,
header: {
Authorization: oauth
}
}).then(res => {
res = res.data;
if (res.status) {
this.formId = e.detail.formId || '';
if (res.data.name == 'balance') {
this.balanceCharge();
} else{
this.appPayment(true,JSON.stringify(res.data))
}
} else{
this.appPayment(false,res.message)
}
}).catch(rej=>{
this.setData({
loading: false
});
wx.showModal({
content: rej.message||'支付失败',
showCancel: false
});
})
},
// #endif
countMoneyF() {
this.setData({
countMoney: (this.order.total / 100 - this.inputBalance).toFixed(2)
});
},
setData: function (obj) {
let that = this;
let keys = [];
let val, data;
Object.keys(obj).forEach(function (key) {
keys = key.split('.');
val = obj[key];
data = that.$data;
keys.forEach(function (key2, index) {
if (index + 1 == keys.length) {
that.$set(data, key2, val);
} else {
if (!data[key2]) {
that.$set(data, key2, {});
}
}
data = data[key2];
});
});
}
}
};
</script>
<style rel="stylesheet/less" lang="less">
@import "payment";
</style>