142 lines
4.2 KiB
JavaScript
142 lines
4.2 KiB
JavaScript
import store from '@/store/index.js'
|
||
import $http from '@/config/requestConfig.js';
|
||
// #ifdef APP-PLUS
|
||
const iapChannel = null;
|
||
const checking = false
|
||
const ComplateRequestArr = []
|
||
// #endif
|
||
// #ifdef H5
|
||
// const bgm = {};
|
||
// #endif
|
||
|
||
|
||
var iap = {
|
||
getProvider() {
|
||
return new Promise((resolve, reject) => {
|
||
uni.getProvider({
|
||
service: 'payment',
|
||
success: (res) => {
|
||
const iapChannel = res.providers.find((channel) => {
|
||
return (channel.id === 'appleiap')
|
||
})
|
||
resolve(iapChannel);
|
||
// 如果 iapChannel 为 null,说明当前包没有包含iap支付模块。注意:HBuilder基座不包含 iap 通道
|
||
}
|
||
});
|
||
})
|
||
},
|
||
// 检测支付通道
|
||
async getChannels(){
|
||
const that = this;
|
||
console.log('检测支付通道')
|
||
this.iapChannel = await this.getProvider()
|
||
if(this.iapChannel){
|
||
// this.requestOrder();
|
||
this.restoreComplateRequest()
|
||
}else{
|
||
console.log("不支持iap支付");
|
||
}
|
||
},
|
||
// 检测是否有未关闭订单
|
||
restoreComplateRequest() {
|
||
let that = this
|
||
console.log('检测未完成订单')
|
||
this.iapChannel.restoreCompletedTransactions({
|
||
manualFinishTransaction: true
|
||
}, function(results) {
|
||
if (!that.checking) {
|
||
that.checking = true
|
||
// results 格式为数组存放恢复的IAP商品交易信息对象 IAPTransaction,通用需将返回的支付凭证传给后端进行二次认证
|
||
that.ComplateRequestArr = results
|
||
console.log('未完成订单数组共有:=》',that.ComplateRequestArr.length ,that.ComplateRequestArr)
|
||
|
||
if (that.ComplateRequestArr.length > 0) {
|
||
that.ComplateRequestArr.map((item, index) => {
|
||
// "0"为正在支付;"1"为支付成功;"2"为支付失败;"3"为支付已恢复。
|
||
if (item.transactionState == '1') {
|
||
console.log('待验证订单,即将进入后台验证:=>', item)
|
||
// return false
|
||
// 已经支付,但是没有走逻辑的内购订单 就发给后台做验证
|
||
that.iapCheck(item, index)
|
||
// that.finishTransaction(item)
|
||
} else {
|
||
// 其他状态的内购订单
|
||
that.finishTransaction(item)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
});
|
||
},
|
||
// 关闭订单
|
||
finishTransaction(trans) {
|
||
this.iapChannel.finishTransaction(
|
||
trans,
|
||
(success) => {
|
||
console.log("关闭订单成功");
|
||
that.checking = false
|
||
},
|
||
(fail) => {
|
||
console.log("关闭订单失败");
|
||
that.checking = false
|
||
}
|
||
);
|
||
},
|
||
iapCheck(result) {
|
||
let that = this;
|
||
console.log("进入后台验证");
|
||
let data = {
|
||
transactionId: result.transactionIdentifier, // 支付交易id
|
||
customerOid: store.state.userInfo.id,
|
||
productId: result.payment.productid.slice(1), // 产品id
|
||
orderId: result.payment.username, // 系统订单号
|
||
receiptData: result.transactionReceipt, // 苹果返回收据
|
||
// isSandBox:true
|
||
// body: that.stepsCj.priceTypeId // 充值类型id
|
||
};
|
||
console.log("提交给后台的数据=>", data);
|
||
// return false
|
||
$http
|
||
.request({
|
||
url: "/Ipa/veri",
|
||
method: "POST", // POST、GET、PUT、DELETE,具体说明查看官方文档
|
||
data,
|
||
header: {
|
||
//默认 无 说明:请求头
|
||
"Content-Type": "application/json",
|
||
},
|
||
})
|
||
// $http.post('Ipa/veri', data)
|
||
.then((res) => {
|
||
// console.log(JSON.stringify(res));
|
||
if (res.code == 0) {
|
||
// uni.hideLoading()
|
||
console.log("充值订单已处理....");
|
||
// 服务器验证票据有效后在客户端关闭订单 (iapChannel.finishTransaction)
|
||
that.finishTransaction(result);
|
||
}
|
||
})
|
||
.catch((e) => {
|
||
console.log('后台验证失败=>',e);
|
||
uni.showModal({
|
||
title: "提示",
|
||
cancelColor:'#0081ff',
|
||
content: `您的账户下存在验证异常的订单(订单编号为:${e.data.orderId}),可尝试稍后重启app,如不能解决您的问题,可联系官方客服`,
|
||
cancelText:'已验证关闭订单',
|
||
confirmText:'知道了',
|
||
success: function(res) {
|
||
if (res.confirm) {
|
||
console.log("用户点击确定");
|
||
}else{
|
||
console.log('点了取消')
|
||
that.finishTransaction(result);
|
||
}
|
||
},
|
||
});
|
||
// that.finishTransaction(result);
|
||
});
|
||
},
|
||
}
|
||
module.exports = {iap}
|
||
|