标题所说的几乎.该代码适用于我在沙盒环境中以及我的大多数用户中的所有开发设备.但是,有些用户报告下载过程不会超越等待状态(SkDownloadStateWaiting),即使整夜都没有.尝试几次尝试(完全关闭应用程序并浏览还原的购买功能)后,有些人确实设法开始下载,因此它确实是完全随机的. 这是我用来管理下载的代码: - (void)paymentQueue:(SKPaymentQueue *)queue updatedDownloads:(NSArray *)downloads { SKDownload *download = [downloads objectAtIndex:0]; SKPaymentTransaction *transaction = download.transaction; // Keep track of download status switch (download.downloadState) {
以下是关于 in-app-purchase 的编程技术问答
当前,我们的系统以这样的方式工作,当用户购买应用程序内订阅时,购买的收据数据将通过服务器发送到服务器,并且验证后,我们将依赖于用户的权利. 有时由于各种原因,我们可能会遇到一个问题,即可能未分配用户的权利,在这种情况下,他们通过从Apple获得的收据发送电子邮件,包含其订单ID和文档#等. 我似乎找不到与Apple发送的文档中的任何内容一起发送的收据数据中的任何内容,这将使我能够找出与该订单ID匹配的订单. 有没有办法从应用程序购买有效载荷中获取订单ID等,这将有助于确定这一点? 解决方案 否,通过Apple邮件发送给用户的收据发送的订单ID和App Store收据中的交易ID是无关的. (我知道不是很有用.) 如果您确实在后端有收据,我将使用 verifyifyReceipt endpoint 看看他们拥有什么购买.只要您的IAP不耗费,它们就会出现在收据中.然后,您希望手动授予他们权利. (IMO,从客户服务的角度来看,我只会给客户疑问的好处并立即授予
在SANDBOX环境中购买应用程序中有效,但在Apple评论中不起作用,这导致应用程序拒绝: 我找不到问题,因为在使用沙盒帐户的测试设备上,应用程序购买良好.我也确实发送了IAP进行审查,但我没有进行任何收据验证. 我能找到问题根源的任何想法吗? 解决方案 始终首先使用生产URL验证您的收据;如果您收到21007状态代码,请继续使用沙盒URL验证.遵循此方法可确保您在应用程序在沙箱中进行测试或审查时不必在URL之间切换或在App Store中使用. 21007状态代码表示此收据是沙盒收据,但已发送到生产服务进行验证. 0的状态表示收据已正确验证. 在这里查看: https://develveper.com/library/content/content/technotes/tn2413/_index.htmll#/apple/paple/apple_ref/dts40016228-ch128-ch1-ch1-ch1-ch1-receipturl /libr
我正在尝试使用PHP验证App Product在App Product的购买服务器端的Google Play/Android.我通过有效的收据获得了回复,但是有两个令人困惑的问题: productId总是null 如果我将下面的样本中的$productId更改为无效ID,它将返回完全相同的响应.实际上,任何字符串似乎都是这种情况. 这是我的示例代码: $purchaseToken = 'TEST purchaseToken FROM ANDROID APP'; $appId = 'com.example.myapp'; $productId = 'com.example.myapp.iap1'; $googleClient = new \Google_Client(); $googleClient->setScopes([\Google_Service_AndroidPublisher::ANDROIDPUBLISHER]); $googleClient->setA
我从我的PHP服务器验证了针对App Store的收据后,App Store将我带回了JSON响应 "status" : 0 "receipt" : ( .... ) 收据项目之一是" public_date",其中包含以下字符串(示例)" 2010-02-09 19:17:04 etc/gmt" 我正在尝试建立订阅服务,并想在此日期添加3个月,然后将该到期日期写入MySQL表. PHP中是否有一个可以让我实现3个月的弦乐类型功能? 我找到了这个示例,看起来它增加了1个月的日期: $date = date("Y-m-d");// current date $date = strtotime(date("Y-m-d", strtotime($date)) . " +1 month"); ,但我不确定如何将App Store通过的字符串变成识别的PHP日期. 解决方案 您已经完成了,您添加了太多一步. $purchase_date = "
不停止搜索的2天,我在IAP的重要问题上空白了.我们需要服务器来验证收据,并且响应始终为21002. 我发送的客户端 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; NSDictionary* post = @{@"receipt":[receipt base64EncodedStringWithOptions:0]}; [ServerRequest requestWithUrl:url Callback:nil SendToIM:NO PostData:post];//does standard _POST to our php server 这是一个沙盒收据作为base64字符串,然后才撞击服务器 MIIU2gYJKoZIhvcNAQcCoIIUyzCCFMcCA
我创建了一个应用程序,其中有一个每月自动续订的应用程序内购买..首次成功付款,我称之为网络服务,我曾在该服务中让用户升级为Premium类. 现在,如果用户从Google服务器手动取消付款,我怎么知道用户已取消其订阅. 是有一些php代码查询还是我必须在Android中打电话给背景中的某些内容以检查状态吗? 谢谢Advace 解决方案 您可以通过 检查应用程序内购买的订阅 编辑:用于订阅的使用" subs",用于Inapp-purchases使用" InApp",例如: inapp-purchases:mService.getPurchases(3, getPackageName(), "inapp", null); 订阅:mService.getPurchases(3, getPackageName(), "subs", null); 另请参见Querying for Purchased Items /google/play/billin
我的Google Wallet php php在应用内付款中看起来像这样: $sellerIdentifier, "aud" => "Google", "typ" => "google/payments/inapp/item/v1", "exp" => time() + 3600, "iat" => time(), "request" => array ( "name" => "pizza ", "description" => "yum yum", "price" => "10.50", "currencyCode" => "USD", "sellerData" => "", ) ); $testToken = JWT::encode($payload, $sellerSecret); ?> 我有两个问题: 1. 我为什么看到这个错误?.
我需要使用PHP验证Windows 8应用程序服务器端的应用内购买. MSDN的文档页面仅在C#中有一个示例.现在,我已经花了整整一天的时间来寻找一种在PHP中进行的方法.没有成功.整个互联网上只有关于此主题的.NET示例. 我找到了一些有关签名XML和X509的部分信息,某些库(XMLSeclibs - 无用,使用openssl_*函数不支持SHA256; phpseclib-看起来很有希望,但他们的文档和示例很差,没有帮助). 是否可以以某种方式在不学习有关签名XML,RSA和X509的所有内容的情况下进行操作?现在,我已经阅读了几乎所有内容,但是到处都是关于编码的信息. 没有任何验证. 解决方案 我设法使用 xmlsseclibs xmlSeclibs 图书馆. 另外,您需要启用PHP卷发. do { $doc = new DOMDocument(); $xml = $_POST['receipt_data']; // your re
我现在真的很混乱地了解了需要的概念和原因,甚至不知道如何通过编码实施. 所以,我使用Unity,C#制作了手机游戏.使用php,mysql进行高分子,并将用户存储在App购买的项目信息中. 我一周前在Google Play上发布了游戏,我的Google钱包直到现在现在购买了该游戏中的任何物品. 但是,当我检查游戏服务器(MySQL数据库)时,某些用户应该购买大量的项目. 这意味着某些用户使用黑客工具并绕过Google Play检查过程并欺骗我的游戏并进行了假购买. 因此,我没有实现开发器负载,也没有对Google Play购买收据进行验证. 所以现在我在DB上删除了整个恶意用户的项目(这将将0设置为该用户客户端的项目),并希望实现Google Play Play购买收据的服务器端验证. 我通过谷歌搜索搜索了许多帖子,但是从一开始到结束就没有完美的解决方案. 无论如何,我到目前为止实施了. 首先,在用户结束Google Checkout
我正在尝试将收据验证与服务器端一起使用.一切都可以,但是有时候我会看到奇怪的是:10次验证还可以,但是在11中,我遇到了21002错误.我不知道该怎么办.有时,当我在启动应用程序后首次验证收据时,我会遇到错误21002. 应用程序: func validateReceipt(productID: String) { let receipt = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!)! let receiptdata = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) let request = NSMutableURLRequest(URL: NSURL(string: "my_server_url")!) let session =
我正在将应用程序从ios6转换为ios7.在我使用不推荐的transactionReceipt方法之前,现在我正在尝试使用推荐的方法检索收据,然后在基础64中进行编码: NSData *working = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]]; // Tried 64 or 76 chars/line and LF or CR line endings NSString *receipt = [working base64EncodedStringWithOptions:kNilOptions]; 以上是代码中唯一的更改.以下是我的验证方式,没有更改: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queu
我已经在App购买中玩了几天,一切都很好,直到我试图用App Store验证收据,因为我不断获得无效的状态. 我将收据数据传递给我的PHP服务器,然后从那里转发到App Store,一旦获得有效的响应,我打算将收据数据添加到我的数据库中. 商店套件编程指南和类参考对于此特定领域的效果不足,因为它们并没有为您提供任何例子,我确实找到了一个有用的基本上我想知道有收据验证的人是否愿意分享他们的代码. 谢谢 解决方案 首先,已发布的代码中有一些错别字.尝试这个. (免责声明:重构等.Al是读者的练习!) - (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction { NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactio
我正在使用PhoneGap/Cordova插件进行应用购买:Cordova 1.7的Inapppurchasemanager,我看上去似乎已经去了商店,但没有找到该产品.我已经设置了具有正确的配置配置文件的应用程序,并且在iTunes中添加了该应用程序,以正确地掌握了我的知识.我已经搜索了我要返回的错误消息,但是在Interwebs上没有太多信息.我将其缩小到的最合理的解决方案是等待产品传播到所有服务器(虽然这似乎有点愚蠢). 以前有人有这个问题,您的解决方案是什么? 这是我在控制台中遇到的错误 获得IAP产品响应 测试应用2.0 [21619:707]发送失败( window.plugins.inapppurchasemanager.callbackmap.f0.f0.fail ) 测试应用2.0 [21619:707]完成IAP 解决方案 这只是时间问题,第二天再次运行它,并且没有问题.所有错误都消失了,我收到了正确的数据. 这很愚蠢,但是要通过所有
我正在尝试使用PhoneGap插件在我的应用程序中购买应用程序内购买,该插件是 https://github.com/phonegap/phonegap-plugins/tree/master/iphone/inapppurchasemanager 但是在沙盒测试中,我会遇到遵循错误 plugins.inapppurchasemanager.updatedtransactioncallback.apply(plugins.inapppurchasemanager,[" payerage transactionStateFailed",0,","无法连接到iTunes store"," 然后申请被击中...任何人都可以帮我吗? 解决方案 在inapppurchasemanager.js内看一看,您会看到InAppPurchaseManager.prototype.updatedTransactionCallback的第一个呼叫是: 警报(状态); 用PhoneG
我正在尝试设置一个node.js服务器,以从我设置的应用购买中验证AppStore connect的收据.我遵循此 https://github.com/voltrue2/in-app-purchase/a >库,但我会收到错误响应,说我的收据未定义和failed to validate receipt.我在这里做错了什么.我仍在本地服务器上测试.在Heroku上托管之前,我想让它起作用.我在这里做错了什么? const iap = require('in-app-purchase'); iap.config({ applePassword: 'MySecretKey', test: true }); iap.setup() .then(() => { iap.validateOnce(receipt, appleSecretString).then(onSuccess).catch(onError); }) .catch((error) =>
我正在为我的一个应用程序创建不可再生的订阅. 我已经阅读了文档,如果我实现了不可再生的订阅,那么我必须编写代码才能从服务器端到期. 我都完成了. ,但是我有点混淆,如果我要购买该物品后,该项目已终止,请说明图像中所述的警报.这意味着它将恢复不可再生的订阅或购买新的订阅? 我还读到的另一个问题,在Stackoverflow上,如果应用程序提供了不可再生的日落,则必须具有可选的注册流,这是真的吗? 解决方案 关于您的第一个问题,无法通过通常的Apple方式恢复非更新订阅或同步设备之间的恢复/同步.您必须提供自己的机制. 您可以检查此文档 并判断您自己想做什么. 您可以同步并恢复非支出和自动更新 使用StoreKit跨设备订阅.当用户购买 您的应用程序负责 用于使其在所有用户的设备中可用,并且 使用户能够恢复过去的购买. 关于您的第二个问题: 您可以查看您的应用与评论中的应用程序如何关系.指南. " (v)帐户登录:如果您的应用不包括重要
收据中有一个IN_APP字段作为数组. 什么时候返回包含超过1个元素的数组? 以及最新购买的物品的索引是什么? 解决方案 来自 in_app : 在JSON文件中,该密钥的值是一个数组,该数组基于基于输入基本64收据数据中存在的应用内购买交易的所有应用内购买收据.对于包含自动可再生订阅的收据,请检查最新续订的最新续订状态. 不需要的产品,自动更新订阅,非更新订阅或免费订阅的应用内购买收据无限期保留. 因此,如果您拥有自动更新订阅或用户购买多个不需要的或非更新的订阅项目,则可以期望此数组随着时间的推移而增长. 对于自动更新订阅,最新续订的详细信息在latest_receipt_info键中. 尽管没有记录下来,但从观察中看来,数组中的最后一项是最近的购买,但是您应该检查purchase_date字段.
我不明白为什么它不进入IF控件.有人知道向我解释吗? - (void)verifyapp{ NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSLog(@"%@", receiptURL); //CONTROLLO SE ESISTE if ([[NSFileManager defaultManager] fileExistsAtPath:receiptURL.path]) { } } 解决方案 仅当您从AppStore安装应用时才存在.如果您从Xcode调试模式安装它,则不会有收据.要调试代码,您需要先从AppStore安装应用程序,请启动并从其上方XCode安装应用程序.