508 lines
14 KiB
Vue
508 lines
14 KiB
Vue
<template>
|
||
<view>
|
||
<view class="bg-white padding-sm margin flex" style="border-radius: 24rpx;">
|
||
<u-image width="200rpx" height="200rpx" border-radius="10rpx" :src="courseListIos.titleImg">
|
||
</u-image>
|
||
<view class="flex flex-direction justify-between margin-left-sm" style="width:420rpx;">
|
||
<view class="text-bold text-black margin-top-xs u-line-1 text-lg">{{courseListIos.title}}
|
||
</view>
|
||
<!-- <view class="text-gray text-26 margin-top">最近在学{{courseListIos.payNum}}</view> -->
|
||
<view class="flex justify-between ">
|
||
<view class=" text-bold " style="color: #FF8211;">¥<text
|
||
style="font-size: 42rpx;">{{courseListIos.price}}</text></view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="popup_pay_ios">
|
||
<view class="text-lg text-bold">支付方式</view>
|
||
<view class="flex align-center justify-between" style="height: 100upx;" v-for="(item,index) in openListsIos"
|
||
:key='index'>
|
||
<image :src="item.image" style="width: 55upx;height: 55upx;border-radius: 50upx;">
|
||
</image>
|
||
<view style="font-size: 30upx;margin-left: 20upx;width: 70%;">
|
||
{{item.text}}
|
||
</view>
|
||
<radio-group name="openWay" style="margin-left: 45upx;" @tap.stop='selectWayIos(item)'>
|
||
<label >
|
||
<radio color="red" :checked="openWayIos === item.id ? true : false" />
|
||
</label>
|
||
</radio-group>
|
||
</view>
|
||
<!-- <view class="pay_btn" @click="payIos()">确认支付</view> -->
|
||
</view>
|
||
|
||
<view class="taber_ios">
|
||
<view class="flex align-center" style="color: #FF8211;">
|
||
<text style="color: #333;">实付款:</text>
|
||
<view class=" text-bold " style="color: #FF8211;">¥<text
|
||
style="font-size: 42rpx;">{{courseListIos.price}}</text></view>
|
||
</view>
|
||
<view class="btn_ios" @click="payIos">确定并支付</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
data() {
|
||
return {
|
||
courseIdIos: '',
|
||
courseListIos: [],
|
||
|
||
openListsIos: [],
|
||
openWayIos: 1,
|
||
flagIos: true
|
||
}
|
||
},
|
||
onLoad(option) {
|
||
this.kkuku(1212,5)
|
||
this.lklk(1212.5)
|
||
this.iouii(1212,5)
|
||
this.iouoikjhj(1212,5)
|
||
this.jhkjbkv(1212,5)
|
||
// #ifdef APP
|
||
this.openListsIos = [{
|
||
image: '../../../static/images/index/weixin.png',
|
||
text: '微信支付',
|
||
id: 1
|
||
}, {
|
||
image: '../../../static/images/index/zhifubao.png',
|
||
text: '支付宝',
|
||
id: 2
|
||
}],
|
||
this.openWayIos = 1;
|
||
// #endif
|
||
|
||
// #ifdef MP-WEIXIN
|
||
this.openListsIos = [{
|
||
image: '../../../static/images/index/weixin.png',
|
||
text: '微信支付',
|
||
id: 1
|
||
}],
|
||
this.openWayIos = 1;
|
||
// #endif
|
||
|
||
// #ifdef H5
|
||
let ua = navigator.userAgent.toLowerCase();
|
||
if (ua.indexOf('micromessenger') !== -1) {
|
||
this.openListsIos = [{
|
||
image: '../../../static/images/index/weixin.png',
|
||
text: '微信支付',
|
||
id: 1
|
||
}, {
|
||
image: '../../../static/images/index/zhifubao.png',
|
||
text: '支付宝',
|
||
id: 2
|
||
}],
|
||
this.openWayIos = 1;
|
||
} else {
|
||
this.openListsIos = [{
|
||
image: '../../../static/images/index/zhifubao.png',
|
||
text: '支付宝',
|
||
id: 2
|
||
}],
|
||
this.openWayIos = 2;
|
||
}
|
||
// this.openListsIos = [{
|
||
// image: '../../../static/images/index/zhifubao.png',
|
||
// text: '支付宝',
|
||
// id: 2
|
||
// }],
|
||
// this.openWayIos = 2;
|
||
// #endif
|
||
if (option.courseId) {
|
||
this.courseIdIos = option.courseId
|
||
this.getDataListIos(this.courseIdIos)
|
||
}
|
||
},
|
||
methods: {
|
||
|
||
//乘法函数,用来得到精确的乘法结果
|
||
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
|
||
//调用:mul(arg1,arg2)
|
||
//返回值:arg1乘以arg2的精确结果
|
||
//
|
||
iouii(arg1, arg2) {
|
||
var m = 0,
|
||
s1 = arg1.toString(),
|
||
s2 = arg2.toString();
|
||
try {
|
||
m += s1.split(".")[1].length;
|
||
} catch (e) {
|
||
m = 0;
|
||
}
|
||
try {
|
||
m += s2.split(".")[1].length;
|
||
} catch (e) {
|
||
m = m || 0;
|
||
}
|
||
return (
|
||
(Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
|
||
Math.pow(10, m)
|
||
);
|
||
}, //除法函数,用来得到精确的除法结果
|
||
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
|
||
//调用:div(arg1,arg2)
|
||
//返回值:arg1除以arg2的精确结果
|
||
kkuku(arg1, arg2) {
|
||
var r1, r2, m, n;
|
||
try {
|
||
r1 = arg1.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
r1 = 0;
|
||
}
|
||
try {
|
||
r2 = arg2.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
r2 = 0;
|
||
}
|
||
m = Math.pow(10, Math.max(r1, r2));
|
||
//动态控制精度长度
|
||
n = r1 >= r2 ? r1 : r2;
|
||
return ((arg1 * m - arg2 * m) / m).toFixed(n);
|
||
},
|
||
iouoikjhj(arg1, arg2) {
|
||
var r1, r2, m, n;
|
||
try {
|
||
r1 = arg1.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
r1 = 0;
|
||
}
|
||
try {
|
||
r2 = arg2.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
r2 = 0;
|
||
}
|
||
m = Math.pow(10, Math.max(r1, r2));
|
||
n = r1 >= r2 ? r1 : r2;
|
||
return ((arg1 * m + arg2 * m) / m).toFixed(n);
|
||
},
|
||
jhkjbkv(arg1, arg2) {
|
||
var t1 = 0,
|
||
t2 = 0,
|
||
r1,
|
||
r2;
|
||
try {
|
||
t1 = arg1.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
t1 = 0;
|
||
}
|
||
try {
|
||
t2 = arg2.toString().split(".")[1].length;
|
||
} catch (e) {
|
||
t2 = 0;
|
||
}
|
||
r1 = Number(arg1.toString().replace(".", ""));
|
||
r2 = Number(arg2.toString().replace(".", ""));
|
||
|
||
},
|
||
/**
|
||
* 保留小数n位,不进行四舍五入
|
||
* num你传递过来的数字,
|
||
* decimal你保留的几位,默认保留小数后两位
|
||
* isInt 是否保留0。如:12.20 是否保留0
|
||
*/
|
||
lklk(num, decimal = 2, isInt = false) {
|
||
num = num.toFixed(3).toString();
|
||
const index = num.indexOf(".");
|
||
if (index !== -1) {
|
||
num = num.substring(0, decimal + index + 1);
|
||
} else {
|
||
num = num.substring(0);
|
||
}
|
||
//截取后保留两位小数
|
||
if (isInt) {
|
||
return parseFloat(num);
|
||
} else {
|
||
return parseFloat(num).toFixed(decimal);
|
||
}
|
||
},
|
||
|
||
//乘法函数,用来得到精确的乘法结果
|
||
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
|
||
//调用:mul(arg1,arg2)
|
||
//返回值:arg1乘以arg2的精确结果
|
||
selectWayIos(e) {
|
||
this.openWayIos = e.id;
|
||
},
|
||
// 资源详情
|
||
getDataListIos(id) {
|
||
let data = {
|
||
id
|
||
}
|
||
this.$u.api.courseDet(data).then(res => {
|
||
if (res.code == 0) {
|
||
this.courseListIos = res.data
|
||
} else {
|
||
uni.showToast({
|
||
title: res.msg,
|
||
duration: 1500,
|
||
icon: 'none'
|
||
});
|
||
}
|
||
|
||
})
|
||
},
|
||
payIos() {
|
||
let that = this
|
||
if (that.flagIos) {
|
||
that.flagIos = false
|
||
let data = {
|
||
courseId: that.courseListIos.courseId
|
||
}
|
||
that.$u.api.courseOrder(data).then(res => {
|
||
if (res.code == 0 && res.data.flag == 1) {
|
||
uni.showToast({
|
||
title: '已获取资源',
|
||
icon: 'success'
|
||
})
|
||
that.getDataListIos(that.courseIdIos);
|
||
} else if (res.code == 0 && res.data.flag == 2) {
|
||
uni.showLoading({
|
||
title: '支付中...'
|
||
})
|
||
if (that.openWayIos == 1) {
|
||
// #ifdef MP-WEIXIN
|
||
that.$u.post('app/wxPay/wxPayJsApiOrder?orderId=' + res.data.orders.ordersId, {})
|
||
.then(
|
||
ret => {
|
||
uni.requestPayment({
|
||
provider: 'wxpay',
|
||
timeStamp: ret.data.timestamp,
|
||
nonceStr: ret.data.noncestr,
|
||
package: ret.data.package,
|
||
signType: ret.data.signType,
|
||
paySign: ret.data.sign,
|
||
success: function(suc) {
|
||
console.log('success:' + JSON.stringify(suc));
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
title: '支付成功',
|
||
icon: 'none'
|
||
})
|
||
setTimeout(function() {
|
||
uni.navigateTo({
|
||
url: '/me/order/index'
|
||
})
|
||
}, 1000)
|
||
},
|
||
fail: function(err) {
|
||
uni.hideLoading();
|
||
console.log('fail:' + JSON.stringify(err));
|
||
uni.showToast({
|
||
title: '支付失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
});
|
||
});
|
||
// #endif
|
||
// #ifdef H5
|
||
let ua = navigator.userAgent.toLowerCase();
|
||
if (ua.indexOf('micromessenger') !== -1) {
|
||
that.$u.post('/app/wxPay/wxPayMpOrder?orderId=' + res.data.orders.ordersId)
|
||
.then(
|
||
res => {
|
||
if (res.code === 0) {
|
||
that.callPay(res.data);
|
||
} else {
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
icon: 'none',
|
||
title: '支付失败!'
|
||
});
|
||
}
|
||
});
|
||
}
|
||
// #endif
|
||
// #ifdef APP
|
||
console.log(res.data.orders.ordersId,
|
||
'res.data.orders.ordersIdres.data.orders.ordersId')
|
||
// let data = {
|
||
// orderId: res.data.orders.ordersId,
|
||
// }
|
||
that.$u.post('/app/wxPay/payAppOrder?orderId=' + res.data.orders.ordersId).then(
|
||
rea => {
|
||
console.log(rea)
|
||
if (rea.code == 0) {
|
||
that.isCheckPay(rea.code, 'wxpay', JSON.stringify(rea.data));
|
||
}
|
||
});
|
||
// #endif
|
||
} else if (that.openWayIos == 2) {
|
||
// #ifdef H5
|
||
that.$u.post('/app/aliPay/payOrder?orderId=' + res.data.orders.ordersId +
|
||
'&classify=2').then(
|
||
res => {
|
||
if (res.code === 0) {
|
||
uni.hideLoading();
|
||
const div = document.createElement('div')
|
||
div.innerHTML = res.data //此处form就是后台返回接收到的数据
|
||
document.body.appendChild(div)
|
||
document.forms[0].submit()
|
||
} else {
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
icon: 'none',
|
||
title: '支付失败!'
|
||
});
|
||
}
|
||
});
|
||
// #endif
|
||
// #ifdef APP
|
||
console.log('---------', res.data.orders.ordersId)
|
||
// let data = {
|
||
// orderId: res.data.orders.ordersId,
|
||
// classify:1
|
||
// }
|
||
that.$u.post('/app/aliPay/payOrder?orderId=' + res.data.orders.ordersId +
|
||
'&classify=1').then(
|
||
rea => {
|
||
console.log('---------', rea)
|
||
that.setPayment('alipay', rea.data);
|
||
});
|
||
// #endif
|
||
}
|
||
|
||
|
||
} else {
|
||
uni.showToast({
|
||
title: res.msg,
|
||
icon: 'none',
|
||
// duration: 1500
|
||
})
|
||
// that.getDataListIos(that.courseId);
|
||
}
|
||
})
|
||
setTimeout(() => {
|
||
that.flagIos = true
|
||
}, 1500)
|
||
|
||
}
|
||
|
||
},
|
||
isCheckPay(code, name, order) {
|
||
if (code == 0) {
|
||
console.log('999999999999')
|
||
this.setPayment(name, order);
|
||
} else {
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
title: '支付信息有误'
|
||
});
|
||
}
|
||
},
|
||
setPayment(name, order) {
|
||
console.log(777777777, name, order)
|
||
uni.requestPayment({
|
||
provider: name,
|
||
orderInfo: order, //微信、支付宝订单数据
|
||
success: function(res) {
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
title: '支付成功',
|
||
icon: 'none'
|
||
})
|
||
setTimeout(function() {
|
||
uni.navigateTo({
|
||
url: '/me/order/index'
|
||
})
|
||
}, 1000)
|
||
},
|
||
fail: function(err) {
|
||
uni.hideLoading();
|
||
},
|
||
complete() {
|
||
uni.hideLoading();
|
||
}
|
||
});
|
||
},
|
||
callPay: function(response) {
|
||
if (typeof WeixinJSBridge === "undefined") {
|
||
if (document.addEventListener) {
|
||
document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady(response), false);
|
||
} else if (document.attachEvent) {
|
||
document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady(response));
|
||
document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady(response));
|
||
}
|
||
} else {
|
||
this.onBridgeReady(response);
|
||
}
|
||
},
|
||
onBridgeReady: function(response) {
|
||
let that = this;
|
||
if (!response.package) {
|
||
return;
|
||
}
|
||
console.log("response)))):" + JSON.stringify(response))
|
||
WeixinJSBridge.invoke(
|
||
'getBrandWCPayRequest', {
|
||
"appId": response.appid, //公众号名称,由商户传入
|
||
"timeStamp": response.timestamp, //时间戳,自1970年以来的秒数
|
||
"nonceStr": response.noncestr, //随机串
|
||
"package": response.package,
|
||
"signType": response.signType, //微信签名方式:
|
||
"paySign": response.sign //微信签名
|
||
},
|
||
function(res) {
|
||
if (res.err_msg === "get_brand_wcpay_request:ok") {
|
||
// 使用以上方式判断前端返回,微信团队郑重提示:
|
||
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
|
||
|
||
uni.hideLoading();
|
||
uni.showToast({
|
||
title: '支付成功',
|
||
icon: 'none'
|
||
})
|
||
uni.navigateTo({
|
||
url: '/me/order/index'
|
||
})
|
||
} else {
|
||
uni.hideLoading();
|
||
}
|
||
WeixinJSBridge.log(response.err_msg);
|
||
}
|
||
);
|
||
},
|
||
}
|
||
|
||
}
|
||
</script>
|
||
|
||
<style>
|
||
page {
|
||
background: #F5F5F5;
|
||
}
|
||
|
||
.popup_pay_ios {
|
||
background: #FFFFFF;
|
||
border-radius: 24rpx;
|
||
margin: 30rpx 30rpx;
|
||
padding: 30rpx 30rpx 20rpx 30rpx;
|
||
}
|
||
|
||
.taber_ios {
|
||
position: fixed;
|
||
bottom: 0;
|
||
left: 0;
|
||
right: 0;
|
||
z-index: 99;
|
||
background: #FFFFFF;
|
||
padding: 10rpx 30rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.btn_ios {
|
||
width: 260rpx;
|
||
height: 78rpx;
|
||
background: #5074FF;
|
||
border-radius: 39rpx;
|
||
color: #FFFFFF;
|
||
text-align: center;
|
||
line-height: 78rpx;
|
||
font-size: 30rpx;
|
||
}
|
||
</style> |