IOS内购验证

客户端在沙箱环境下购买成功之后,需要进行二次验证

参考自:http://www.himigame.com/iphone-cocos2d/550.html

当应用向Apple服务器请求购买成功之后,Apple会返回数据给应用,如下所示:

产品标识符: product Identifier[在itunes store应用内定义的产品ID,例如com.公司名.产品名.道具名(com.xxxx.video.vip)]

交易状态: state

Purchased 购买成功
Restored 恢复购买
Failed 失败
Deferred 等待确认,儿童模式需要询问家长同意
receipt 很长的一段字符串,大概49行,作为二次验证的重要依据

交易标识符: transaction Identifier

在我们公司的测试服务器中,我们会连接苹果的测试服务器( https://sandbox.itunes.apple.com/verifyReceipt )验证。

在我们部署在线上的正式服务器中,我们会连接苹果的正式服务器( https://buy.itunes.apple.com/verifyReceipt)验证。

当我们把应用提交给苹果审核时,苹果也是在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,所以我们可以先发到苹果的正式服务器验证,如果苹果返回21007,则再一次连接测试服务器进行验证。

下面是发送验证到苹果测试服务器的数据示例:

ISN: url: https://sandbox.itunes.apple.com/verifyReceipt
ORIGINAL JSON: 
{
    "receipt":
    {
        "original_purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles", //购买时间,太平洋标准时间
        "purchase_date_ms":"1435031794826", //购买时间毫秒
        "unique_identifier":"5bcc5503dbcc886d10d09bef079dc9ab08ac11bb",//唯一标识符
        "original_transaction_id":"1000000160390314", //原始交易ID
        "bvrs":"1.0",//iPhone程序的版本号
        "transaction_id":"1000000160390314", //交易的标识
        "quantity":"1", //购买商品的数量
        "unique_vendor_identifier":"AEEC55C0-FA41-426A-B9FC-324128342652", //开发商交易ID
        "item_id":"1008526677",//App Store用来标识程序的字符串
        "product_id":"cosmosbox.strikehero.gems60",//商品的标识 
        "purchase_date":"2015-06-23 03:56:34 Etc/GMT",//购买时间
        "original_purchase_date":"2015-06-23 03:56:34 Etc/GMT", //原始购买时间
        "purchase_date_pst":"2015-06-22 20:56:34 America/Los_Angeles",//太平洋标准时间
        "bid":"com.cosmosbox.StrikeHero",//iPhone程序的bundle标识
        "original_purchase_date_ms":"1435031794826"//毫秒
    },
    "status":0 //状态码,0为成功
}

 

 
 

苹果返回状态码的解释:https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

Status 描述
21000 App Store不能读取你提供的JSON对象
21002 receipt-data域的数据有问题
21003 receipt无法通过验证
21004 提供的shared secret不匹配你账号中的shared secret
21005 receipt服务器当前不可用
21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务

更详细的请参考:http://www.2cto.com/kf/201504/389224.html

最好在客户端上键一个数据库,跟踪订单的状态,防止用户订单在某个环节出现问题时无法寻找到订单进行二次处理。

去AppStore请求数据时有时候会出现错误,你可以iTunes connect里的connect us去给他们写邮件反馈问题。但是大部分时间你等等就能解决了,对就是什么也不做等着。也许那一天他就好了。

3.后台服务器验证

IOS 内支付有两种模式:

1) 内置模式

2) 服务器模式

内置模式的流程可以简单的总结为以下几步:

1) app从app store 获取产品信息

2) 用户选择需要购买的产品

3) app发送支付请求到app store

4) app store 处理支付请求,并返回transaction信息

5) app将购买的内容展示给用户

服务器模式的主要流程如下所示:

1) app从服务器获取产品标识列表

2) app从app store 获取产品信息

3) 用户选择需要购买的产品

4) app 发送 支付请求到app store

5) app store 处理支付请求,返回transaction信息

6) app 将transaction receipt 发送到服务器

7) 服务器收到收据后发送到app stroe验证收据的有效性

8) app store 返回收据的验证结果

9) 根据app store 返回的结果决定用户是否购买成功

上述两种模式的不同之处主要在于:交易的收据验证,内建模式没有专门去验证交易收据,而服务器模式会使用独立的服务器去验证交易收据。内建模式简单快捷,但容易被破解。服务器模式流程相对复杂,但相对安全。

开发之初,苹果方就很负责的告知:我们的服务器不稳定。真正开发之后,发现苹果方果然是很负责的,不仅是不稳定,而且足够慢。app store server验证一个收据需要3-6s时间。

1.用户能否忍受3-6s的等待时间

2.如果app store server 宕机,如何确保成功付费的用户能够得到正常服务。

对于第一个问题,我们有理由相信用户完全无法忍受,所以采用异步验证的方式,服务器收到客户端的请求后,就将请求放到MCQ中去处理。

对于第二个问题,由于苹果人员很负责人的告知:我们的服务器不稳定,所以不排除收据验证超时的情况。对于验证超时的收据,保存到数据库中并标记为验证超时,定时任务每隔一定的时间去app store验证,确保能够获取收据的验证结果。

猜你喜欢

转载自blog.csdn.net/guggy/article/details/73277640