从Firebase函数将数据返回到Android



我要做的是:只需从Firebase Cloud Function返回数据。

该功能用于在支付网关的服务器中创建支付订单。

我所需的订单详细信息数据显示在function(err,data)中(见下文(,但我需要将这些数据发送回我的Android应用程序。

我面临的问题:我可以看到Firebase控制台日志中打印的数据,但它不会返回到我的Android应用程序。

我的Firebase云功能:

const functions = require("firebase-functions");
exports.order = functions.https.onCall((amnt, response) => {
const Ippopay = require('node-ippopay');
const ippopay_instance = new Ippopay({
public_key: 'YOUR_PUBLIC_KEY',
secret_key: 'YOUR_SECRET_KEY',
});

ippopay_instance.createOrder({
amount: amnt, 
currency: 'DOLLAR',
payment_modes: "cc,dc,nb,cheque",
customer: {
name: "Test",
email: "test@gmail.com",
phone: {
country_code: "42",
national_number: "4376543210"
}
}
}, function (err, data) {
return data.order.order_id;
});
});

我的Android客户端代码:

public class Payment extends AppCompatActivity implements IppoPayListener {
Button pay;
EditText amount;
private FirebaseFunctions mFunctions;
TextView order_data;
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
}

@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
pay=findViewById(R.id.pay_button);
amount=findViewById(R.id.user_amount);
order_data=findViewById(R.id.data_text);
pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("PAY Button clicked", "yes");
mFunctions = FirebaseFunctions.getInstance("us-central1");

mFunctions.getHttpsCallable("order").call(5).continueWith(new Continuation<HttpsCallableResult, Object>() {
@Override
public Object then(@NonNull Task<HttpsCallableResult> task) throws Exception {
HttpsCallableResult result=task.getResult();
if(result !=null)
{
data=result.getData().toString();
return result.getData().toString();
}
return null;
}
});
order_data.setText(data);
onPaymentClick();
}
});
}

/* ... */
}

我是初学者,所以很有可能会犯一些愚蠢的错误。:(

根据您的代码目前的样子,您可以混合使用可调用云函数和旧的HTTP请求云函数的代码。

要从可调用的云函数返回数据,您应该返回Promise,这是一种运行异步代码并返回值的方法。旧的JavaScript和许多其他语言使用回调,这就是您在这里所拥有的。

在最简单的形式中,这种基于回调的方法:

someModule.doSomething(input, function (err, result) {
// check for errors and handle result
});

将使用转换为使用Promises

new Promise((resolve, reject) => {
someModule.doSomething(
input,
(err, result) => err ? reject(err) : resolve(result) // short form of "if error, reject with an error, otherwise resolve (succeed) with result"
)
});

为了让客户端正确处理错误,您需要将任何错误包装在functions.https.HttpsError中。

将这些结合起来可以得到:

const functions = require("firebase-functions");
exports.order = functions.https.onCall((amnt, context) => {
const Ippopay = require('node-ippopay');
return new Promise((resolve, reject) => {
const ippopay_instance = new Ippopay({
public_key: 'YOUR_PUBLIC_KEY',
secret_key: 'YOUR_SECRET_KEY',
});

ippopay_instance.createOrder({
amount: amnt, 
currency: 'DOLLAR',
payment_modes: "cc,dc,nb,cheque",
customer: {
name: "Test",
email: "test@gmail.com",
phone: {
country_code: "42",
national_number: "4376543210"
}
}
}, function (err, data) {
if (err) {
// something went wrong, send error back to caller
reject(new functions.https.HttpsError('unknown', 'Ippopay threw an unexpected error', err));
return;
}

// successful, send data back to caller
resolve(data.order.order_id);
}); 
});
});

您还应该确保使用context.auth来限制对此函数的访问。你不会想给错误的客户开账单的。

最新更新