In-App-Purchase掉错单优化
概述
因苹果内购AppleId关联用户设计,与我们账号关联用户设计差异,还有苹果对用户信息的保护,导致我们拿到苹果支付结果时,不能准确锁定用户账号,从而错单漏单。为解决此类问题,我们需要做一些辅助功能保证支付结果与用户准确关联。
思路
苹果内购有同一商品交易未完成,不能重复购买的机制,可认为单一商品未完成,该商品与其对应订单是可以关联的
- 在苹果返回交易结果前将用户、订单信息与商品关联存储。
- 苹果返回交易结果后,将用户、订单信息与交易信息转化为一笔未完成的交易并存储。
- 使用未完成交易信息去服务端查询订单结果。
具体步骤
提交订单时,将
uid、orderId关联存储在SKMutablePayment的applicationUsername中,将uid、orderId拼装成订单对象并关联productId存储钥匙串,拉起苹果支付。苹果返回交易更新,查看交易结果:
- 失败:删除
productId对应钥匙串订单对象 - 成功,会有多种情况:
- 正常提交订单回调:将
订单对象中的uid、orderId与交易返回的transactionId拼装成一个未完成交易对象存储钥匙串。从SKMutablePayment的applicationUsername中查询uid、orderId,如有直接提交服务器验证订单,如无则使用未完成订单对象中的uid、orderId提交服务器验证。 - 打开app有未完成订单回调:从
SKMutablePayment的applicationUsername中查询uid、orderId,如有直接提交服务器验证订单,如无则根据transactionId钥匙串查找未完成订单对象,并使用其uid、orderId提交服务器验证。
- 正常提交订单回调:将
- 失败:删除
服务端验证:
- 失败:清除该交易钥匙串对应数据,调用苹果交易完成。
- 成功:删除要输出按对应
未完成交易数据,调用苹果交易完成。
最后附上Demo