苹果内购IAP记录

6,569 阅读6分钟

第一次接入内购,懵逼到家了,什么都可能有疑问,记录下问点以及解答。

IAP相关疑问点:

1、首先申请账号,然后开通付款协议

2、生成证书,勾选内购,对应的XCode也要设置打开内购。

3、创建内购商品,该填写的信息都填好,如果报:元数据缺失,就是还有信息没填完整。都按要求填好,保存,直到变成「准备提交」状态。

4、添加测试内购商品,等到商品变成「准备提交」即可进行测试了,不需要提交审核,实际你也不能单独提交测试商品审核。 当然也就更不用提交APP审核了。 (IAP没接入,不完整,也没办法提审,提审也不会过。  这里苹果客服误导过我,说要先提交应用审核,测试商品才能用)

5、添加沙盒测试账号, 随便填是邮箱地址就行,怎么简单怎么来吧,因为后面测试要输入账号,密码呢。

6、进行内购商品测试时候,测试机iPhone的账号不需要登录为你的沙盒测试Appleid的。   如果你调不起测试商品,就去看前面步骤,是否完成了。

7、发起请求的时候,传入的商品ID是你创建测试商品的ID,不是苹果自动映射的那个ID。

8、发起内购请求后,如果可以调起IAP,会让你输入之前创建的沙盒测试Appleid,输入密码进行支付。

9、购买框会提示是在沙盒环境的,随便支付,反正不出钱的。

10、沙盒地址和生产地址填写: 如果有自己服务器验签,要填自己后端服务器地址,Post接口。 沙盒测试时候,就填沙盒地址哇。 沙盒账号大区设置要对应,在哪个上架开通就选择设置在哪个大区。

11、具体IAP过程:

A。获取商品ID,商品比较少,你可以直接本地获取内购商品ID。 你也可以让后端做好映射,请求他们返回商品ID

B。获取到商品ID后,请求后端创建预支付订单信息,记录后端返回订单信息,后续作为比对订单用。

C。拿到预订单信息后,发起IAP请求,等支付结果返回。 回来信息后,发送订单数据给后端做二次校验, 最终的结果以后端返回为准。

D。记录最近最后一笔订单信息,防止特殊情况漏单。 在每次APP启动时候,获取记录订单去查询是否有未处理的订单,处理后删除信息。

遇到的问题:

测试商品一直报「没有提供APP内购买的相关信息。请稍后重试。 21102」这个错误,查资料说新APP才会,之前都不会。 基本能确定是Apple服务那边的问题,各个开源SDK等也在收集等待结果, 而且就是11月20日前后,新包直接接入IAP出现的。。

各种方案都试了,V1、V2单独/混合方案都试过了,与支付API版本没关系,而且xcode本地测试可以,沙盒与Apple服务器交互就报异常。
看样子只能先提交一个不带IAP的包试试了,很大概率就可以了,等我结果哈,现在在整理不带IAP的占坑包。。。 看来上面4条里,苹果客服没有骗我,还得听Apple粑粑的啊。

可以调起支付,输入沙盒账号,可以支付成功,但是最后给回这么一个信息。21102, ErrorCode=3539 支付完报错: Error Domain=ASDServerErrorDomain Code=3539 "没有提供 App 内购买的相关信息。请稍后重试。" UserInfo={NSLocalizedDescription=没有提供 App 内购买的相关信息。请稍后重试。, AMSServerErrorCode=3539} 提示框:没有提供APP内购买的相关信息。请稍后重试。 21102 1fDPDLQiMx.png

问题参考链接:

developer.apple.com/forums/thre… Apple也不解决回复 ask.dcloud.net.cn/question/18… 网友支招

21102问题补充:

11月28日早上再次测试,突然可以购买成功了,什么都没改,也没提不带IAP的占位包,突然就好了。。。 是不是App Store 偷偷修复了[doge]

其他疑问❓

1、支付成功,等苹果给通知,这个代理方法func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {}能主动触发吗?等苹果给了回复结果弹窗,必须点弹窗才能触发吗? 不点击下面弹窗「好」不会触发吗?? 20231129-211159.png -这个只能点击「好」才会触发购买成功的代理方法。 不点就不触发。 所以还是要记录最后一笔订单的信息,要二次验证。

2、每次调用Apple 服务都很慢,这个能怎么优化吗??这也太慢了,见下面视频。。。 一般等待过程应该做什么? 除了添加Loading等待提示,我暂时不知道怎么处理。。

3、怎么自定义弹出的商品购买界面? 这个要去研究看下

4、下单之前怎么区分生产还是沙盒环境?? 下单之前不能区分,支付完成后会有什么环境返回。 所以服务端要做两步操作:首先用生产环境验证,确定返回的是沙箱环境,再用沙箱环境验证结果。

5、沙盒账号可以在生产环境验证测试吗?生产环境怎么测试? 沙盒可以在生产下单吗?

在Testflight阶段和审核过程都是走的沙箱环境,放心测。 生产环境等上线后自己在测吧。

6、被拒后,觉得不是自己的问题,回复邮件还用新构建一个包吗?

回复邮件,说明原因,重新点提交审核即可,不用新构建包。

7、因为获取不到App Store 内购商品信息被拒了。

问题是:func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {}这个方法返回内购商品信息为空。 这就纯纯的调Apple API啊,不涉及任何其他东西,而且第一次审核你都购买成功了,第二次审核就不能购买了??? 除了他网络问题我给不出什么答案。 重新发一个包继续提交审核, 等~

8、第一次提交审核,会连同内购商品一起提交审核。

审核被拒后,打包再次提交审核,是不能重新勾选内购商品的,只能修改商品信息。内购商品已经「在审核」状态中。 难道是因为这个原因导致的问题7吗?? 这个再次提交审核内购商品怎么勾选还是不用选,已经存在了呢??

建议:内购商品ID还是搞点特殊有意义的字符,避免获取失败或者重复吧。啥也没改,第二次在提交就能购买了,这IAP服务真的不稳定啊。

9、已经上架的App,在想添加内购商品,不需要等和App版本一起提交,内购商品是可以单独提交审核的。

10、已经上架、通过审核的内购商品,修改商品信息,是立即生效的,不需要再次审核。

官方文档:

由于要支持最低iOS12系统,所以只能用V1版本。V2要iOS15系统以上。 V1 文档:original api for in APP Purchase developer.apple.com/cn/document…

V2 文档: in APP Purchase developer.apple.com/cn/document…

参考文章:

常见错误码

详细步骤