1.丢单+补单:
输入密码支付过程中,杀掉进程,会造成丢单情况
原因分析:由于网络或者用户主动关闭APP等情况,支付流程断掉,如果根据username进行订单关联,可能有些机型在补单的时候丢失该值,最终导致丢单,这在ios是正常情况
解决方案:
- 根据业务需求,配合本地缓存将订单记录,在补单的时候好做对应。
- 利用第三方的TalkingData等交易函数,会自动记录账单数据。
- 丢单这个很有参考意义:uniapp之ios开发及支付整体流程爬坑记录_uniapp接入苹果支付-CSDN博客
2.服务端票据验证:
为保证审核的通过,需要在客户端或server进行双重验证,即,先以线上交易验证地址进行验证,如果苹果正式验证服务器的返回验证码code为21007,则再一次连接沙盒测试服务器进行验证即可。
在应用提审时,苹果IAP提审验证时是在沙盒环境的进行的,即:苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,如果没有做双验证,需要特别注意此问题,否则会被拒。
在sandbox中验证receipt:https://sandbox.itunes.apple.com/verifyReceipt
在生产环境中验证receipt:https://buy.itunes.apple.com/verifyReceipt
识别沙盒环境下收据的方法有两种:
- 根据收据字段 environment = sandbox。
- 根据收据验证接口返回的状态码。
如果status=21007,则表示当前的收据为沙盒环境下收据, 进行验证。
3.苹果服务器反馈的状态码:
- 21000 App Store无法读取你提供的JSON数据
- 21002 收据数据不符合格式
- 21003 收据无法被验证
- 21004 你提供的共享密钥和账户的共享密钥不一致
- 21005 收据服务器当前不可用
- 21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
- 21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
- 21008 收据信息是产品环境中使用,但却被发送到测试环境中验证