我有以下从我的Android应用中调用的用node.js编写的firebase云函数。该函数可以正常工作,但尝试在Android中获取结果时却为null。我需要返回到我的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();
}
});
}
问题很可能是由于您没有将调用的结果返回给verifySubscription()
函数的事实:
exports.subcheck = functions.https.onCall((data, context) => {
subcheck.verifySubscription(data, context);
});
您应该这样做:
exports.subcheck = functions.https.onCall((data, context) => {
return subcheck.verifySubscription(data, context);
});
[此外,您可能应该按照以下方式重新组织Promise链接,以避免嵌套对then()
的调用,请参阅更多详细信息/解释here。
exports.verifySubscription = function(data, context) {
const skuId = data.sku_id;
const purchaseToken = data.purchase_token;
const packageName = data.package_name;
return authClient.authorize()
.then(result => {
return playDeveloperApiClient.purchases.subscriptions.get({
packageName: packageName,
subscriptionId: skuId,
token: purchaseToken
})
})
.then(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);
});
}
最后,您可以查看documentation有关可调用云函数中的错误处理的信息。代替返回{data: result.data,status: 500, ...};
,您可以抛出functions.https.HttpsError
的实例。