iOS内购买自动续期订阅说明

服务端验证自动续期订阅的收据过程如下:

服务端收到客户端发送的收据后,向苹果服务器发送post请求

苹果测试环境 https://sandbox.itunes.apple.com/verifyReceipt,

苹果生产环境 https://buy.itunes.apple.com/verifyReceipt

请求的http body是json格式,receipt-data字段对应的就是收据数据,password字段对应苹果开发账号设置的秘钥,exclude-old-transactions字段为true时,可过滤掉大部分旧的购买,只显示新的订阅。例如:

{

"exclude-old-transactions":true,

"password": "***",

"receipt-data":"***"

}

苹果服务器返回的http body里的status字段对应的是收据状态,若为0,则收据为真。

在receipt字段里,bundle_id 是APP的固定ID,可用于检查收据是否属于我们的APP。

在latest_receipt_info数组里,遍历数据,找到最大的expires_date,这个是订阅过期的日期,也可用expires_date_ms或expires_date_pst字段。服务器应保存该字段到数据库

product_id 是商品id,要与购买的商品ID相符才有效。

web_order_line_item_id 是本次购买的ID

original_transaction_id 是第一次订阅的交易ID,服务器应保存该字段到数据库

例如

{

  "status": 0,

  "environment": "Sandbox",

  "receipt": {

    "receipt_type": "ProductionSandbox",

    "adam_id": 0,

    "app_item_id": 0,

    "bundle_id": "***",

    "application_version": "6",

    "download_id": 0,

    "version_external_identifier": 0,

    "receipt_creation_date": "2019-11-28 05:38:19 Etc/GMT",

    "receipt_creation_date_ms": "1574919499000",

    "receipt_creation_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",

    "request_date": "2019-11-28 08:18:12 Etc/GMT",

    "request_date_ms": "1574929092579",

    "request_date_pst": "2019-11-28 00:18:12 America/Los_Angeles",

    "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",

    "original_application_version": "1.0",

    "in_app": [

      ...

      {

        "quantity": "1",

        "product_id": "***",

        "transaction_id": "1000000598465716",

        "original_transaction_id": "1000000598465716",

        "purchase_date": "2019-11-28 05:38:19 Etc/GMT",

        "purchase_date_ms": "1574919499000",

        "purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",

        "original_purchase_date": "2019-11-28 05:38:19 Etc/GMT",

        "original_purchase_date_ms": "1574919499000",

        "original_purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",

        "expires_date": "2019-11-28 05:43:19 Etc/GMT",

        "expires_date_ms": "1574919799000",

        "expires_date_pst": "2019-11-27 21:43:19 America/Los_Angeles",

        "web_order_line_item_id": "1000000048591202",

        "is_trial_period": "false",

        "is_in_intro_offer_period": "false"

      }

    ]

  },

  "latest_receipt_info": [

    {

      "quantity": "1",

      "product_id": "***",

      "transaction_id": "1000000594693615",

      "original_transaction_id": "1000000594693615",

      "purchase_date": "2019-11-20 06:33:11 Etc/GMT",

      "purchase_date_ms": "1574231591000",

      "purchase_date_pst": "2019-11-19 22:33:11 America/Los_Angeles",

      "original_purchase_date": "2019-11-20 06:33:11 Etc/GMT",

      "original_purchase_date_ms": "1574231591000",

      "original_purchase_date_pst": "2019-11-19 22:33:11 America/Los_Angeles",

      "is_trial_period": "false"

    },

    {

      "quantity": "1",

      "product_id": "***",

      "transaction_id": "1000000598475362",

      "original_transaction_id": "1000000598465716",

      "purchase_date": "2019-11-28 06:03:19 Etc/GMT",

      "purchase_date_ms": "1574920999000",

      "purchase_date_pst": "2019-11-27 22:03:19 America/Los_Angeles",

      "original_purchase_date": "2019-11-28 05:38:19 Etc/GMT",

      "original_purchase_date_ms": "1574919499000",

      "original_purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",

      "is_trial_period": "false",

      "expires_date": "2019-11-28 06:08:19 Etc/GMT",

      "expires_date_ms": "1574921299000",

      "expires_date_pst": "2019-11-27 22:08:19 America/Los_Angeles",

      "web_order_line_item_id": "1000000048591627",

      "is_in_intro_offer_period": "false",

      "subscription_group_identifier": "20577287"

    }

  ],

  "latest_receipt": "***",

  "pending_renewal_info": [

    {

      "auto_renew_product_id": "jfldsjf",

      "original_transaction_id": "1000000598465716",

      "product_id": "jfldsjf",

      "auto_renew_status": "0",

      "expiration_intent": "1",

      "is_in_billing_retry_period": "0"

    }

  ]

}

收据应该保存在服务器里,当订阅到期时,再次用收据向苹果发送请求,更新用户的订阅到期时间。

在latest_receipt_info数组里,用original_transaction_id找到对应的交易,查看expires_date。若expires_date是过去的日期,表示用户没有续订。若expires_date是未来的日期,表示用户已续订。更新用户的过期日期。

latest_receipt是最新的收据,应保存到服务器数据库里,替换旧收据。

pending_renewal_info里的auto_renew_status表示是否还可能有后续的订阅,若为0表示用户已取消订阅

is_in_billing_retry_period为1表示用户支付信息有问题,苹果正在尝试重新扣款(最长持续60天),为0表示苹果停止重新扣款。

对于用户退款、更改订阅的行为的检查,服务器可与苹果建立服务端的连接,获取用户的订阅状态变化通知。开发账户中要设置服务器的URL。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容