苹果IOS订阅支付遇到的一些问题记录

发布时间 2023-04-07 14:34:31作者: 老夫聊fa少年狂

1、状态码 官方地址

21000 失败
21002 一般是凭证问题,base64一下再由后端校验试试
21007 测试环境的收据请求到了正式环境

2、凭证说明 官方地址

{
    "environment": "Production",   //请求环境
    "receipt": {
        "receipt_type": "Production",
        "adam_id": xxx,
        "app_item_id": xxx,
        "bundle_id": "com.xxx",
        "application_version": "2",
        "download_id": xxx,
        "version_external_identifier": xxx,
        "receipt_creation_date": "2022-10-24 07:14:36 Etc/GMT",
        "receipt_creation_date_ms": "1666595676000",
        "receipt_creation_date_pst": "2022-10-24 00:14:36 America/Los_Angeles",
        "request_date": "2023-02-24 03:29:47 Etc/GMT",
        "request_date_ms": "1677209387760",
        "request_date_pst": "2023-02-23 19:29:47 America/Los_Angeles",
        "original_purchase_date": "2022-07-04 03:24:29 Etc/GMT",
        "original_purchase_date_ms": "1656905069000",
        "original_purchase_date_pst": "2022-07-03 20:24:29 America/Los_Angeles",
        "original_application_version": "2",
        "in_app": [  //所有订单都可能存在,主要是非订阅订单
            {
                "quantity": "1",
                "product_id": "xxxx",
                "transaction_id": "xxxx",
                "original_transaction_id": "xxx",
                "purchase_date": "2022-07-04 03:25:29 Etc/GMT",
                "purchase_date_ms": "1656905129000",
                "purchase_date_pst": "2022-07-03 20:25:29 America/Los_Angeles",
                "original_purchase_date": "2022-07-04 03:25:30 Etc/GMT",
                "original_purchase_date_ms": "1656905130000",
                "original_purchase_date_pst": "2022-07-03 20:25:30 America/Los_Angeles",
                "expires_date": "2022-07-11 03:25:29 Etc/GMT",
                "expires_date_ms": "1657509929000",
                "expires_date_pst": "2022-07-10 20:25:29 America/Los_Angeles",
                "web_order_line_item_id": "xxx",
                "is_trial_period": "false",
                "is_in_intro_offer_period": "false",
                "in_app_ownership_type": "PURCHASED"
            }
        ]
    },
    "latest_receipt_info": [  //订单订阅集合,从上往下订单时间倒序,第一个为最新的支付订单
        {
            "quantity": "1",
            "product_id": "xxx",  //订单产品id,apple后台支付配置的参数
            "transaction_id": "xxx",  //apple当前订单号
            "original_transaction_id": "xxx",  //apple原始订单号,该用户在该产品第一笔支付订单,可当做同一批订单朔源
            "purchase_date": "2022-11-25 08:19:27 Etc/GMT", //订单时间
            "purchase_date_ms": "1669364367000",
            "purchase_date_pst": "2022-11-25 00:19:27 America/Los_Angeles",
            "original_purchase_date": "2022-07-04 03:25:30 Etc/GMT",  //最初购买时间
            "original_purchase_date_ms": "1656905130000",
            "original_purchase_date_pst": "2022-07-03 20:25:30 America/Los_Angeles",
            "expires_date": "2023-11-25 08:19:27 Etc/GMT",  //订阅过期时间
            "expires_date_ms": "1700900367000",
            "expires_date_pst": "2023-11-25 00:19:27 America/Los_Angeles",
            "web_order_line_item_id": "xxx",
            "is_trial_period": "false",  //是否是试用订单
            "is_in_intro_offer_period": "false",
            "in_app_ownership_type": "PURCHASED",
            "subscription_group_identifier": "xxx"
        }
    ],
    "latest_receipt": "------------加密串------------",
    "pending_renewal_info": [
        {
            "auto_renew_product_id": "xxx",
            "product_id": "xxx",
            "original_transaction_id": "xxx",
            "auto_renew_status": "0"
        }
    ],
    "status": 0  //状态成功
}

