iOS 内购 的若干问题

1 天前
 chouqiu

现在是在 App Store Connect 后台开启了 App Store 服务器通知

填写了 生产环境服务器 URL沙盒环境服务器 URL 两个回调地址

生产环境服务器 URL: https://prod.xxx.com/iapNotify

沙盒环境服务器 URL: https://test.xxx.com/iapNotify

在开发过程中,测试同事使用 TestFlight 安装了最新版本的 app

当客户端完成支付时,沙盒环境服务器 URL 会收到苹果服务器通知,一个是 JWT 字符串

signedPayload解出来是下面这样的:

{
  "notificationType": "ONE_TIME_CHARGE",
  "notificationUUID": "d03b3bae-a63c-4fd3-ad4f-69e52fb966fd",
  "data": {
    "appAppleId": 6751180999,
    "bundleId": "xx.yy.zz",
    "bundleVersion": "62",
    "environment": "Sandbox",
    "signedTransactionInfo": "eyJhbG..."
  },
  "version": "2.0",
  "signedDate": 1759197475796
}

再把signedTransactionInfo解出来是这样的:

{
  "transactionId": "2000001023950888",
  "originalTransactionId": "2000001023950888",
  "bundleId": "xx.yy.zz",
  "productId": "xx.yy.zz.product_01",
  "purchaseDate": 1759197470000,
  "originalPurchaseDate": 1759197470000,
  "quantity": 1,
  "type": "Consumable",
  "appAccountToken": "856bb959-ae22-4711-2005-af69286aceed",
  "inAppOwnershipType": "PURCHASED",
  "signedDate": 1759197475796,
  "environment": "Sandbox",
  "transactionReason": "PURCHASE",
  "storefront": "CHN",
  "storefrontId": "143465",
  "price": 6000,
  "currency": "CNY",
  "appTransactionId": "704888381761368888"
}

appAccountToken 是我们的订单唯一标识

问题:

1.怎么确认这个订单已完成支付

是只要有这个回调就认为是支付成功了吗?

2.如果订单退款是怎么处理

沙盒环境好像不能测试内购的退款流程,如果上线了退款时,也会有这种服务器通知吗

3.现在要提审 app ,更换了生产环境接口 https://prod.xxx.com ,在 TestFlight 里更新到最新版

支付完成后,App Store 的服务器通知还是会请求到 沙盒环境服务器 https://test.xxx.com ,这样订单标识就对不上了。那 App Store 的审核人员审核内购时会审核不通过吧。

首次对接 iOS 内购,问题有点多,希望各位大佬赐教

1781 次点击
所在节点    iDev
25 条回复
ccyq1994
1 天前
只有在 App 过审之后的订单才会是真是的环境,其他的都是走的沙盒。
ccyq1994
1 天前
有一个通知回调的地址,需要你们填写在 App Store Connect 后台。当发生退款后,苹果会调用你们填写的地址进行通知
ccyq1994
1 天前
沙盒想测试退款有点困难,也有点复杂,但是还是可以做到的,需要在沙盒创建一个订阅类型的商品,然后让你们的 iOS 工程师参考苹果的文档去写一个支付跟取消的功能,然后你再在通知中去看,你最好是在回调的地方打个 log
chouqiu
1 天前
@ccyq1994 #2

审核时,支付成功后回调也请求到沙盒环境服务器 URL ,这样怎么做支付确认呢

审核时把 App Store Connect 后台的沙盒环境服务器 URL 改成生产环境的服务器 URL 吗
ccyq1994
1 天前
@chouqiu 你验证的时候不是有一个状态的吗?那个状态可以可以判断是不是成功。你可以先用生产环境去验证,如果失败的话,会给你报一个是沙盒环境的状态码,再根据那个状态码去沙盒环境验证。
amarantin1
1 天前
https://juejin.cn/post/7551258620349431854

这个文章看起来描述的挺清晰,我正在看

错误处理:如果使用生产环境 URL 调用此 API 返回错误码 4040010 ( TransactionIdNotFoundError ),表明该交易 ID 在生产环境中不存在,应尝试使用沙盒环境 URL 再次调用 。
whoisjohnlee
1 天前
Store Kit2 支持退款通知测试,让客户端的人仔细看下文档
chouqiu
1 天前
@ccyq1994 #5
审核时,审核人员购买成功后,服务器通知请求到了沙盒环境服务器 URL ( https://test.xxx.com/iapNotify


@amarantin1 #6
谢谢,正在看,确实很详细


不过,好像提审时,还是得把 沙盒环境服务器 URL 改成 生产环境服务器 URL
jonssonyan
1 天前
https://developer.apple.com/documentation/appstoreservernotifications/notificationtype
appstore v2 的官方文档写的很清楚
1. 收到 ONE_TIME_CHARGE 就是购买成功
2. 退款的 notificationType 是 REFUND
3. 回调都配置同一个地址,数据表多加一个字段区分环境,signedTransactionInfo 的 environment:Sandbox 沙箱 / Production 生产
iSteven
1 天前
放宽心,审核人员是不会真的内购的,能弹出支付面板估计就当该功能通过审核了,不会真的走后面的支付流程。
weofuh
1 天前
多看两遍官方文档就没问题了: https://developer.apple.com/documentation/appstoreservernotifications/app-store-server-notifications-v2

里面有很多种通知类型:普通内购成功、首次订阅成功、续费订阅成功、退款、测试...

(退款的我也没亲自测试过,之前的测试工具方法都不可以用了,但好像能让你们开发从 Xcode 上发起)

通过 TestFlight 安装的,发生的交易都默认就是 Sandbox 环境,不会真正的扣款,交易通知自然也就发送到你们的测试环境了。
苹果审核不会给你们测试整个内购流程的,他们只管你们的内购符不符合他们的规范。至于交易消息通知处理,你爱处理不处理,哈哈哈。
chouqiu
1 天前
@jonssonyan #9
@weofuh #11
了解了,谢谢


@iSteven #10
是这样吗,现在已经做了兼容了


目前把沙盒环境服务器 URL 和生产环境服务器 URL 改成一样的了
ryh
1 天前
13 天 前有 v2 网友 @alioth0909 发了个 https://v2ex.com/t/1159685 “[开源] iOS 开发者的防退款神器” 估计你们能从中学到关于推送的
wogogoing
1 天前
很多年前跟朋友一起接过内购,感觉流程很神奇:

https://blog.keepchen.com/a/apple-internal-purchase-data-validation.html
chouqiu
1 天前
@wogogoing #14
现在有服务器通知了

客户端是使用 flutter 开发的,拿到的 Receipt 也是一个 JWS 字符串,解析出来的数据,和这篇文章里的不一样。


@ryh #13
谢谢,得空学习学习
wogogoing
1 天前
@chouqiu 了解了,感谢。
mbtfdwlx
1 天前
请教一下 appAccountToken 是怎么赋值的,看了下没找到相关的 api 接口
chouqiu
1 天前
@mbtfdwlx #17

客户端拉支付时传递的 applicationUserName
mbtfdwlx
1 天前
@mbtfdwlx 找到问题了,我是 oc 的代码,storekit2 不支持 oc
mbtfdwlx
1 天前
@chouqiu #18 我刚试了下,服务拿到的数据解出来不包括 appAccountToken 字段,可能是我 oc 代码的原因么,我再看看 多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1162819

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX