美文网首页
iOS 服务器类型实现内购方案

iOS 服务器类型实现内购方案

作者: 辉546 | 来源:发表于2019-03-18 15:38 被阅读0次

    参考借鉴了一下几篇文章(在这里很感谢各位作者大大做出的总结和方案):

    http://blog.csdn.net/autfish/article/details/52682778

    http://blog.csdn.net/a351945755/article/details/22928491

    http://www.cnblogs.com/fengmin/p/5562769.html

    iOS游拍 iAP 充值 SDK

    一、登录 App的ItunesConnection,添加内购

    我们打开创建的App,会看到左侧的App 内购买项目。我们为App添加内购项目。填写内购产品的相关信息,将内购产品送到APPStore审核

    二.申请沙盒测试账号(用来测试购买项目)

    首先我们到iTunes Connect中,在这里我们选择用户和职能。

    然后在上面的沙箱技术测试员中添加测试员。

    PS1:所有信息都可以随意填写,不用管是否真实。App Store地区选择,一定要选对,它对应的是你创建的App的地区, 你App是中国的话, 在这里我们依然选择中国。

    PS2:此账号只能用来测试,不要在正式的appstore上使用

    PS3:填写完毕,点击保存后,我们则生成一个测试账号,当然这个账号是可以随时删除和添加的。

    三、实现方式(服务器类型实现内购)

    客户端

    程序向服务器发送请求,获得一份产品列表详细信息。

    程序把返回的产品信息显示给用户

    用户选择某个产品

    程序向App Store发送支付请求,同时向服务器发送支付请求

    App Store处理支付请求并返回交易完成信息。

    程序从信息中获得数据(收据),并发送至服务器。

    服务器验证通过后将返回结果(购买的内容)传递给程序。

    服务端

    服务端录入产品列表(列表信息跟iTunesConnect里添加的购买信息一致)

    服务器接收客户端请求返回包含产品信息列表。

    服务端接收客户端的购买请求生成订单

    服务器接收并纪录客户端发来的数据,并进行审(我们的)查。

    服务器将数据发给App Store来验证该交易的有效性。

    App Store对收到的数据进行解析,返回该数据和说明其是否有效的标识。

    服务器读取返回的数据,确定用户购买的内容。

    服务端验证收据流程:

    从transaction的transactionReceipt属性中得到收据的数据,并以base64方式编码。

    创建JSON对象,字典格式,单键值对,键名为"receipt-data", 值为上一步编码后的数据。效果为:{"receipt-data" : "(编码后的数据)"}

    发送HTTP POST的请求,将数据发送到App Store,其地址为:

    appStore上线:https://buy.itunes.apple.com/verifyReceipt

    沙盒测试:https://sandbox.itunes.apple.com/verifyReceipt

    App Store的返回值也是一个JSON格式的对象,包含两个键值对,

    status和receipt: {"status" : 0,"receipt" : { … }}

    如果status的值为0, 就说明该receipt为有效的。 否则就是无效的。

    
    Status其余状态
    
    0recipt有效
    ​21000AppStore无法读取你提供的JSON数据
    21002收据数据不符合格式
    21003收据无法被验证
    21004你提供的共享密钥和账户的共享密钥不一致
    21005收据服务器当前不可用
    21006收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
    21007收据信息是测试用(sandbox),但却被发送到产品环境中验证
    21008收据信息是产品环境中使用,但却被发送到测试环境中验证
    
    
    receipt中对应的内容:
    键名描述
    quantity购买商品的数量。对应SKPayment对象中的quantity属性
    product_id商品的标识,对应SKPayment对象的productIdentifier属性。
    transaction_id交易的标识,对应SKPaymentTransaction的transactionIdentifier属性
    purchase_date交易的日期,对应SKPaymentTransaction的transactionDate属性
    original_-transaction_id对于恢复的transaction对象,该键对应了原始的transaction标识
    original_purchase_-date对于恢复的transaction对象,该键对应了原始的交易日期
    
    app_item_idAppStore用来标识程序的字符串。一个服务器可能需要支持多个server的支付功能,可以用这个标识来区分程序。链接sandbox用来测试的程序的不到这个值,因此该键不存在。
    version_external_-identifier用来标识程序修订数。该键在sandbox环境下不存在
    bidiPhone程序的bundle标识
    bvrsiPhone程序的版本号
    
    

    App Store的收据

    发送给App Store的收据数据是通过对transaction中对应的信息编码而创建的。

    当App Store验证收据时, 将从其中解码出数据,并以"receipt"的键返回。

    返回的响应信息是JSON格式,被包含在SKPaymentTransaction的对象中(transactionReceipt属性)。

    Server可通过这些值来了解交易的详细信息。

    Apple建议只发送receipt数据到服务器并使用receipt数据验证和获得交易详情。

    因为App Store可验证收据信息,返回信息,保证信息不被篡改,这种方式比同时提交receipt和transaction的数据要安全。

    PS:如果用户退款,在recipt字段中会接收到cancel_data字段取消日期对于由Apple客户支持取消的交易,取消的时间和日期。

    相关文章

      网友评论

          本文标题:iOS 服务器类型实现内购方案

          本文链接:https://www.haomeiwen.com/subject/zptbmqtx.html