wangguoyu 18 giờ trước cách đây
mục cha
commit
d8f6520236
3 tập tin đã thay đổi với 139 bổ sung113 xóa
  1. 14 5
      pages/chanpinMy/order.vue
  2. 2 1
      pages/chanpinShop/cp1/dingdan.vue
  3. 123 107
      pages/chanpinShop/usePay.js

+ 14 - 5
pages/chanpinMy/order.vue

@@ -39,8 +39,10 @@
 <script setup>
 	import {
 		reactive,
-		ref
+		ref,
+		onMounted
 	} from "vue";
+
 	import {
 		orderList
 	} from '@/api/shop.js'
@@ -63,13 +65,16 @@
 			contentnomore: '没有更多'
 		}
 	})
+	let pageOptions = {};
 	const tipContent = '请绑定手机号';
 	const goBindDialogRef = ref(null);
-	function goBindPhone(){
+
+	function goBindPhone() {
 		uni.navigateTo({
 			url: '/pages/bindPhone/bindPhone?from=order'
 		})
 	}
+
 	function handleBack() {
 		uni.switchTab({
 			url: '/pages/chanpinMy/my'
@@ -145,11 +150,15 @@
 
 	onLoad((options) => {
 		getMore();
+		pageOptions = options
 		// 判断游客 如果是弹出弹窗,忽略和绑定, 忽略删除缓存,绑定更新用户userName 删除缓存
 		// 此时支付成功+游客模式支付进来的情况
-		if (options.zhifu && getUserIsYouke()) {
-			// 弹出绑定手机号弹窗
-			goBindDialogRef.value..handleShow();
+
+	})
+	onMounted(() => {
+		// 组件已挂载,ref可正常使用
+		if (pageOptions.zhifu === 'success' && getUserIsYouke()) {
+			goBindDialogRef.value.handleShow();
 		}
 	})
 </script>

+ 2 - 1
pages/chanpinShop/cp1/dingdan.vue

@@ -75,6 +75,7 @@
 	import {
 		getUserIsYouke
 	} from "@/utils/common.js"
+		import cacheManager from "@/utils/cacheManager.js";
 	const currentPlatform = ref(null);
 
 	function isIOSorAndroid() {
@@ -144,7 +145,7 @@
 			cacheManager.remove("contentInfo");
 			// zhifu='success' 用于判断在订单页 游客模式ios支付成功情况,要去弹出弹窗
 			uni.navigateTo({
-				url: "/pages/chanpinMy/order?zhifu='success'"	
+				url: "/pages/chanpinMy/order?zhifu=success"	
 			})
 
 		}, //支付成功

+ 123 - 107
pages/chanpinShop/usePay.js

@@ -346,137 +346,153 @@ export function usePay(opt = {}) {
 	}
 
 	// 苹果支付 --- 无需check 直接购买成功
+	// 苹果支付 --- 无需check 直接购买成功
 	function applePay(options) {
-		Object.assign(appleData, options)
+		Object.assign(appleData, options);
+		// 核心修复1:提升iapChannel作用域,定义在applePay方法内,所有嵌套回调可访问
+		let iapChannel = null;
 
 		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",
 							msg: "内购商品Id丢失,请确认是否已成功配置",
 							err: new Error("内购商品Id丢失,请确认是否已成功配置"),
 							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",
 													msg: "业务异常,订单支付失败",
-													err: e,
+													err: new Error(
+														`业务返回码异常:${res.code}`),
 													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",
 											});
+										}
+									}).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",
 										msg: "苹果内购失败",
-										err: e,
+										err: payErr,
 										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",
 							});
-					},
-				);
-			});
+						}
+					);
+				},
+				// 核心修复3:补全plus.payment.getChannels的失败回调(之前缺失)
+				function(channelErr) {
+					uni.hideLoading();
+					toast('获取支付通道失败,请检查内购配置');
+					applePayError && applePayError({
+						type: "plus.payment.getChannels",
+						msg: "获取苹果内购支付通道失败",
+						err: channelErr,
+						from: "apple",
+					});
+				}
+			);
 		} 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",
+			});
 		}
-
 	}
 
 	// 支付成功