我目前正在测试我的InApp计费机制(使用InApp Billing版本3 API,因此将TrivialDrive示例作为参考).
我有一个托管项目,即升级到高级版本.
现在,使用我的测试帐户购买该项目是有效的,但是当我之后在Google结帐中取消整个订单时,我的代码仍然告诉我该项目已购买,因此授予高级功能.
以下是我在MainActivity中检查购买的方法.我不会在某处本地保存购买状态,因为据我所知,使用billing API v3,您可以根据需要查询特定购买.
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
iabHelper = new IabHelper(this, Helper.getPKey());
iabHelper.enableDebugLogging(true);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
Log.d("IAB", "SETUP FINISHED");
if(!result.isSuccess())
{
Log.d("IAB", "SETUP NOT OK");
return;
}
else
Log.d("IAB", "SETUP OK");
iabHelper.queryInventoryAsync(
new QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
Log.d("IAB", "Query inventory finished.");
if (result.isFailure()) {
Log.d("IAB","Failed to query inventory: " + result);
return;
}
Log.d("IAB", "Query inventory …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取访问令牌以使用Google Play Android Developer API,而且我使用Google API Java客户端文档示例了解到这一点:
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("...gserviceaccount.com")
.setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher")
.setServiceAccountPrivateKeyFromP12File(keyFile)
.build();
Run Code Online (Sandbox Code Playgroud)
但是如何从此凭据获取访问令牌?credential.getAccessToken()回报null.我做错了什么,或者错过了一些步骤?
我正在使用生成的证书来解决问题,我用它来连接苹果推送服务.当生成的p12文件位于我的src/main/java文件夹中时,一切正常,但我将其移动到src/main/resources,并决定停止处理以下错误:
DerInputStream.getLength(): lengthTag=111, too big.
Run Code Online (Sandbox Code Playgroud)
要了解更多细节:我正在使用notnoop推送通知库,并按照Ray Wenderlich的教程生成证书.之后,我习惯按照命令生成一个p12文件,以便在java中使用:
openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM
openssl pkcs12 -nocerts -in single.p12 -out single.pem
openssl pkcs12 -export -inkey single.pem -in aps_development.pem -out dual.p12
Run Code Online (Sandbox Code Playgroud)
之后我将dual.p12移动到我的java项目中.首先,文件位于我的/ src/main/java文件夹中,让我们说com.company.push.certificates(当请求文件的代码处于时com.company.push).我通过使用请求输入流
InputStream stream = this.getClass().getResourceAsStream("certificates/dual.p12");
Run Code Online (Sandbox Code Playgroud)
这在开发中工作正常,但在构建项目时没有(使用maven),这就是为什么我使用完全相同的包将资源移动到资源文件夹.资源仍然被发现,但现在我得到了上述java.io.IOException
有谁知道这可能导致什么?
Ps:当我将文件移回src/main/java中的包时,一切正常,因此证书似乎是有效的.
我在本文档后面获得了授权码.但是当我试图获得访问令牌时,我总是遇到错误.谁能帮我 ?
public String AccessToken()
{
String accessToken = "";
StringBuilder strBuild = new StringBuilder();
String authURL = "https://accounts.google.com/o/oauth2/token?";
String code = "4/SVisuz_x*********************";
String client_id = "******************e.apps.googleusercontent.com";
String client_secret = "*******************";
String redirect_uri = "urn:ietf:wg:oauth:2.0:oob";
String grant_type="authorization_code";
strBuild.append("code=").append(code)
.append("&client_id=").append(client_id)
.append("&client_secret=").append(client_secret)
.append("&redirect_uri=").append(redirect_uri)
.append("&grant_type=").append(grant_type);
System.out.println(strBuild.toString());
try{
URL obj = new URL(authURL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("Host", "www.googleapis.com");
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(con.getOutputStream()));
//bw.write(strBuild.toString());
//bw.close();
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(strBuild.toString());
wr.flush();
wr.close();
//OutputStreamWriter out …Run Code Online (Sandbox Code Playgroud) 我正在使用Google客户端库并尝试GET向Google Play API发出请求.
GoogleCredential credential= new GoogleCredential.Builder().setTransport(netHttpTransport)
.setJsonFactory(jacksonFactory)
.setServiceAccountId(CLIENT_ID)
.setServiceAccountScopes(SCOPE)
.setServiceAccountPrivateKeyFromP12File(file)
.build();
credential.refreshToken();
HttpRequestFactory requestFactory =netHttpTransport.createRequestFactory(credential);
GenericUrl url = new GenericUrl(URI);
HttpRequest request = requestFactory.buildGetRequest(url);
HttpResponse response = request.execute();
Run Code Online (Sandbox Code Playgroud)
我明白了
{
"code" : 401,
"errors" : [ {
"domain" : "androidpublisher",
"message" : "This developer account does not own the application.",
"reason" : "developerDoesNotOwnApplication"
} ],
"message" : "This developer account does not own the application."
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序未发布,会导致问题吗?
脚本:我即将完成谷歌Playstore应用内结算实施.我使用月度或年度订阅来向我的消费者收费.
问题:我似乎找不到从活动状态删除订阅的方法,因为取消只会停止计费发生.这不允许QA在不为每个测试创建帐户或等待订阅期结束的情况下彻底测试购买过程.
问题:我错过了什么或者错了什么?如果是这样,它是什么?如果没有,应该采取什么措施让QA进行适当的测试?
android subscription in-app-purchase in-app-billing google-play
我正在开发一个Android应用程序,它将出售应用程序内的产品.
在关于"Google Play应用内结算"的Google文档中,有一个名为Purchase Status API的部分.阅读本节后,我所了解的是购买验证应该在我的后端服务器中使用Google Play Android Developer API v1.1完成.
我试图了解Google Play Android Developer API文档,但我不明白为获取授权令牌我必须做些什么.
请帮我!
谢谢
简而言之:我可以在服务器端使用Google Play Android Developer API,而无需在Play商店中提供任何应用程序吗?
背景:我正在开发一个项目,为每月订阅提供应用程序.每个订阅的相应数据(购买令牌,日期等)存储在后端数据库中.现在我想创建一个循环遍历每个数据集的cronjob.对于每个订阅,如果订阅仍然有效,我想联系Google API以检索信息,并更新与响应状态相对应的数据库.
对于后端逻辑,我使用google-api-java-client库.
要取消或验证订阅,我需要先使用OAuth2对自己进行身份验证.去过也做过.
new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher") // $1
.setServiceAccountPrivateKeyFromP12File(new File(filePath))
.setClientSecrets(CLIENT_ID, CLIENT_SECRET) // $2
.build();
Run Code Online (Sandbox Code Playgroud)
1美元:我不知道给定的帐户范围是否有效.因为我只是在极少数示例中找到了这个值,但在本概述和谷歌操场中都没有
$ 2我想这是必要的,尽管我发现很多例子没有提供这些信息.
但是,遗憾的是,当我提供无效数据(如错误的电子邮件或私钥)时,我看不出任何差异.
问题
在下一步中,我尝试获取订阅的购买状态:
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(GOOGLE_PRODUCT_NAME) // $1
.build();
Androidpublisher.Purchases purchases = publisher.purchases();
Androidpublisher.Purchases.Get get = purchases.get("android.test.purchased", "monthly001", "mytoken"); // $2
SubscriptionPurchase subscripcion = get.execute();
Run Code Online (Sandbox Code Playgroud)
$ 1:来自API控制台的虚拟产品名称- > API Access
$ 2:除了事实之外,androidpush API 不允许通过服务帐户联系它,但只能通过web服务器应用程序auth flow,我没有任何线索在get-方法的参数中插入什么. …
我的问题集中在使用 Google 的 In-App Billing API 处理消耗品的应用内购买。(https://developer.android.com/google/play/billing/api.html#consumetypes)
他们的文档将消耗品描述为:
消耗品
相比之下,您可以对可以多次购买的产品实施消费。通常,这些产品会提供某些临时效果。例如,用户的游戏角色可能会在他们的库存中获得生命值或获得额外的金币。在您的应用程序中分配所购买产品的好处或效果称为供应被管理产品。您负责控制和跟踪向用户供应被管理产品的方式。
消耗品是可以多次购买的东西(如游戏货币、游戏内物品或使用的升级等),而非消耗品只能购买一次(无广告、皮肤/角色, 等等。)
在消费购买的文档(https://developer.android.com/training/play-billing-library/purchase-iab-products.html)中,它还提到:
您如何在应用中使用消费机制取决于您。通常,您会为用户可能想要多次购买的具有临时利益的产品实施消费,例如游戏货币或可补充的游戏代币。您通常不希望对购买一次并提供永久效果(例如高级升级)的产品实施消费。
您有责任控制和跟踪向用户提供应用内商品的方式。例如,如果用户购买了游戏内货币,您应该使用购买的货币数量更新玩家的库存。
我的问题是如何跟踪消耗品的用户库存?文档和各种视频似乎很快掩盖了这一点,基本上是说应用程序在确认购买成功时必须应用消耗品的效果。但这并不是真正的全貌。如果用户退出并使用不同的帐户重新登录怎么办?或者他们切换到新手机,他们应该在该手机上拥有该产品。
您无法真正将购买记录保存在 SharedPreferences 或持久缓存中,因为它与手机相关联。如果用户在不同的手机上登录,那么他们应该可以享受他们所做的所有购买的好处。
以下面的例子为例:
一场比赛开始时玩家有 1000 金币。玩家通过应用内购买再购买 500 金币,然后花费 200 金币。如果玩家购买新手机并在该手机上安装该应用程序,他们应该有 1300 金币。
这通常是如何实现的?
您是否需要运行一个私人服务器来跟踪这些东西的购买/消费与 Google 分开?
谢谢!!
我正在为我的安全后端服务器将 AndroidPublisher 库从 v1 升级到 v3。AndroidPublisher 库 (v3) 将允许我安全地对应用内购买和订阅进行服务器端购买验证和确认。
v1 的现有代码不再兼容。v3 库看起来更好,但我找不到任何示例代码:
Get&Acknowledge使用 PurchaseToken 购买。Maven 设置:
<project>
<dependencies>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-androidpublisher</artifactId>
<version>v3-rev103-1.25.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.30.2</version>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)
API 文档:https : //developers.google.com/android-publisher/api-ref/purchases/products/get
寻找这样的示例:https : //developers.google.com/api-client-library/java/google-api-java-client/samples
任何简短的示例代码都会有很大帮助。
android ×5
google-api ×4
java ×4
google-play ×2
subscription ×2
access-token ×1
api ×1
certificate ×1
credentials ×1
gmail-api ×1
oauth-2.0 ×1
server ×1
ssl ×1