苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

这是苹果wwdc2021 推出的新功能

参考官网链接

App Store Server API | Apple Developer Documentation

https://developer.apple.com/documentation/appstoreserverapi

先要通过 JWT签名

https://developer.apple.com/documentation/appstoreserverapi/generating_tokens_for_api_requests

作者:Yanlongli <ahlyl94@gmail.com>

来源:博客园 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 - IM小白 - 博客园 (cnblogs.com)

参考以下PHP伪代码

        $privateKey = <<<key
-----BEGIN PRIVATE KEY-----
xxxx
-----END PRIVATE KEY-----
key;

$payload = [
'iss' => 'xxxxxx',
"iat" => time() - 10,
"exp" => time() + 3590,
"aud" => "appstoreconnect-v1",
"nonce" => "随机字符串",
"bid" => "xxx.xxx.xxx.xxx",
];

$auth_token = JWT::encode($payload, $privateKey, 'ES256', '私钥id');

iss 通过 https://appstoreconnect.apple.com/access/api 获得,操作路径是 用户和访问、密钥、App Store Connect API、
Issuer ID
bid 是应用的 bundleid
iat 当前时间戳,到秒的,-10 是测试发现,接口直接请求时有几率失败,应该时本地时间和苹果服务器时间有误差导致失败,减去10秒不影响请求,能忽略时间差。
exp 过期时间戳,在这个时间之后,该签名会失效,苹果文档给的是60分钟,应该可以更久,看你需求
nonce 随机字符串 6edffe66-b482-11eb-8529-0242ac130003 这是苹果给的格式,我也这么生成的,没测试是否任意随机字符串都可以
私钥id 通过在上面相同网址中,密钥页面,创建一个密钥,或者用已存在的密钥,列表会显示密钥id,注意该私钥仅允许下载一次,所以你要保存好,忘了的话就要创建一个新的密钥。

//
// 签名后通过get请求
https://api.storekit.itunes.apple.com/inApps/v1/lookup/{tradeNo}

headers 添加上认证方式
Authorization: Bearer {auth_token}
{tradeNo} 替换成用户邮件收到的订单号
{auth_token} 替换成上面伪代码的签名

请求成功会返回

{
"status": 0,
"signedTransactions": [
"header.payload.sign"
]
}

signedTransactions  的格式是  头.载体.签名

如果有需要自行处理签名验证,这里不验证了

将 signedTransactions 按 . 点分割,获取载体内容 payload,再将这个payload字符串base64解码,即可得到该订单的内容,参考如下


{
"transactionId": "xxx",  // 本次交易号
"originalTransactionId": "xxx", // 第一次交易号
"webOrderLineItemId": "xxx",
"bundleId": "com.xx.xx", // 应用的 bundleid
"productId": "com.xx.xx.xxx", // 套餐商品的唯一标识key
"subscriptionGroupIdentifier": "xx",  // 订阅组id
"purchaseDate": 1631718985000, // 支付时间
"originalPurchaseDate": 1599242074000, // 首次支付时间
"expiresDate": 1634310985000, // 过期时间,订阅有效
"quantity": 1, // 数量
"type": "Auto-Renewable Subscription", //类型 非订阅的是 Non-Renewing Subscription
"inAppOwnershipType": "PURCHASED",  // 
"signedDate": 1634625372402 // 请求响应的签名时间
}


其他api
https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/{originalTransactionId}

https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/{originalTransactionId}

苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功的更多相关文章

  1. JAVA项目之苹果IAP内购JAVA服务器验证流程详解

    1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员,  认真看,  定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...

  2. iOS: 实现苹果的内购

    一.介绍: 在个人开发的app上架到AppStore后,苹果官方允许我们将自己的app在appstore上进行付费使用,也就是所谓的内购.其中,支付方式规定的必须是苹果的支付方式:应用内支付. 二.流 ...

  3. 苹果APP内购客户付款成功,没收到相应虚拟产品的解决办法

    一.引导用户走申请苹果的退款 1.告知用户新版本可以使用支付宝.微信支付,更划算 2.苹果可申请90天以内的退款,一般情况申请后48小时内就有反馈. 参考链接 https://jingyan.baid ...

  4. iOS:苹果内购实践

    iOS 苹果的内购 一.介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝等),当然开发 ...

  5. iOS开发苹果内购的介绍与实现

    1.iOS开发苹果内购的介绍 1.1 介绍 苹果规定,凡是虚拟的物品(例如:QQ音乐的乐币)进行交易时,都必须走苹果的内购通道,苹果要收取大约30%的抽成,所以不允许接入第三方的支付方式(微信.支付宝 ...

  6. iOS应用内支付(内购)的个人开发过程及坑!

    本文会给大家详细介绍iOS内购,这是本人16年5月底的开发过程,希望对看完此篇文章的人有所帮助. 本文基于XcodeVersion 7.3 (7D175)版本,手机是iPhone 6,9.3系统. 部 ...

  7. iOS开发支付篇-内购(IAP)

    一,前言 经典文章参考: . http://yimouleng.com/2015/12/17/ios-AppStore/ 内购流程 . http://www.jianshu.com/p/b199a46 ...

  8. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  9. iOS开发支付篇——内购(IAP)详解

    1 <em>内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈</em> 思维导图 重点总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 1.获取内购列表( ...

随机推荐

  1. 基于Linux系统的MariaDB数据库的安装配置

    数据库是指长期存储在计算机内.有组织的和可共享的数据集合.表是数据库存储数据的基本单位,一个表由若干个字段组成 MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 G ...

  2. Mysql主从复制、半同步复制、并行复制

    MySQL之间数据复制的基础是二进制日志文件(binary log file).一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以"事件"的方 ...

  3. 人生重开模拟器「GitHub 热点速览 v.21.36」

    作者:HelloGitHub-小鱼干 人生是不能重来的,但是 lifeRestart 能满足你的重开心愿.初始值不满意,你可以一直随机生成或者自动添加颜值.智力.运气值,倒是一种"重生&qu ...

  4. 【Elasticsearch】.NetCore中Elasticsearch组件NEST的使用

    .NetCore中Elasticsearch组件NEST的使用 1. 安装Docker # 安装Docker curl -fsSL https://get.docker.com | bash -s d ...

  5. Spring AOP框架 AspectJ

    1 AspectJ简介 v  AspectJ是一个基于Java语言的AOP框架 v  Spring2.0以后新增了对AspectJ切点表达式支持 v  @AspectJ 是AspectJ1.5新增功能 ...

  6. 完蛋,公司被一条 update 语句干趴了!

    大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩 ...

  7. 分享一则Linux系统邮件提示 /usr/local/lib/libprocesshider.so > /etc/ld.so.preload 的中病毒解决方法

    ​ 系统环境:CentOS Linux release 7.6.1810 (AltArch)                   CPU架构:ARM            最近发现生产服务器CPU占用 ...

  8. 文件流转换为url

      /**  * 文件流转换为url  * @param {} data //文件流  */ export function getObjectURL(data) {   var url = null ...

  9. SpringBoot异步使用@Async原理及线程池配置

    前言 在实际项目开发中很多业务场景需要使用异步去完成,比如消息通知,日志记录,等非常常用的都可以通过异步去执行,提高效率,那么在Spring框架中应该如何去使用异步呢 使用步骤 完成异步操作一般有两种 ...

  10. Shell系列(26)- 条件判断之两个文件比较

    两个文件之间进行比较 测试选项 作用 文件1 -net 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真) 文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真) 文件 ...