从 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 firebase 函数返回到应用程序

从 onCall firebase 云函数返回一个字符串

从 firebase 可调用函数接收返回的数据

从android中的firebase函数接收json数据给出空值

在从函数返回之前等待 Firebase 加载

Firebase 函数不返回数据