|
@@ -346,137 +346,153 @@ export function usePay(opt = {}) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 苹果支付 --- 无需check 直接购买成功
|
|
// 苹果支付 --- 无需check 直接购买成功
|
|
|
|
|
+ // 苹果支付 --- 无需check 直接购买成功
|
|
|
function applePay(options) {
|
|
function applePay(options) {
|
|
|
- Object.assign(appleData, options)
|
|
|
|
|
|
|
+ Object.assign(appleData, options);
|
|
|
|
|
+ // 核心修复1:提升iapChannel作用域,定义在applePay方法内,所有嵌套回调可访问
|
|
|
|
|
+ let iapChannel = null;
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- plus.payment.getChannels(function(channels) {
|
|
|
|
|
- uni.hideLoading();
|
|
|
|
|
- // 获取 id 为 'appleiap' 的 channel
|
|
|
|
|
- // 开通了app应用内支付,在manifest.josn中设置,开通后需打自定议基座
|
|
|
|
|
- // iapChannel 为应用内支付对象
|
|
|
|
|
- const iapChannel = channels.find((item) => item.id == "appleiap");
|
|
|
|
|
- // ids 数组中的项为 App Store Connect 配置的内购买项目产品ID(productId)
|
|
|
|
|
- if (!iapChannel) {
|
|
|
|
|
- toast('未找到产品内购信息,请联系管理员')
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
|
|
+ plus.payment.getChannels(
|
|
|
|
|
+ function(channels) {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ // 获取苹果内购通道,赋值给外层作用域的iapChannel
|
|
|
|
|
+ iapChannel = channels.find((item) => item.id == "appleiap");
|
|
|
|
|
+ if (!iapChannel) {
|
|
|
|
|
+ toast('未找到产品内购信息,请联系管理员');
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
type: "applePay",
|
|
type: "applePay",
|
|
|
msg: "内购商品Id丢失,请确认是否已成功配置",
|
|
msg: "内购商品Id丢失,请确认是否已成功配置",
|
|
|
err: new Error("内购商品Id丢失,请确认是否已成功配置"),
|
|
err: new Error("内购商品Id丢失,请确认是否已成功配置"),
|
|
|
from: "apple",
|
|
from: "apple",
|
|
|
});
|
|
});
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const ids = [options.applePid];
|
|
|
|
|
+ iapChannel.requestOrder(
|
|
|
|
|
+ ids,
|
|
|
|
|
+ function(e) {
|
|
|
|
|
+ // 获取订单信息成功回调
|
|
|
|
|
+ console.log('001 获取苹果订单成功', options);
|
|
|
|
|
+ uni.requestPayment({
|
|
|
|
|
+ provider: "appleiap",
|
|
|
|
|
+ orderInfo: {
|
|
|
|
|
+ productid: options.applePid,
|
|
|
|
|
+ quantity: 1,
|
|
|
|
|
+ manualFinishTransaction: true,
|
|
|
|
|
+ },
|
|
|
|
|
+ success: (payRes) => {
|
|
|
|
|
+ // 苹果内购支付成功
|
|
|
|
|
+ console.log('002 苹果支付成功', payRes);
|
|
|
|
|
+ const {
|
|
|
|
|
+ transactionIdentifier: paynum,
|
|
|
|
|
+ transactionReceipt: receipt,
|
|
|
|
|
+ } = payRes;
|
|
|
|
|
+ Object.assign(appleData, {
|
|
|
|
|
+ paynum,
|
|
|
|
|
+ receipt
|
|
|
|
|
+ });
|
|
|
|
|
|
|
|
- const ids = [options.applePid];
|
|
|
|
|
-
|
|
|
|
|
- iapChannel.requestOrder(
|
|
|
|
|
- ids,
|
|
|
|
|
- function(e) {
|
|
|
|
|
- // 获取订单信息成功回调方法
|
|
|
|
|
- console.log('001',options);
|
|
|
|
|
- uni.requestPayment({
|
|
|
|
|
- provider: "appleiap",
|
|
|
|
|
- orderInfo: {
|
|
|
|
|
- productid: options.applePid, //产品id,来自于苹果
|
|
|
|
|
- quantity: 1, //产品数量
|
|
|
|
|
- manualFinishTransaction: true,
|
|
|
|
|
- },
|
|
|
|
|
- success: (e) => {
|
|
|
|
|
- // 苹果内购成功
|
|
|
|
|
- console.log('002',e);
|
|
|
|
|
- const {
|
|
|
|
|
- transactionIdentifier: paynum,
|
|
|
|
|
- transactionReceipt: receipt,
|
|
|
|
|
- } = e;
|
|
|
|
|
- Object.assign(appleData, {
|
|
|
|
|
- paynum,
|
|
|
|
|
- receipt,
|
|
|
|
|
- });
|
|
|
|
|
- console.log('options.taocanId',options.taocanId);
|
|
|
|
|
- orderPayApple({
|
|
|
|
|
- chanpinId: appleData.chanpinId, // 产品ID
|
|
|
|
|
- paynum: paynum, // 支付号
|
|
|
|
|
- receipt: receipt, // 票据
|
|
|
|
|
- taocanId: options.taocanId, // 套餐ID
|
|
|
|
|
- })
|
|
|
|
|
- .then((res) => {
|
|
|
|
|
- console.log('res',res.data);
|
|
|
|
|
-
|
|
|
|
|
- uni.hideLoading();
|
|
|
|
|
- if (res.code == 0 && res.data) {
|
|
|
|
|
- // 完成内购
|
|
|
|
|
- console.log('123123123123');
|
|
|
|
|
- iapChannel.finishTransaction(e
|
|
|
|
|
- .transactionIdentifier);
|
|
|
|
|
- // 购买成功
|
|
|
|
|
- console.log('1231231',res);
|
|
|
|
|
- paySuccessResult();
|
|
|
|
|
- } else {
|
|
|
|
|
- console.log('shibai');
|
|
|
|
|
- iapChannel.finishTransaction(e
|
|
|
|
|
- .transactionIdentifier);
|
|
|
|
|
- toast("业务异常,订单支付失败,请联系管理员");
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
|
|
+ // 核心修复2:then回调内增加try/catch,隔离局部异常
|
|
|
|
|
+ orderPayApple({
|
|
|
|
|
+ chanpinId: appleData.chanpinId,
|
|
|
|
|
+ paynum: paynum,
|
|
|
|
|
+ receipt: receipt,
|
|
|
|
|
+ taocanId: options.taocanId,
|
|
|
|
|
+ }).then((res) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ console.log('1231231 orderPayApple接口成功', res);
|
|
|
|
|
+ if (res.code == 0 && res.data) {
|
|
|
|
|
+ // 业务成功,收尾事务(此时iapChannel已存在,作用域正常)
|
|
|
|
|
+ iapChannel.finishTransaction(payRes
|
|
|
|
|
+ .transactionIdentifier);
|
|
|
|
|
+ paySuccessResult(); // 执行支付成功逻辑
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 业务返回非0码,仍需收尾事务
|
|
|
|
|
+ iapChannel.finishTransaction(payRes
|
|
|
|
|
+ .transactionIdentifier);
|
|
|
|
|
+ toast("业务异常,订单支付失败,请联系管理员");
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
type: "orderPayApple",
|
|
type: "orderPayApple",
|
|
|
msg: "业务异常,订单支付失败",
|
|
msg: "业务异常,订单支付失败",
|
|
|
- err: e,
|
|
|
|
|
|
|
+ err: new Error(
|
|
|
|
|
+ `业务返回码异常:${res.code}`),
|
|
|
from: "apple",
|
|
from: "apple",
|
|
|
});
|
|
});
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- .catch((err) => {
|
|
|
|
|
- uni.hideLoading();
|
|
|
|
|
- toast("订单支付校验失败,请联系管理员");
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
- type: "orderPayApple",
|
|
|
|
|
- msg: "订单支付校验失败",
|
|
|
|
|
- err: err,
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (innerErr) {
|
|
|
|
|
+ // 捕获then回调内的局部异常(如iapChannel意外丢失、res字段缺失等)
|
|
|
|
|
+ console.log('innerErr',innerErr);
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ toast("订单处理异常,请联系管理员");
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
|
|
+ type: "orderPayApple_inner",
|
|
|
|
|
+ msg: "订单成功回调内执行异常",
|
|
|
|
|
+ err: innerErr, // 打印具体的局部异常信息
|
|
|
from: "apple",
|
|
from: "apple",
|
|
|
});
|
|
});
|
|
|
|
|
+ }
|
|
|
|
|
+ }).catch((err) => {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ // 仅捕获orderPayApple接口请求失败的异常(如网络错误、后端1002码等)
|
|
|
|
|
+ toast("订单支付校验失败catch,请联系管理员");
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
|
|
+ type: "orderPayApple",
|
|
|
|
|
+ msg: "订单支付校验失败",
|
|
|
|
|
+ err: err,
|
|
|
|
|
+ from: "apple",
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
- },
|
|
|
|
|
- fail: (e) => {
|
|
|
|
|
- uni.hideLoading();
|
|
|
|
|
- toast("苹果购买失败,请联系管理员");
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ fail: (payErr) => {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ toast("苹果购买失败fail,请联系管理员");
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
type: "uni.requestPayment",
|
|
type: "uni.requestPayment",
|
|
|
msg: "苹果内购失败",
|
|
msg: "苹果内购失败",
|
|
|
- err: e,
|
|
|
|
|
|
|
+ err: payErr,
|
|
|
from: "apple",
|
|
from: "apple",
|
|
|
});
|
|
});
|
|
|
- },
|
|
|
|
|
- });
|
|
|
|
|
- },
|
|
|
|
|
- function(e) {
|
|
|
|
|
- // 获取订单信息失败回调方法
|
|
|
|
|
- uni.hideLoading();
|
|
|
|
|
- toast('内购订单获取失败,请联系管理员')
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
- type: "uni.requestPayment",
|
|
|
|
|
- msg: "苹果内购失败",
|
|
|
|
|
- err: e,
|
|
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ function(orderErr) {
|
|
|
|
|
+ // 获取订单信息失败回调
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ toast('内购订单获取失败,请联系管理员');
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
|
|
+ type: "iapChannel.requestOrder",
|
|
|
|
|
+ msg: "苹果内购订单获取失败",
|
|
|
|
|
+ err: orderErr,
|
|
|
from: "apple",
|
|
from: "apple",
|
|
|
});
|
|
});
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+ },
|
|
|
|
|
+ // 核心修复3:补全plus.payment.getChannels的失败回调(之前缺失)
|
|
|
|
|
+ function(channelErr) {
|
|
|
|
|
+ uni.hideLoading();
|
|
|
|
|
+ toast('获取支付通道失败,请检查内购配置');
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
|
|
+ type: "plus.payment.getChannels",
|
|
|
|
|
+ msg: "获取苹果内购支付通道失败",
|
|
|
|
|
+ err: channelErr,
|
|
|
|
|
+ from: "apple",
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
- toast('支付环境检测异常,请联系管理员')
|
|
|
|
|
- applePayError &&
|
|
|
|
|
- applePayError({
|
|
|
|
|
- type: "uni.requestPayment",
|
|
|
|
|
- msg: "苹果内购API唤起失败",
|
|
|
|
|
- err: err,
|
|
|
|
|
- from: "plus.payment.getChannels",
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ uni.hideLoading(); // 核心修复4:异常时隐藏loading,避免页面卡死
|
|
|
|
|
+ toast('支付环境检测异常00,请联系管理员');
|
|
|
|
|
+ applePayError && applePayError({
|
|
|
|
|
+ type: "applePay_try_catch",
|
|
|
|
|
+ msg: "苹果内购API唤起失败",
|
|
|
|
|
+ err: err,
|
|
|
|
|
+ from: "plus.payment.getChannels",
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 支付成功
|
|
// 支付成功
|