uniapp-ios支付

uniapp安卓包中的微信,支付宝逻辑放在iOS测试包中也能使用.

但询问iOS开发者后得知,有支付相关功能的app要上架苹果,必须先有苹果支付,不然苹果审核不给过.甚至没有支付逻辑,但打包时有支付相关的SDK也不行,苹果会认为你偷偷做了支付逻辑,想要绕开他.

一. 去苹果开发者后台把支付勾上.

地址:Apple Developer

之前没勾,现在勾上之后,可能要重新生成mobileprovision文件.并重新打uniapp测试基座.

二.去appstoreconnect里添加一个app内购项目 

地址: https://appstoreconnect.apple.com/apps/ 

苹果好像不允许随意的价格,有多少商品,就要添加多少内购项目.

产品ID是唯一的,即使把创建的内购项目删了,也不能用之前的产品ID,之后支付的代码里也需要用到这个ID.

销售范围,价格时间表等仅供参考.除了app推广,其他项好像必填.

审核信息一栏上传的图片必须是iPhone手机截图,苹果可能做了图片尺寸的校验.

填写好,点击存储.等待添加的app内购项目的状态变为准备提交即可.挺慢的,等了好几分钟,审核信息栏的图片一直在上传状态,等了几分钟就行了.

还有我的截图第一张和其他张不是一个内购项目的.第一次添加忘截图了,不要误会.

  

三.同意新的协议,添加付费app

运行代码报错:{"message":"Payment_appleiap:返回订单信息失败http://ask.dcloud.net.cn/article/282","code":-100},网上搜索后,了解到要同意付费app的协议,苹果会有一个提示,在appstoreconnect里,因为已经同意了所以现在截不了图.

然后还要根据付费app的要求(点击那个问号),完成协议,提供银行业务和税务信息,这一块让公司运营搞的所以也不清楚。

最终结果就是,付费app处于有效状态.

地址: Agreements, Tax, and Banking

四.支付相关的代码

在模块配置里把苹果支付勾上,之前没勾,现在勾上的,要重新打包.

支付代码:  产品ID就是第二步添加内购项目的产品ID.

			initIAP() {
				let that = this
				plus.payment.getChannels((channels) => {
					console.log(channels);
					for (var i in channels) {
						var channel = channels[i];
						if (channel.id == 'appleiap'){
							console.log("苹果")
							let iap = channel;
							//支付参数
							iap.requestOrder(['产品ID'], function(orderList){
								    //必须调用此方法才能进行 iap 支付 
									console.log('requestOrder success666: ' + JSON.stringify(orderList))
									that.applePay(orderList[0])
								},function(e){
									console.log('requestOrder failed: ' + JSON.stringify(e));
									// console.log('暂不支持苹果 iap 支付')
							});
						}	
					}
				}, function(e) {
					console.log("获取iap支付通道失败:" + e.message);
				});
			},
			applePay(para) {
				console.log(para)
				uni.requestPayment({
					provider: 'appleiap',
					orderInfo: {
						productid: para.productid,
						username: this.currentUserName, // 用户标识
						optimize: true // 设置 optimize: true 解决丢单问题  
					},
					/* 
					orderInfo可传参数一览
					productid: (String 类型 )(必填) 商品的标识,你在苹果那里添加的商品标识 
					username: (String 类型 )(可选) 购买用户名称,我喜欢在这里传入订单号,这样支付成功时就可以获得订单号 
					quantity: (String 类型 )(可选) 商品数量,默认为 "1" 
					optimize:(Boolean)(可选) HX 3.1.10 版本新增参数,解决用户未绑定支付方式造成的丢单问题; 
					*/
					success: (e) => {
						// uni.LTY.loaded();
						console.log(e)
						//这里把参数返回服务器进行二次验证 
						//这里再次验证是否订单真实有效
						uni.request({
							url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。 
							data: {
								parasm: e,
							},
							success: (res) => {
								uni.showModal({
									content: "Success",
									showCancel: false,
								});

								try {
									// 购买成功 更新用户vip时长
									// this.updateUserVip(para);
									// uni.navigateBack();
								} catch (e) {
									//TODO handle the exception

								}
							},
						});
					},
					fail: (e) => {
						console.log(e);
						// uni.LTY.loaded();
						uni.showModal({
							content: "fail: " + e.errMsg,
							showCancel: false,
						})
					},
					complete: () => {
						console.log("payment结束");
						// this.payShow = false;
						// this.payShow2 = false;
					}


				})
			},

