消耗型&非自动续期订阅的开发流程
适用场景
大量应用于iOS系统中的游戏当中,像一些游戏中的金币,宝石的交易都是采用IAP支付。苹果官方规定,当APP涉及到虚拟货币的交易时,只能使用IAP进行支付,否则会在APP审核过程中被拒绝。而我们许多生活应用使用微信支付、支付宝支付却仍可通过审核,是因为都用于现实物品的交易。此外苹果会收取虚拟货币盈利的百分之30。
类型说明
| 消耗型商品 | 非消耗型商品 | 非续期订阅 | 自动续期订阅
1.消耗型商品
顾名思义, 可以消耗使用的商品, 比如游戏中的金币, 钻石等, 可以用来购买应用内虚拟物品的货币。
2.非消耗型商品
无法被消耗的商品,比如一些教育型APP中的课程, 再比如一些赛车游戏中的赛道, 这类商品需要在审核添加恢复购买按钮, 用于用户购买过后再误删除或其他原因卸载APP后的恢复流程, 否则提交审核会被拒绝。
3.非续期订阅
此类商品与消耗型商品类似, 比如一个月的会员, 一个季度的会员等,与消耗型商品的差异在于, 这类商品在验证凭证时需要传递共享秘钥
共享秘钥.jpg
4.自动续期订阅
这类商品和其他商品的流程也有些许不同, 应用比如视频APP中的连续包月会员, 此类商品到期会自动扣费, 服务器的验证逻辑也会有所不同,流程可以参考这篇文章
支付验证流程
整个流程大体为
- 用户点击发起购买请求
- 服务器获生成一份订单并返回App Store商品id给客户端
- 客户端对这个商品id进行IAP商品查询
- 用户支付调起IAP支付
- 支付成功获取到一份交易成功凭证
- 客户端发送订单号和成功支付的凭证到服务器
- 服务器验证凭证是否合法,对用户业务操作(成功增加一个月会员)
- 返回查询结果到客户端
- 客户端业务逻辑处理
非续期订阅支付流程(以一个月会员为例)
-
用户点击发起购买请求
-
服务器获取交易订单并返回给客户端
- 服务器接收到来自客户端的请求,对这笔交易生成一份订单,并返回这个item的App Store商品id。
-
支付订单
- 客户端调用苹果自带的API对这个App Store商品id进行支付
-
发送支付成功的凭证到自己服务器
- 以凭证、订单号、用户uid等为参数请求服务器, 服务器向苹果服务器验证凭证是否支付
- 此处, 服务器验证凭证时, 因为为非续期订阅支付, 需携带上文中的共享秘钥和凭证进行验证, 苹果验证结果会返回订单的详细信息, 服务器根据返回信息来进行业务处理
-
客户端在收到验证结果后, 刷新界面即完成整个流程
-
丢单处理
由于IAP服务器无法保证质量, 或者自己服务器验证凭证出现问题时, 可能会出现丢单(用户付费成功, 但是凭证无法成功向自己服务器验证)的情况, 对于这种情况, 我们可以这样处理- 在用户下单成功后, 储存订单&uid&凭证
/**
存储 订单&uid&凭证
@param orderID 订单
@param uid 用户uid
@param receipt 凭证
@param saveKey 储存key
*/
- (void)saveOrderReceiptWithOrderID:(long long)orderID
uid:(NSString *)uid
receipt:(NSString *)receipt
saveKey:(NSString *)saveKey;
在用户向服务器验证成功后或者非网络原因造成的失败后, 删除此条记录,
/**
删除 订单&凭证
@param orderID 订单
@param receipt 凭证
@param saveKey 储存key
*/
- (void)removeOrderReceiptWithOrderID:(long long)orderID
receipt:(NSString *)receipt
saveKey:(NSString *)saveKey;
这样如果由于网络问题或者服务器出现问题造成丢单, 我们可以在下一次用户启动APP再次去进行验证这笔订单, 重复上面流程
/**
核对支付成功但是验证失败的订单
*/
- (void)checkLocalLostVipOrder;
- 伪造订单处理
IAP支付难免会出现一些伪造凭证的验证, 对此, 服务器端对于凭证的验证一定要十分谨慎, 我们APP曾收到过伪造凭证的验证, 可以参考一下验证:- 核对凭证验证后itemID
- 核对凭证是否为正式环境的凭证
- 核对凭证的有效时间
- 对于越狱用户的处理, 之前做消耗品IAP支付的时候, 对于越狱用户由于有一些IAP插件的存在, 我们选择对于越狱用户直接进行微信支付, 随着后来判断逻辑的增加, 对于越狱用户也启用了IAP支付
审核需知
IAP审核时, 需要提供沙盒测试账号和一个APP的测试账号, 在审核过程时, 我们整个流程都已经切换为正式环境, 但审核人员仍然使用测试凭证去进行验证, 我们服务器需要在审核阶段, 对于此uid的凭证仍然去测试验证接口去验证, 否则会被拒绝通过。
IAP审核遇到问题汇总及解决方案
2. 1 Performance: App Completeness(性能:应用程序完整性)
Guideline 2.1 - Information Needed
We have started the review of your app, but we are not able to continue because we cannot locate the in-app purchases within your app.
Next Steps
To help us proceed with the review of your app, please reply to this message providing the steps for locating the in-app purchases in your app.
准则2.1-所需信息
我们已开始审阅你的应用,但无法继续,因为我们无法在你的应用中找到应用内购买。
下一步
若要帮助我们继续查看你的应用,请回复此消息,提供在你的应用中查找应用内购买的步骤。
解决办法
- 发送邮件提供在你的应用中查找应用内购买的步骤
3.1.1 - Business - Payments - In-App Purchase
业务-支付-应用内购买
We noticed that your in-app purchase product is set to an incorrect product type.
分配对象1月超级会员, 分配对象1季超级会员, and 分配对象1年超级会员 is set to Consumable.
Next Steps
Since the service offered by your app requires the user to make an advance payment to access the content or receive the service, please use the non-renewable subscription in-app purchase product type. Non-renewable subscription content must be made available to all iOS devices owned by a single user, as indicated in guideline 3.1.2 of the App Store Review Guidelines.
Note: The product type cannot be changed once an in-app purchase product has been created. Therefore, you will need to create a new in-app purchase product with the correct product type.
我们注意到您的应用内购买产品设置为不正确的产品类型。
设为消耗品。
下一步
由于应用程序提供的服务要求用户预付款才能访问内容或接收服务,请使用“==应用程序购买中的不可续订订阅==”产品类型。如App Store Review Guidelines指南3.1.2所示,不可更新的订阅内容必须提供给单个用户拥有的所有iOS设备。
==注意==:==创建应用内购买产品后,无法更改产品类型==。因此,您需要创建具有正确产品类型的新应用内购买产品。
解决办法
创建新的内购商品定义为:非自动续期订阅
1.先去取凭证根据key 'receipt'
2.取不到存储
3.取得到就解析,先decode 再去key和value ,key为transactionReceipt,value为orderId
4.serverNoti回调之后移除该条数据
5.若没有被移除,在root_page处理该订单并上报,先取后decode,然后上报
Guideline 2.1 - Performance - App Completeness
We found that your in-app purchase products exhibited one or more bugs when reviewed on iPad running iOS 13.3.1 on Wi-Fi.
Specifically, an error message displayed when we tried to make a purchase using IAP.
Next Steps
When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.
Resources
You can learn more about testing in-app purchase products in your development sandbox environment in App Store Connect Developer Help.
For more information on receipt validation, please see What url should I use to verify my receipt? in the In-App Purchase FAQ.
Learn how to generate a receipt validation code in App Store Connect Developer Help.
Please see attached screenshot for details.
我们发现你的应用内购买产品在运行iOS13.3.1的iPad上的Wi-Fi上显示了一个或多个错误。
特别是,当我们尝试使用IAP进行购买时显示错误消息。
下一步
验证服务器上的收据时,服务器需要能够处理从苹果测试环境获取收据的生产签名应用程序。建议的方法是,生产服务器总是首先根据生产应用程序商店验证收据。如果验证失败,错误代码为“Sandbox receipt used in production”,则应改为针对测试环境进行验证。
资源
您可以在app Store Connect Developer帮助中了解有关在开发沙盒环境中测试应用内购买产品的更多信息。
有关收据验证的详细信息,请参阅应使用哪个url验证收据?在应用内购买常见问题解答中。
了解如何在App Store Connect Developer帮助中生成收据验证代码。
解决办法
- 1.修改服务端验证支付凭证的流程,先验证正式的如果失败再验证沙盒环境
- 2.不勾选iPad
- 3.在iPad上要能正常运行
3. 1.2 Business: Payments - Subscriptions
Guideline 3.1.2 - Business - Payments - Subscriptions
Your app provides a content subscription that is less than the required 7-day minimum.
Specifically, 72小时CP恋爱体验.
Next Steps
To resolve this issue, please revise your subscription to be at least 7 days long.
1.2业务:付款-订阅
准则3.1.2-业务-付款-订阅
您的应用程序提供的内容订阅少于所需的7天最少订阅量。
具体来说,72小时CP恋爱体验。
下一步
若要解决此问题,请将订阅修改为至少7天。
解决办法
- 1.修改“72小时CP恋爱体验”名称及文字描述,并且制定时间,跟会员格式保持一致
Guideline 1.2 - Safety - User Generated Content
Your app enables the display of user-generated content but does not have the proper precautions in place.
Next Steps
To resolve this issue, please revise your app to implement all of the following precautions:
- Require that users agree to terms (EULA) and these terms must make it clear that there is no tolerance for objectionable content or abusive users
- A method for filtering objectionable content
- A mechanism for users to flag objectionable content
- A mechanism for users to block abusive users
- The developer must act on objectionable content reports within 24 hours by removing the content and ejecting the user who provided the offending content
准则1.2-安全-用户生成的内容
您的应用程序可以显示用户生成的内容,但没有适当的预防措施。
下一步
若要解决此问题,请修改您的应用程序以实施以下所有预防措施:
-要求用户同意条款(EULA),并且这些条款必须明确,不允许有异议的内容或滥用用户
-一种过滤不良内容的方法
-一种用户标记不受欢迎内容的机制
-用户阻止滥用用户的机制
-开发人员必须在24小时内通过删除内容并弹出提供违规内容的用户来处理令人不快的内容报告
解决方案:
https://www.jianshu.com/p/9c2369662660
补充
订阅类有效期设置
苹果自动续费订阅(Auto renewable Subscription)
实际订阅有效期 Sandbox测试有效期
1 周 3 分钟
1 个月 5 分钟
2 个月 10 分钟
3 个月 15 分钟
6 个月 30 分钟
1 年 1 小时
注意
这是自定续费订阅。如果是 非自动续费订阅,是需要程序自己来判断有失效期的。
网友评论