从 Firebase 函数返回数据到 Android [重复]
Posted
技术标签:
【中文标题】从 Firebase 函数返回数据到 Android [重复]【英文标题】:Return data to Android from Firebase Function [duplicate] 【发布时间】:2021-06-21 22:09:19 【问题描述】:我正在尝试做的事情:只需从 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();
);
/* ... */
我是初学者,所以很可能会犯一些愚蠢的错误。 :)
【问题讨论】:
【参考方案1】:根据您的代码目前的样子,您混合了来自 Callable Cloud Function 和旧 HTTP Request Cloud Function 的代码。
要从可调用的云函数返回数据,您应该返回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
中输入wrap any errors。
将这些结合在一起得到:
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
来限制对该功能的访问。您不会想向错误的客户收费。
【讨论】:
以上是关于从 Firebase 函数返回数据到 Android [重复]的主要内容,如果未能解决你的问题,请参考以下文章