【发布时间】:2020-06-03 10:04:04
【问题描述】:
我有以下用 node.js 编写的 firebase 云函数,我从我的 Android 应用程序调用该函数。该函数工作正常,但在尝试在 Android 中获取结果时我得到空值。我需要返回到我的 android 应用程序 console.log(result.data); 行,但是在 firebase 函数完全完成后调用该行,所以我的 Android 应用程序变为空。
index.js
'use strict'
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const subcheck = require('./subcheck');
admin.initializeApp();
exports.subcheck = functions.https.onCall((data, context) => {
subcheck.verifySubscription(data, context);
});
这是我的 subcheck.js
'use strict'
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const key = require('./service-account-key.json'); // JSON key file
const {google} = require('googleapis');
const authClient = new google.auth.JWT({
email: key.client_email,
key: key.private_key,
scopes: ["https://www.googleapis.com/auth/androidpublisher"]
});
const playDeveloperApiClient = google.androidpublisher({
version: 'v3',
auth: authClient
});
//admin.initializeApp(functions.config().firebase);
exports.verifySubscription = function(data, context) {
const skuId = data.sku_id;
const purchaseToken = data.purchase_token;
const packageName = data.package_name;
return authClient.authorize()
.then(function(result) {
return playDeveloperApiClient.purchases.subscriptions.get({
packageName: packageName,
subscriptionId: skuId,
token: purchaseToken
}).then(function(result) {
if (result.status === 200) {
console.log(result.data);
return {
data: result.data,
status: 200,
message: "Verified Subscription"
};
} else {
console.log("Failed to verify subscription, Try again!");
return {
data: result.data,
status: 500,
message: "Failed to verify subscription, Try again!"
};
}
})
.catch(function(error) {
console.log(error);
});
})
.catch(function(error) {
console.log(error);
});
}
这是我的 firebase 函数控制台日志:
我正在尝试使用以下方法在 Android 中获得结果:
private Task<String> checkUserSubscribed(PurchaseHistoryRecord purchase) {
Map<String, Object> mapUserPurchase = new HashMap<>();
mapUserPurchase.put("sku_id", purchase.getSku());
mapUserPurchase.put("purchase_token", purchase.getPurchaseToken());
mapUserPurchase.put("package_name", "xxxxxxx");
return mFirebaseFunctions
.getHttpsCallable("subcheck")
.call(mapUserPurchase)
.continueWith(new Continuation<HttpsCallableResult, String>() {
@Override
public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
String result = (String) task.getResult().getData();
return result;
}
}).addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
String result = task.getResult();
Toast.makeText(MainActivity.this, "func results: " + result, Toast.LENGTH_SHORT).show();
}
});
}
【问题讨论】:
-
如果
result.status === 200与否,您似乎返回相同的东西。真的是你的本意吗? `console.log(result.data);记录正确的值?另外,您能否添加用于从您的应用调用 Cloud Function 的代码? -
抱歉,这是复制粘贴问题。 console.log(result.data) 记录正确的值。我将添加控制台日志截图和我的 android 调用。
标签: javascript android node.js firebase google-cloud-functions