3、接入回调 官方地址

回调通知配置:苹果后台可配置生产环境和沙箱环境的APPLE回调通知地址

提示:接入apple支付回调apple提供了v1和v2两种类型,v2需要多一步加解密的操作

功能说明:该通知主要是订单状态的变更等,包括续订,付费通知,取消订阅,退款等通知,可进行订单处理

类型 说明
INITIAL_BUY 首次购买
REFUND 退款
CANCEL 取消订阅
DID_RENEW 自动续订
INTERACTIVE_RENEWAL 应用界面或appstore手动续订
DID_RECOVER 恢复订阅
{
    "notification_type":"DID_RENEW",  //通知类型,该类型为续订通知
    "auto_renew_product_id":"xxx",
    "password":"xxx",  //共享密钥,可以验证是否真实通知
    "environment":"Sandbox",
    "original_transaction_id":xxx,
    "unified_receipt":{
        "status":0,
        "environment":"Sandbox",
        "latest_receipt_info":[  //第一笔为最新的通知订单
            {
                "quantity":"1",
                "product_id":"xxx",
                "transaction_id":"xxx", //当前订单号
                "purchase_date":"2022-06-08 09:51:55 Etc/GMT",
                "purchase_date_ms":"1654681915000",
                "purchase_date_pst":"2022-06-08 02:51:55 America/Los_Angeles",
                "original_purchase_date":"2022-06-08 04:36:20 Etc/GMT",
                "original_purchase_date_ms":"1654662980000",
                "original_purchase_date_pst":"2022-06-07 21:36:20 America/Los_Angeles",
                "expires_date":"2022-06-08 09:54:55 Etc/GMT",
                "expires_date_ms":"1654682095000",
                "expires_date_pst":"2022-06-08 02:54:55 America/Los_Angeles",
                "web_order_line_item_id":"xxx",
                "is_trial_period":"false",
                "is_in_intro_offer_period":"false",
                "original_transaction_id":"xxx", //原始订单号,该产品首次的订单号
                "in_app_ownership_type":"PURCHASED",
                "subscription_group_identifier":"xxx"
            },
            {
                "quantity":"1",
                "product_id":"xxx",
                "transaction_id":"xxx",
                "purchase_date":"2022-06-08 09:48:03 Etc/GMT",
                "purchase_date_ms":"xxx",
                "purchase_date_pst":"2022-06-08 02:48:03 America/Los_Angeles",
                "original_purchase_date":"2022-06-08 04:36:20 Etc/GMT",
                "original_purchase_date_ms":"1654662980000",
                "original_purchase_date_pst":"2022-06-07 21:36:20 America/Los_Angeles",
                "expires_date":"2022-06-08 09:51:03 Etc/GMT",
                "expires_date_ms":"1654681863000",
                "expires_date_pst":"2022-06-08 02:51:03 America/Los_Angeles",
                "web_order_line_item_id":"xxx",
                "is_trial_period":"false",
                "is_in_intro_offer_period":"false",
                "original_transaction_id":"xxx",
                "in_app_ownership_type":"PURCHASED",
                "subscription_group_identifier":"xxx"
            }
        ],
        "pending_renewal_info":[
            {
                "auto_renew_status":"1",
                "auto_renew_product_id":"xxx",
                "product_id":"xxx",
                "original_transaction_id":"xxx"
            }
        ]
    },
    "bvrs":"xxx",
    "bid":"com.xxx",
    "auto_renew_status":"true"
}

一些说明

  1. latest_receipt_info集合订单按时间倒序排序,所以第一笔为最新的订单
  2. ios收据为账户维度,即收据和通知获取的数据为该账户的历史订单集合,非当前支付
  3. 同一个产品包括同产品组,在同一个账户支付会生成一个原始订单号,可根据该订单号溯源
  4. ios退款通知不支持订阅类型
  5. 订单校验只适用于恢复订阅和收据校验,具体支付处理按通知为主