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

2019-03-18  本文已影响0人  辉546

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

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客户支持取消的交易,取消的时间和日期。

上一篇下一篇

猜你喜欢

热点阅读