在我的Google Play控制台中,我链接了一个项目.然后我创建了一个服务帐户.尽管如此,在刷新控制台时,仍然会说"没有与您的项目关联的服务帐户".已经等了24个多小时了.所有这一切的目的是收据验证.
android google-api service-accounts receipt-validation google-play-console
我已经在Apple的Receipt Validation Programming Guide的帮助下使用OpenSSL和asn1c编译器在设备上本地实现了收据验证.我的应用程序仅支持iOS 7及更高版本.
根据Apple的推荐,我打电话[[NSBundle mainBundle] appStoreReceiptURL]
来获取应用商店收据.当应用程序在显示任何UI之前"首次"启动时,我也会执行此操作.首次启动呼叫是必需的,因为如果第一次尝试不在那里,Apple建议刷新收据.作为此调用(SKReceiptRefreshRequest
)的结果,应用程序要求用户输入其iTunes登录信息.
现在问题是Apple一直拒绝该应用程序说我正在调用他们的生产服务器而不是沙盒服务器.但根据我对"收据验证编程指南"的理解,只有在您使用第二种验证方法并通过您自己的安全服务器向Apple发送数据时才有效.然而,我在本地做所有事情,并且对于如何区分生产环境和沙盒环境非常困惑,以便我的应用程序可以通过审核.
任何指针或建议都会非常有用.
有很多关于如何使用沙盒测试器帐户测试应用内购买收据验证的示例.
但付费应用程序本身的收据如何?我们如何在开发环境中获得App Receipt?
我想做两件事:
防止非购买应用程序的用户运行我们的应用程序的非法复制.正如我所看到的那样,检测到连接的iTune帐户的应用程序并不拥有应用程序(它向用户显示警告他们没有应用程序,但是他们无法阻止用户继续使用该应用程序)
将应用购买收据发送到我们的服务器.我们想知道他们何时购买我们的应用程序,他们带来了什么版本的应用程序.
我需要实现一个后端来验证Apple的应用内购买receipt_data,以便在应用内购买应用内点数(即不是订阅而不是需要"记住"的项目,并且每次都需要重新验证申请发布).
我不擅长iOS.我只需要开发后端,以便它可以与客户端的移动应用程序集成.
我找到了用于验证的教程和示例代码,但我非常希望有一个实际的receipt_data来测试.
最好的方法是有两个receipt_data:一个沙箱和一个生产.
我理解,我需要支持的receipt_data有两种变体- 一种包含单个购买的数据,另一种包含购买的完整历史记录.如果是这样的话,每个人都有一个样本会很棒......
我意识到这不是一个问题本身,但也许样本收据对其他开发人员也很有用......
我们完全了解iOS中的收据验证流程.
以下是我们目前的工作(开发中):
在applicationDidFinishLaunching
和applicationWillEnterForeground
我们确认在服务器端的收据,如果没有收据或收据是无效的,我们尝试刷新收据和重新验证.
以下是一些问题/问题:
什么情况下设备上没有可用的收据?
我们是否应该在没有收据时发出收据刷新请求?
为什么这个警报框有时会在启动时显示?我明白这是在收据刷新请求上显示的吗?
收据验证的Apple文档表示在发布后立即执行收据验证.这相当于检查返回路径中的数据,如果不存在则[[NSBundle mainBundle] appStoreRecieptURL]
刷新SKReceiptRefreshRequest
,并验证它.上述文档引用了iOS和macOS.
它在iOS上真的有必要吗?如果是这样,为什么?是阻止用户在越狱设备上使用我的应用程序,还是没有从应用程序商店购买它(在这种情况下,我可能不关心我的应用程序是免费的)?或者它是否会对恢复或验证应用内购买等其他操作产生影响?例如,收据数据是否已经存在以验证应用内购买的交易?
注意:我没有使用应用内订阅.我有应用内购买,但在验证并记录购买服务器端后,我不使用它们的收据.
我到目前为止在线阅读,检测用户是否取消了应用内购买的唯一方法是使用我从用户的iPhone获取的收据数据,并检查该项目中是否存在cancellation_date,但据我所知,此字段仅在自动续订订阅项目上找到.
(至少我在网上看到的每篇帖子都是我发现在应用程序购买中谈论的,根本没有提到消耗品.)
因为它们总是存储在收据数据中,而消耗品存储在收据数据中,直到应用程序本身完成交易,一旦完成,该项目的购买交易将在完成处理后从收据数据中永久消失. iPhone.
所以我的问题是,如果用户要求取消从Apple购买的应用程序,这是一个消耗品,我是否也在收据数据中取回同一项目交易,其中包含cancellation_date字段?
我从未见过有人证实这一点.
如果有人可以在其中提供带有cancellation_date示例的receipt-data base64字符串,那将是很好的(如果这样做是合法的).
我正在实现一个自动更新的订阅方案,其中收据验证将由我的服务器端代码处理.根据Apple的文档,我将从中获取收据数据NSBundle
,并将该数据传递给我的服务器,该服务器将联系Apple以验证收据并通知应用程序结果.
现在我的问题与收据验证相关的必要流程有关:
如果用户购买了订阅,我的收据将自动更新来自该购买的信息?如果是这样,是否有必要在购买后立即验证收据,还是应该立即"解锁"应用程序?
在什么情况下我的收据会丢失NSBundle
?如果发生这种情况,我想我应该使用SKReceiptRefreshRequest
刷新收据,并将其发送到服务器进行验证.
如果用户在不同的设备上安装应用程序并恢复购买restoreCompletedTransactions
,我是否会同时自动获取收据?我想我需要在恢复后验证收据,以确保有一个有效的订阅,对吗?
当我的服务器尝试验证收据,并且该收据无效时,应用程序端会发生什么?刷新收据(将要求用户提供凭据)并再次将其传递给服务器以进行新的重新验证?
subscription in-app-purchase ios auto-renewing receipt-validation
我在设备上本地使用收据验证并定位到iOS 7+
我正在沙盒环境中测试应用购买中的自动续订订阅,我注意到了这种情况.
- 用户A在设备上的iTunes帐户中签名,在应用程序中购买订阅,获取应用程序收据.-User A在设备上签署iTunes帐户,用户B登录-User B启动应用程序-User B将继续使用用户A的订阅,因为[[NSBundle mainBundle] appStoreReceiptURL]有效并将返回用户A的收据.
怎么回不到用户B的收据?
一旦我从客户收到收据并通过苹果服务器进行验证,我就会在此收据中获得新购买的交易ID(这是自动订购购买).几天后,我从同一客户端收到一张新收据并进行验证,发生了奇怪的事情:旧购买的交易ID发生了变化.
我将旧收据中此次购买的数据与新收据中的数据进行比较,唯一更改的是transaction_id字段,original_transaction_id,purchase_date,expires_date,web_order_line_item_id和其他字段完全相同.
比我检查数据库,我发现大约1%的交易记录有相同的情况.并且有一个特点,他们的大部分交易ID都增加或减少了1-2.
我以前认为交易ID是购买的标识符.有没有人遇到同样的问题或知道原因?
ios ×9
objective-c ×2
receipt ×2
android ×1
app-store ×1
backend ×1
google-api ×1
iphone ×1
storekit ×1
subscription ×1