使用服务器来交付内容,我们还需要做些额外的工作来验证从Store Kit发送的收据信息。
重要信息:来自Store的收据信息的格式是专用的。 你的程序不应直接解析这类数据。可使用如下的机制来取出其中的信息。
验证App Store返回的收据信息当交易完成时,Store Kit告知payment
observer这个消息,并返回完成的transaction。
SKPaymentTransaction的transactionReceipt属性就包含了一个经过签名的收据信息,其中记录了交易的关键信息。你的服务器要负责提交收据信息来确定其有效性,并保证它未经过篡改。
这个过程中,信息被以JSON数据格式发送给App Store,App
Store也以JSON的格式返回数据。(大家可以先了解一下JSON的格式)
验证收据的过程:
1. 从transaction的transactionReceipt属性中得到收据的数据,并以base64方式编码。2.
创建JSON对象,字典格式,单键值对,键名为”receipt-data”,
值为上一步编码后的数据。效果为:{“receipt-data” : “(编码后的数据)”}
3. 发送HTTP POST的请求,将数据发送到App
Store,其地址为:https://buy.itunes.apple.com/verifyReceipt
4. App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:{“status”
: 0,“receipt” : { … }}
如果status的值为0, 就说明该receipt为有效的。 否则就是无效的。
App Store的收据发送给App Store的收据数据是通过对transaction中对应的信息编码而创建的。 当App
Store验证收据时, 将从其中解码出数据,并以”receipt”的键返回。
返回的响应信息是JSON格式,被包含在SKPaymentTransaction的对象中(transactionReceipt属性)。Server可通过这些值来了解交易的详细信息。
Apple建议只发送receipt数据到服务器并使用receipt数据验证和获得交易详情。 因为App
Store可验证收据信息,返回信息,保证信息不被篡改,这种方式比同时提交receipt和transaction的数据要安全。(这段得再看看)
表5-1为交易信息的所有键,很多的键都对应SKPaymentTransaction的属性。备注:一些键取决于你的程序是链接到App
Store还是测试用的Sandbox环境。更多关于sandbox的信息,请查看”Testing a Store”一章。
Table 5-1 购买信息的键:
键名 描述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_id App
Store用来标识程序的字符串。一个服务器可能需要支持多个server的支付功能,可以用这个标识来区分程序。链接sandbox用来测试的程序的不到这个值,因此该键不存在。version_external_-identifier
用来标识程序修订数。该键在sandbox环境下不存在bid iPhone程序的bundle标识bvrs
iPhone程序的版本号
测试Store功能开发过程中,我们需要测试支付功能以保证其工作正常。然而,我们不希望在测试时对用户收费。
Apple提供了sandbox的环境供我们测试。
备注:Store Kit在模拟器上无法运行。 当在模拟器上运行Store Kit的时候,访问payment
queue的动作会打出一条警告的log。测试store功能必须在真机上进行。
Sandbox环境使用Sandbox环境的话,Store Kit并没有链接到真实的App
Store,而是链接到专门的Sandbox环境。 SandBox的内容和App Store一致,只是它不执行真实的支付动作。
它会返回交易成功的信息。 Sandbox使用专门的iTunes Connect测试 账户。不能使用正式的iTunes
Connect账户来测试。
要测试程序,需要创建一个专门的测试账户。你至少需要为程序的每个区域创建至少一个测试账户。详细信息,请查看iTunes
Connect Developer Guide文档。
在Sandbox环境中测试步骤:1.
在测试的iPhone上退出iTunes账户Settings中可能会记录之前登录的账户,进入并退出。
重要信息:不能在Settings 程序中通过测试账户登录。
2. 运行程序当你在程序的store中购买商品后,Store kit提示你去验证交易。用测试账户登录,并批准支付。
这样虚拟的交易就完成了。
在Sandbox中验证收据验证的URL不同了:NSURL *sandboxStoreURL = [[NSURL
alloc]initWithString:@”https://sandbox.itunes.apple.com/verifyReceipt“];