我正在使用Google API Client Library for Java来获取有关在我的Android应用程序中购买的用户订阅的信息.这就是我现在正在做的事情:
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(GOOGLE_CLIENT_MAIL)
.setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher")
.setServiceAccountPrivateKeyFromP12File(new File(GOOGLE_KEY_FILE_PATH))
.build();
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).
setApplicationName(GOOGLE_PRODUCT_NAME).
build();
Androidpublisher.Purchases purchases = publisher.purchases();
Get get = purchases.get("XXXXX", subscriptionId, token);
SubscriptionPurchase subscripcion = get.execute(); //Exception returned here
Run Code Online (Sandbox Code Playgroud)
GOOGLE_CLIENT_MAIL是来自Google控制台的API Access的电子邮件地址.
GOOGLE_KEY_FILE_PATH是从API Access下载的p12文件.
GOOGLE_PRODUCT_NAME是品牌信息的产品名称.
在Google APIS控制台中,启用了"Google Play Android Developer API"服务.
我得到的是:
{
"code" : 401,
"errors" : [ {
"domain" : "androidpublisher",
"message" …Run Code Online (Sandbox Code Playgroud) 伙计们,
我正在尝试验证自动续订订阅是否实际在沙箱环境中续订.首先,沙盒中的自动续订订阅似乎仅在5分钟内有效.说得通.我希望如果我等了五分钟,那就打个电话
https://sandbox.itunes.apple.com/verifyReceipt
根据我的收据数据,我应该看到续订的订阅时间再过了五分钟.
不幸的是,事实并非如此.我看到的是latest_expired_receipt_info响应和21006状态,这意味着"这收据是有效的,但订阅已过期"根据苹果的文档.
任何人都可以告诉我他们是否能够端到端地测试自动续订订阅,包括此更新组件?或者我是否必须启动此应用程序并交叉我的手指,prod将如宣传的那样工作?
或者,在将数据重新发布到verifyReceipt URL之前,我是否需要运行某种客户端魔术/ API调用?
有一些关于这个主题在这里讨论,但如果我可以/应该指望通过发布到verifyReceipt URL,或者如果我必须做的事情在客户端能够在服务器端完全重新验证订阅它不是我清楚一边也是.
谢谢!
当用户首次从Google Play商店购买订阅时,我的应用会向我的服务器发送一张收据,其中包含包裹名称,订阅/产品ID和购买令牌.然后,我可以调用Purchases.subscriptions.get API来验证订阅.
我不清楚的是,一旦更新发生,我是否可以完全验证订阅服务器端?文档对此非常不清楚.
据我了解,使用V3购买API,应用程序需要轮询以查看订阅是否已续订,然后将新收据转发到服务器上.我假设购买令牌在续订时会有所不同,这表明不可能完全在服务器端实施续订检查.
我错过了什么吗?
android subscription in-app-purchase auto-renewing google-play
我终于想出了如何使用本教程实现Stripes Monthly Billing. http://railscasts.com/episodes/288-billing-with-stripe
到目前为止,用户可以使用Stripe创建和删除其订阅.
但是,用户如何在创建订阅后更改其信用卡信息
这是我的评论和问题代码.请帮助新的rails.:)
CONTROLLER
class SubscriptionsController < ApplicationController
def new
plan = Plan.find(params[:plan_id])
@subscription = plan.subscriptions.build
@subscription.user_id = current_user.id
end
def create
@subscription = Subscription.new(params[:subscription])
if @subscription.save_with_payment
redirect_to @subscription, :notice => "Thank you for subscribing!"
else
render :new
end
end
def update
@subscription = current_user.subscription
if @subscription.save
redirect_to edit_subscription_path, :success => 'Updated Card.'
else
flash.alert = 'Unable to update card.'
render :edit
end
end
end
Run Code Online (Sandbox Code Playgroud)
楷模
class Subscription < ActiveRecord::Base
attr_accessible :plan_id, :user_id, :email, :stripe_customer_token, :last_4_digits, …Run Code Online (Sandbox Code Playgroud) 这可能是一个主观问题,但我会试一试.
关于订阅计费管理的问题已经有很多问题.我目前正在开发一种需要全自动计费系统的SaaS解决方案.
在提出这个问题时我不想要的是关于实施特定支付网关或类似内容的建议.相反,我想知道采取何种方法.
我需要的功能是一个可以处理升级,降级,定期计费,取消等的系统.最初仅针对一种产品,但随着时间的推移可能需要系统可以处理多种产品(我认为产品根本意味着不同产品,不是同一产品的不同变体).
正如我所看到的,当您需要这样的解决方案时,有许多可能的方法:
使用托管解决方案的优势显然是您不需要PCI认证,关注是外包的,并且启动和运行起来要快得多.然而,这些优势需要付出代价:对您的产品最重要的支持功能 - 即计费不在您的控制范围内.此外,您的控制力和灵活性较低.
你会怎么做?如果我们超越PCI要求,我肯定更愿意在内部编写一个可以完成这种工作的系统.另一方面,我从众多消息来源获悉,对这样的系统进行编码是一种痛苦.
任何建议都非常感谢.此外,如果您建议自己编写代码,那么任何有关如何进行编码的经验,或者是否有任何开源项目(无论语言,我所追求的不是代码而是结构)我都能从中受益意思是很多.
如果我要设计一个庞大的分布式系统,其吞吐量应与用户数量和系统中的通道数量成线性关系,这会更好吗?
1)Redis Cluster(仅适用于Redis 3.0 alpha,如果它处于群集模式,您可以在一个节点中发布并在另一个完全不同的节点中订阅,并且消息将传播并与您联系).Publish的复杂性是O(N + M),其中N是订阅客户端的数量,M是系统中订阅模式的数量,但是在Redis群集中它如何扩展?我接受有关这方面的有根据的猜测.
2)自3.x以来的ZeroMQ,它进行服务器端过滤,因此它也有一些时间复杂度,但我在文档中没有看到任何关于它的内容.如果我想扩展它,我可以让很多服务器发布到任何通道,每个订户将连接到所有服务器,并订阅所需的通道.这看起来不错.
那么哪一个更适合大型发布者系统的横向扩展?我应该研究哪些其他解决方案?请记住,我希望最小化延迟和吞吐量,但能够水平扩展.
代码如下所示:
时钟:
public class Clock
{
public event Func<DateTime, bool> SecondChange;
public void Run()
{
for (var i = 0; i < 20; i++)
{
Thread.Sleep(1000);
if (SecondChange != null)
{
//how do I get return value for each subscriber?
Console.WriteLine(SecondChange(DateTime.Now));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
DisplayClock:
public class DisplayClock
{
public static bool TimeHasChanged(DateTime now)
{
Console.WriteLine(now.ToShortTimeString() + " Display");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
LogClock:
public class LogClock
{
public static bool WriteLogEntry(DateTime now)
{
Console.WriteLine(now.ToShortTimeString() + " Log");
return …Run Code Online (Sandbox Code Playgroud) 我正在努力弄清楚以下日期的格式:
2011-05-24 19:02:32 Etc/GMT
此日期从Apple的收据验证服务返回,我需要将其转换为NSDate进行一些比较操作.真正的麻烦与时区有关.
这是我已经写过的一些代码:
NSDictionary *receiptData = [info valueForKey:@"expires_date"];
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setLocale:[NSLocale currentLocale]];
[f setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[f setDateFormat:@"yyyy-MM-dd HH:mm:ss vvvv"];
NSLog(@"%@", [f stringFromDate:[NSDate date]]);
NSDate *subPurchaseDate = [f dateFromString:[receiptData valueForKey:@"original_purchase_date"]];
[f release];
Run Code Online (Sandbox Code Playgroud)
我已经尝试过'v'和'Z'的所有组合,我能想到的.任何见解?
我正在与客户合作构建一个使用自动续订订阅的报亭应用.我似乎无法弄清楚这个的正确逻辑.我理解应用内购买,但之前从未搞过订阅.
我似乎无法围绕着追踪这一点.苹果似乎希望尽可能地做到这一点.
我希望有一个应用程序,每月提供一个新的杂志作为单一,非消费品购买,或允许他们订阅.
我理解在购买订阅时验证收据的概念,但之后会发生什么?应用程序是否每次启动时重新检查订阅以查看订阅是否是最新的?初次购买后,续订收据来自哪里?
我查看了Urban Airship,它似乎正在为您跟踪这一点 - 但我没有找到实施订阅的示例应用程序或教程.还有其他类似的服务吗?
我正在使用Java SDK Android Publisher v2和Oauth2 v2.一旦我创建了服务帐户,我就获得了一个Google Play Android Developer带有客户端ID,电子邮件,私钥等的服务帐户JSON .我试图环顾四周并找出如何创建凭据以便我使用AndoirdPublisher服务来获取信息我的Android应用程序的用户订阅,权利等,并将此信息存储在我们的后端服务器上.
我正在努力弄清楚如何解决这个问题.到目前为止,我见过的所有文档都没有帮助创建GoogleCredential使用下载的JSON.
例如,有这个文档,但它只提到P12文件,而不是JSON.如果可能,我想避免使用P12,因为我有多个客户端,我想将这个JSON保存在某种数据库中,然后用它来为每个客户端创建凭据.
只是为了澄清我正在尝试创建这里描述的GoogleCredential对象,
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.sqladmin.SQLAdminScopes;
// ...
String emailAddress = "123456789000-abc123def456@developer.gserviceaccount.com";
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(emailAddress)
.setServiceAccountPrivateKeyFromP12File(new File("MyProject.p12"))
.setServiceAccountScopes(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
.build();
Run Code Online (Sandbox Code Playgroud)
但是,不是像这样使用P12文件设置服务帐户setServiceAccountPrivateKeyFromP12File(),我想使用带有相同信息的JSON,并在创建服务帐户时生成.
android subscription google-api-java-client in-app-billing google-play-services
subscription ×10
android ×3
ios ×3
google-play ×2
iphone ×2
app-store ×1
c# ×1
events ×1
google-api ×1
java ×1
objective-c ×1
payment ×1
publish ×1
redis ×1
return-value ×1
ruby ×1
saas ×1
zeromq ×1