服务端IOS订阅类型支付接入详细说明与注意事项

这篇具有很好参考价值的文章主要介绍了服务端IOS订阅类型支付接入详细说明与注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、说明

由于本人在开发ios订阅类型支付接入的时候,遇到了很多坑,也查了不少资料,逐步完善了整个ios订阅支付服务端接入的功能,在这里写下总结和一些注意事项的记录,方便未来需要重新接入或者避免一些不必要的坑,这里主要讲的是服务端的接入。

二、接入原因

客户端实现ios订阅支付后,支付成功会返回一个收据(一大串随机字符串),需要请求苹果服务器的接口来校验该收据的真实性,同时校验完成后苹果服务器也会发通知告诉我们的自己的服务器(ios后台配置的回调地址),这个时候就需要服务端来接入苹果服务器并处理该支付逻辑。这里不使用客户端直接接入苹果服务器校验收据接口的原因大概就是因为订阅类型需要共享密钥,防止该密钥暴露,同时服务器接入能更好处理逻辑。

三、接入必要配置

1.订阅类型需要从苹果后台获取一个共享密钥

2.需要在苹果后台配置好回调地址

3.需要配置订阅产品(周期,价格,我自己没什么了解,这个需要注意的是订阅有按组分,同一个组和不同组的产品是有区别的,例如同一个组的不同产品进行购买,他们的原始订单可能相同)

四、接入必要资源

简体中文文档 - Apple Developer

校验收据:通过 App Store 验证收据 - 简体中文文档 - Apple Developer

回调通知:启用 App Store 服务器通知 - 简体中文文档 - Apple Developer

退款处理:处理退款通知 - 简体中文文档 - Apple Developer

收据校验沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt

收据校验生产环境:https://buy.itunes.apple.com/verifyReceipt

五、接入流程

1.服务端接入apple校验收据接口

注意事项:防止相同数据重复校验或者相同请求大量请求导致的不稳定因素,建议使用时间戳校验预防,不要将共享密钥暴露在客户端,共享密钥同时也可以对回调通知进行校验,校验收据后不要做为订单处理,最好一切以回调为主。

接口地址:https://buy.itunes.apple.com/verifyReceipt

接口类型:POST

接口格式:appliaction/json

功能说明:该接口主要是用来恢复订阅和支付校验,校验完成会有回调通知到商户服务器

请求参数:

官方:Apple Developer Documentation

{
    "password":"这里是共享密钥",
    "receipt-data":"这里是收据的字符串"
}

返回结果:

状态码:Apple Developer Documentation

失败:

{"status":21000}

成功:

成功结果参数文档:responseBody | Apple Developer Documentation

主要参数说明:

{
    "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  //状态成功
}

 

 2.apple支付回调通知接入

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

接入文档:responseBodyV1 | Apple Developer Documentation

提示:接入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.ios订单未返回金额等参数,需要自己做处理

4.ios退款通知不支持订阅类型

5.apple支付为全球性支付,需要自己处理货币转换

6.同一个产品包括同产品组,在同一个账户支付会生成一个原始订单号,可根据该订单号溯源

7.订单校验只适用于恢复订阅和收据校验,具体支付处理按通知为主

8.状态码21007为测试环境的收据请求到了正式环境文章来源地址https://www.toymoban.com/news/detail-470096.html

到了这里,关于服务端IOS订阅类型支付接入详细说明与注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java服务端接入苹果内购。实现票据二次校验、自动续期订阅

    记录一下 Java 服务端接入苹果内购。 苹果规定在 APP Store上架的 APP 使用苹果自己的支付方式(IAP内购),并且苹果会抽30%的税。 上架商品包括:消耗性,非消耗性,自动续期订阅,非续期订阅。上架商品可在 APP Store后台配置。 由用户完成付款操作后,苹果返回 票据 给 IO

    2024年02月02日
    浏览(46)
  • 微信小程序接入隐私弹窗说明及详细过程

    相信各位做小程序的小伙伴在微信小程序后台应该都接到了官方通知的小程序隐私新规,如果还未收到的小程序可以看一下: 为规范开发者的用户个人信息处理行为,保障用户合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者

    2024年02月06日
    浏览(58)
  • uniapp - 超详细实现播放 svg / svga 格式动画组件插件,用于直播间赠送礼物特效动画或项目动画特效较多的应用(新手小白保姆级教程,提供插件+详细运行示例+使用文档+注意事项+格式说明)

    网上关于 uniapp 播放 svg / svga 格式动画的教程很乱,基本上全是 BUG 和各种不兼容,很难复制过来自己用。 本文实现了 在 uniapp 项目中(完美兼容 H5 / App / 微信小程序平台),播放 svg / svga 格式动画功能的详细介绍, 您只需要使用我提供的 “组件源码及插件”,放到项目中去

    2023年04月24日
    浏览(197)
  • uniapp微信小程序订阅消息发送服务通知--超详细

    由于公司需求,刚学完的小程序的我,要求开发一个直播通知的微信小程序,学了vue的我,选择还是使用uniapp开发,wx原生语法学完已经快忘了。在利用uniapp写代码的过程中,遇到很多问题,通过这篇博客分享一下总体实现思路以及一些小坑。整篇博客以逐步的思路让你完整

    2024年02月06日
    浏览(51)
  • 腾讯云轻量应用服务器“镜像”选择和“镜像类型”说明

    腾讯云轻量应用服务器镜像是什么?镜像就是操作系统,轻量服务器镜像系统怎么选择?如果是用来搭建网站腾讯云百科txybk.com建议选择选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科来详细说下腾讯云轻量应用服务器镜像的选择方法: 轻量应用

    2024年02月06日
    浏览(60)
  • H5接入支付流程-微信支付&支付宝支付

    H5对接微信支付和支付宝支付,app无法发版,需要支持在app内和浏览器内同时使用。 于是借此机会对前端接入对第三方支付进行了调研,本次只讨论微信支付,和支付宝支付。 文档地址:微信支付 微信支付方式主要包括,对普通商家主要提供以下7种方式 付款码支付:比如大

    2024年02月19日
    浏览(56)
  • 聚合支付-第3章-支付宝支付接入指南

    1.1 产品列表 支付宝为普通商户提供如下支付产品: 产品介绍详见:https://b.alipay.com/signing/productSetV2.htm 1、当面付 在国内线下场景,商家可通过以下任一方式进行收款。提升商家收银效率,资金实时到账。 商家通过扫描线下买家支付宝钱包中的条码、二维码等方式完成支付;

    2024年02月11日
    浏览(36)
  • 〔支付接入〕微信的 h5 支付和 jsapi 支付

    申请地址: https://pay.weixin.qq.com/ 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步 首先点击 账户中心 ▶ API安全 ▶ 申请API证书 申请详细步骤: https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 首先点击 账户中心 ▶ API安全 ▶ 设置APIv3密钥 ▶

    2024年02月13日
    浏览(52)
  • 支付宝手机网站支付接入(沙箱环境)

    参考阿里云文档:https://docs.open.alipay.com/203/105285/ 手机网站支付产品包含两类API: 页面跳转类:需要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(一般是收银台或签约页面),用户在该页面完成相关业务操作后再回跳到商户指定页面。例如本

    2024年02月08日
    浏览(44)
  • 海康硬盘录像机接入RTSP/onvif协议安防视频平台EasyNVR的注意事项

    EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供视频监控直播、录像、云存储、检索与回看、国标级联等视频能力,可支持分发RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式的视频流。 有用户咨询,将海康硬盘录像机接入EasyNVR平台后显示离线,不知道什

    2024年02月05日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包