代码
onLoad(data) {
this.productInfo = JSON.parse(data.buyInfo);
console.log("this.productInfo: " + JSON.stringify(this.productInfo));
this._iap = new Iap({
products: [this.productInfo.mealsId] // 苹果开发者中心创建
})
this.init();
},
onShow() {
if (this._iap.ready) {
this.restore();
}
},
async init() {
uni.showLoading({
title: '检测支付环境...'
});
try {
// 初始化,获取iap支付通道
await this._iap.init();
// 从苹果服务器获取产品列表
this.productList = await this._iap.getProduct();
this.productList[0].checked = true;
this.productId = this.productList[0].productid;
// 填充产品列表,启用界面
this.disabled = false;
} catch (e) {
uni.showModal({
title: "init",
content: e.message,
showCancel: false
});
} finally {
uni.hideLoading();
}
if (this._iap.ready) {
this.restore();
}
},
async restore() {
// 检查上次用户已支付且未关闭的订单,可能出现原因:首次绑卡,网络中断等异常
// 在此处检查用户是否登陆
uni.showLoading({
title: '正在检测已支付且未关闭的订单...'
});
try {
// 从苹果服务器检查未关闭的订单,可选根据 username 过滤,和调用支付时透传的值一致
const transactions = await this._iap.restoreCompletedTransactions({
username: ""
});
if (!transactions.length) {
return;
}
// 开发者业务逻辑,从服务器获取当前用户未完成的订单列表,和本地的比较
// 此处省略
switch (transaction.transactionState) {
case IapTransactionState.purchased:
// 用户已付款,在此处请求开发者服务器,在服务器端请求苹果服务器验证票据
// let result = await this.validatePaymentResult();
// 验证通过,交易结束,关闭订单
// if (result) {
// await this._iap.finishTransaction(transaction);
// }
break;
case IapTransactionState.failed:
// 关闭未支付的订单
await this._iap.finishTransaction(transaction);
break;
default:
break;
}
} catch (e) {
uni.showModal({
content: e.message,
showCancel: false
});
} finally {
uni.hideLoading();
}
},
async payment() {
if (this.loading == true) {
return;
}
this.loading = true;
uni.showLoading({
title: '支付处理中...'
});
try {
//从开发者服务器创建订单
const order = await this.createOrder();
// 请求苹果支付
const transaction = await this._iap.requestPayment({
productid: this.productId,
manualFinishTransaction: true,
// username: username + orderId //根据业务需求透传参数,关联用户和订单关系
username:order.data.orderId
});
// 在此处请求开发者服务器,在服务器端请求苹果服务器验证票据
await this.validatePaymentResult({
orderId: order.data.orderId,
transactionReceipt: transaction.transactionReceipt, // 不可作为订单唯一标识
transactionIdentifier: transaction.transactionIdentifier,
type:1
});
// 验证成功后关闭订单
await this._iap.finishTransaction(transaction);
uni.navigateTo({
url:'/pages/pee/goods/buyDetails/buyDetails?state=2'
})
// 支付成功
} catch (e) {
uni.showModal({
content: e.message||'支付失败或取消支付',
showCancel: false
});
} finally {
this.loading = false;
uni.hideLoading();
}
},
//创建订单
async createOrder() {
try {
const res = await this.$api.order.createOrder({
goodsId: this.productInfo.shopId,
mealId: this.productInfo.mealsId,
payPlatform: 'APPLE_PAY',
quantity: this.productInfo.buyNum,
remark: this.userInfo.remarks
});
console.log("res: " + JSON.stringify(res));
return res; // 返回API响应
} catch (err) {
// 处理任何错误
console.error(err);
throw err; // 重新抛出错误以供调用者捕获
}
},
async validatePaymentResult(data) {
try {
const res = await this.$api.order.verify(data);
console.log("res: " + JSON.stringify(res));
return res; // 返回API响应
} catch (err) {
// 处理任何错误
console.error(err);
throw err; // 重新抛出错误以供调用者捕获
}
},
}
zhaoyu2020
楼主 能请教下 Apple pay 能用基座在本地测试吗?我的报"code":-100,"message":"Payment_appleiap:返回訂單信息失敗,https://ask.dcloud.net.cn/article/282"
2024-03-18 14:30
1***@qq.com (作者)
回复 zhaoyu2020: 看后端是否支持沙盒环境校验
2024-04-25 18:02