苹果内购对接
1. 开发流程描述
主要步骤说明:
## 主要步骤说明:
1.1 步骤1,配置相关
* 业务方需要在 [App Store Connect](https://appstoreconnect.apple.com) 中添加售卖的内购商品
* 需要在沙箱环境和生产环境分别配置回调地址,由支付中心服务端提供回调地址
* 业务方需要提供如下信息给支付中心开发者:
表①
名称 | 说明 |
bundleId | ios应用唯一标识 |
appAppleId | 应用程序标识appId |
kid | 项目内购密钥id |
签名密钥文件 | 下载内购项目密钥(https://developer.apple.com/cn/help/app-store-connect/configure-in-app-purchase-settings/generate-keys-for-in-app-purchases) |
issuer ID | iss,在kid处可找到issuer ID |
1.2 步骤5,[生成苹果内购支付记录]
* 业务方传的orderNo必须是uuid
1.3 步骤8,压入支付队列
* APP创建支付请求,请使用[SKMutablePayment](https://developer.apple.com/documentation/storekit/skmutablepayment)对象,把该对象的[applicationUsername](https://developer.apple.com/documentation/storekit/skmutablepayment/1506088-applicationusername)属性值设置为orderNo,加入支付队列,唤起支付
1.4 步骤11
* 用户完成付款后,APP会收到APP Store回调的收据,APP可自行处理该收据。
* 支付中心不再提供验证收据的功能,而是以苹果APP Store Server回调为准
1.5 步骤12
* 用户完成付款后,苹果APP Store Server会回调步骤1中配置的回调地址,通知支付中心
1.6 步骤13
* 支付中心解析回调内容,更新订单状态,通知业务方最新订单信息
1.7 步骤15
* 业务方收到支付中心的通知后,需更新订单状态,处理支付成功后的逻辑
1.8 步骤16
* APP可轮训支付中心服务端,获取最新订单状态,展示支付成功信息
2. 接收苹果回调
App Store Server 提供了JAVA,Python,Nodejs,Swift的SDK,我们使用Nodejs处理。
2.1 服务端开发
1. 测试回调
我们可以发送一个测试通知的请求,来验证配置的回调地址是否能正常收到回调信息,详情查看:https://developer.apple.com/documentation/appstoreserverapi/request_a_test_notification,回调结果中包含字段testNotificationToken字符串,需要携带该字符串,再请求Get Test Notification Status接口,获取具体的通知内容,详情查看:https://developer.apple.com/documentation/appstoreserverapi/get_test_notification_status,返回结果中包含signedPayload字段,是一个JWS格式的字符串,需要使用开发工具包解析该字符串。
2. 解析回调内容前置工作
2.1 从APPS Store Connect获取内购项目密钥,详情查看https://developer.apple.com/cn/help/app-store-connect/configure-in-app-purchase-settings/generate-keys-for-in-app-purchases,同时还需要下载签名密钥文件(注意:只允许下载一次,下载后需要妥善保管)
2.2 从Apple PKI官网的Apple Root Certificates模块获取苹果根证书,网址如下https://www.apple.com/certificateauthority/,选择Apple Root CA - G3 Root下载
3. 解析回调内容
3.1 使用nodejs JDK解析回调内容,详情查看https://github.com/apple/app-store-server-library-node,
3.2 先用回调接收到的signedPayload,调用SignedDataVerifier.verifyAndDecodeNotification(signedPayload) 方法,得到ResponseBodyV2DecodedPayload对象decodedPayload
3.3 判断decodedPayload里的notificationType,如果为TEST,说明是测试通知请求,不做任何处理,直接返回;我们系统只处理如下几种类型:
① CONSUMPTION_REQUEST:用户发起退款请求,退款中
② REFUND:退款成功
③ REFUND_REVERSED:撤销退款,还能撤销?再把钱扣掉?
④ SUBSCRIBED:已订阅,表示用户购买成功,已付款
3.4再用该对象的decodedPayload.data.signedTransactionInfo调用SignedDataVerifier.verifyAndDecodeTransaction(decodedPayload.data.signedTransactionInfo)方法,得到JWSTransactionDecodedPayload对象A。对象A就是解析后的订单信息,包括price,productId,quantity,currency,purchaseDate,appAccountToken等字段,其中appAccountToken就是2.1的订单号uuid,用来关联自有系统订单
备注:NodejsSDK文档可查看 https://github.com/apple/app-store-server-library-node
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