五.添加沙盒测试员

运行代码测试,购买成功后,一直提示: 此时你没有权限在sandbox购买此inapp .

解决: 添加沙盒测试员后,再去iPhone的设置=>appstore=>沙盒账户,退出原来的沙盒账户,登录刚刚添加的沙盒测试员账户.

添加沙盒测试员时报错: This email address is not available for use as an Apple ID. You may already have an Apple ID associated with this address. Please try again or sign in using your existing Apple ID.       我理解的意思就是,这个邮箱注册过了,已经被当做apple id了.

要么用一个新的邮箱: 直接注册一个新的邮箱,添加到沙盒测试员就行,我自己的做法,比网上介绍的"解绑"省事多了.

要么"把原来的邮箱解绑": 把这个报错百度一下,很多文章说了一堆,总结起来的意思就是解绑,解绑过程看着就很麻烦,不如用第一种方法.

六.上架遇到的问题

苹果测试员一直用自己的账号测试,但我们的内购项目还没上架成功,他的账号又不在沙盒里,然后一直说我们的支付不能用。想让他用我们的测试号,他也不同意。

网上的说法是,不要直接上架app里的支付,先上架一个版本把内购项目通过,再上架app里的支付功能。

具体的我也没试,做其他项目了,可以用蒲公英分发测试。

苹果开发者写文章都有点官方文档的感觉, 可以用大白话,非要用云里雾里的说法,图贴的也少.

### 支付宝 `requestPayment` 请求失败错误码 999 的解决方案 当遇到支付支付请求返回错误码 999 时,这通常表示系统级错误或未知错误。此类问题可能由多种因素引起,包括但不限于服务器端配置不当、客户端环境不兼容或其他未预见的技术障碍。 #### 检查服务端接口参数 确保传递给支付宝的服务端接口参数完全正确无误。任何细微的差异都可能导致验证失败进而触发此错误[^3]。具体来说: - **签名算法**:确认使用的签名方法与支付宝约定一致。 - **公私钥对**:检查用于加密解密过程中的密钥是否匹配且有效期内。 - **时间戳同步**:保证本地时间和远程服务器之间的时间差在一个合理范围内。 #### 客户端 SDK 版本更新 对于前端应用而言,保持所依赖库版本最新同样重要。旧版可能存在已知漏洞或是不再支持某些新特性而引发异常行为。建议开发者定期查阅官方文档并及时升级至稳定发行版[^2]。 ```javascript // 更新 uni-app 插件到最新版本 npm install @dcloudio/uni-cli@latest -g ``` #### 网络状况排查 良好的网络连接是顺利完成在线交易的前提条件之一。如果设备处于信号较弱区域或者频繁切换 Wi-Fi 和移动数据源,则容易造成通信中断从而影响最终结果。可以尝试更换测试地点来排除这类干扰因素的影响[^4]。 #### 日志记录分析 启用详细的日志输出有助于快速定位潜在缺陷所在位置。通过捕获完整的 HTTP 请求响应链路信息以及内部函数执行流程图谱,能够更直观地发现隐藏于表象之下的逻辑瑕疵之处[^1]。 ```javascript console.log('Request Details:', JSON.stringify(options)); try { const result = await uni.requestPayment({ provider: 'alipay', ...options, }); } catch (error) { console.error('Error occurred during payment process', error); } ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值