1. IOS 内购掉单问题
向服务器请求OrderID,向ios发起内购时传递给payment:
在付款成功时applicationUsername会被ios返回,取出orderid连同收据传给服务器。
问题就出在那个orderid上,不知道为什么总有用户的orderID为null,导致充值失败。
多方查找后确定原因如下:
目前暂无替代方案。
另:App处于审核状态时,该测试版本无法进行内购操作是正常的,不必惊慌。
2. swift 内购
a. 消耗型商品:只可以使用一次的产品,使用以后即失效,必须再次购买。
示例:小说App购买的书币书券。
b. 非消耗型商品:只需购买一次,不会过时或随着使用而减小的产品。
示例:游戏 App 的赛道。
c. 自动续期订阅:容许用户在固定时间段内购买动态内容的产品。除非用户选择取消,不然此类订阅会自动续期。
示例:每个月订阅提供流媒体服务的 App。
d. 非续期订阅:容许用户购买有时限性服务的产品。此 App 内购买项目的内容能够是静态的。此类订阅不会自动续期。
示例:为期一年的已归档文章目录订阅。
a. 客户端向Appstore请求购买产品(假设产品信息已经取得),Appstore验证产品成功后,从用户的Apple账户余额中扣费。
b. Appstore向客户端返回一段receipt-data,里面记录了本次交易的证书和签名信息。
c. 客户端向我们可以信任的服务器提供receipt-data
d. 服务器对receipt-data进行一次base64编码
e. 把编码后的receipt-data发往itunes.appstore进行验证
f. itunes.appstore返回验证结果给服务器
g. 服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知
a. 验证苹果自动续费的合理性: 是否是切换了账号了,是否是同一个账号下有2个不同的appleid订阅(订阅类型会进行此校验,消耗性直接走b)
b. 后台校验成功后,创建后台订单
c. 订单生成后,传入proctID发起购买请求,苹果服务器验证产品成功后,从用户的Apple账户余额中扣费并向客户端返回凭证(receipt-data)
d. 客户端拿到凭证后,向服务器发起凭证校验,服务器拿到凭证进行一次base64编码,发到苹果服务器进行校验并返回结果给服务器。
e. 服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知
解决掉单问题前,我们要先简单把从支付请求开始到结束的步骤按照顺序排列出来,然后分析每一个步骤可能存在的调单情况。
调单的处理可分为在拿到交易订单之后调用 IPA 创建一个 IPA 交易,并且添加到支付队列,收到回调前跟收到回调后。
在创建后台订单时,此时后台会把订单信息回调,并将其已模型的形式存入Keychain中(存入Keychain中数据不会因卸载app等操作丢失)
通过校验队列中的transactions进行判断,没有的话就是没有发起支付请求,那么此时需要重新发起支付的请求。
通过校验队列中的transactions进行判断,有的话就是已经发起支付请求但是没有收到回调,此时需要做SKPaymentQueue.default().restoreCompletedTransactions()(恢复已经完成的 交易)
首先将transactionId和凭证更新到已存入的Keychain中,通过校验Keychain中的transactionId是否存在,来确定是否已经收到回调,此时需要拿着存入Keychain中的凭证等到后台去校验。