AppStore增加了验证内购(In App Purchasement)的方法, 就是苹果提供一个url地址, 开发测试用:
https://sandbox.itunes.apple.com/verifyReceipt
产品用:
https://buy.itunes.apple.com/verifyReceipt
当购买成功时, 会得到苹果返回的一个收据(receipt), 苹果推荐的方法是将收据发给开发者的server, 由server像上述地址post http消息, 进行验证, 苹果将结果返回.到底是真正的购买还是虚假的购买.
1.应用发送请求到服务器,获取所有的Products ID列表
2.服务器返回Products ID列表
3.应用发送请求至App Store,获取Products的信息
4.App Store返回Product信息
5.应用使用这些信息,向用户显示一个Store界面
6.用户从Store中选择一项
7.应用向App Store发送payment请求
8.App Store处理该payment,并返回完成的transaction
9.应用从transaction中获取receipt数据,并将其发送给服务器
10.服务器记录receipt数据,并建立一个audit trail(审查跟踪)
11.服务器发送receipt数据到App Store,以验证是否合法的transaction
12.App Store解析receipt数据,并返回receipt,以及验证结果(是否合法)
13.服务器读取返回的receipt数据,并确定哪个用户已经完成购买
14.服务器交付已购买的内容至iOS应用
Purchase(购买)
当用户准备好购买product时,应用请求App Store来完成支付。App Store会创建一个持久化的transaction,即使用户退出和重新启动应用,也会继续地处理该支付交易。App Store将未决交易列表同步给应用,并且在任何交易状态变化时,递送更新信息给应用。
键 | 描述 |
quantity | 购买的数量,对应于transaction.payment.quantity属性 |
product_id | product ID标识,对应于transaction.payment.productIdentifier属性 |
transaction_id | transaction ID标识,对应于transaction.transactionIdentifier属性 |
purchase_date | 交易发生的日期和时间,对应于transaction.transactionDate属性 |
original_transaction_id | 对于还原交易,这个值保存了原始交易ID |
original_purchase_date | 对于还原交易,这个值保存了原始交易日期 |
app_item_id | 字符串,App Store用来唯一地标识一个创建了支付交易的iOS应用。如果你的服务器支持多个iOS应用,你可以使用这个值来区分不同的应用。在sandbox中运行的应用没有app_item_id,因此这个键也不存在 |
version_external_identifier | 唯一标识你的应用修订版本的任意数值。sandbox应用没有这个键 |
bid | iOS应用的Bundle ID |
bvrs | iOS应用的版本号 |
测试验证结果:
{
environment = Sandbox;
receipt = {
"adam_id" = 0;
"app_item_id" = 0;
"application_version" = "1.0.4.4";
"bundle_id" = "com.5ingame.gf";
"download_id" = 0;
"in_app" = (
{
"is_trial_period" = false;
"original_purchase_date" = "2015-08-05 06:24:35 Etc/GMT";
"original_purchase_date_ms" = 1438755875000;
"original_purchase_date_pst" = "2015-08-04 23:24:35 America/Los_Angeles";
"original_transaction_id" = 1000000166363893;
"product_id" = "com.ysb.sanguo.one";
"purchase_date" = "2015-08-05 06:24:35 Etc/GMT";
"purchase_date_ms" = 1438755875000;
"purchase_date_pst" = "2015-08-04 23:24:35 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000166363893;
},
{
"is_trial_period" = false;
"original_purchase_date" = "2015-08-05 08:30:46 Etc/GMT";
"original_purchase_date_ms" = 1438763446000;
"original_purchase_date_pst" = "2015-08-05 01:30:46 America/Los_Angeles";
"original_transaction_id" = 1000000166385461;
"product_id" = "com.ysb.sanguo.two";
"purchase_date" = "2015-08-05 08:30:46 Etc/GMT";
"purchase_date_ms" = 1438763446000;
"purchase_date_pst" = "2015-08-05 01:30:46 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000166385461;
}
);
"original_application_version" = "1.0";
"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
"original_purchase_date_ms" = 1375340400000;
"original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles";
"receipt_type" = ProductionSandbox;
"request_date" = "2015-08-05 08:32:00 Etc/GMT";
"request_date_ms" = 1438763520449;
"request_date_pst" = "2015-08-05 01:32:00 America/Los_Angeles";
"version_external_identifier" = 0;
};
status = 0;
}
参考:
https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1
https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1
http://blog.csdn.net/a351945755/article/details/22919533
http://www.cnblogs.com/dqshll/p/3731386.html
http://blog.csdn.net/azhou_hui/article/details/45154421
http://blog.csdn.net/imanapple/article/details/47174993
http://blog.csdn.net/pbymw8iwm/article/details/42167125
http://blog.csdn.net/wave_1102/article/details/9190897