Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Firebase函数向Android返回数据_Android_Node.js_Firebase_Google Cloud Functions - Fatal编程技术网

从Firebase函数向Android返回数据

从Firebase函数向Android返回数据,android,node.js,firebase,google-cloud-functions,Android,Node.js,Firebase,Google Cloud Functions,我想做的是:只需从Firebase云函数返回数据 该功能用于在支付网关的服务器中创建支付订单 我所需的订单详细信息数据显示在函数(err,data)(见下文)中,但我需要将这些数据发送回我的Android应用程序 我面临的问题:我可以看到Firebase控制台日志中打印的数据,但它不会返回到我的Android应用程序 我的Firebase云功能: const functions=require(“firebase函数”); exports.order=functions.https.onCall

我想做的是:只需从Firebase云函数返回数据

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

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

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

我的Firebase云功能:

const functions=require(“firebase函数”);
exports.order=functions.https.onCall((amnt,response)=>{
常量Ippopay=require('node-Ippopay');
const ippopay_实例=新ippopay({
公钥:“您的公钥”,
秘钥:“你的秘钥”,
});
ippopay_instance.createOrder({
金额:新台币,
货币:美元,
付款方式:“抄送、跟单信用证、nb、支票”,
客户:{
名称:“测试”,
电子邮件:“test@gmail.com",
电话:{
国家代码:“42”,
国家注册号:“4376543210”
}
}
},函数(错误,数据){
返回data.order.order\u id;
});
});
我的Android客户端代码:

公共类支付扩展AppCompatActivity实现IppoPayListener{
按钮工资;
编辑文本量;
私有FirebaseFunctions MFFunctions;
text查看订单数据;
字符串数据;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
}
@凌驾
后期创建时受保护的无效(@Nullable Bundle savedInstanceState){
super.onPostCreate(savedInstanceState);
pay=findviewbyd(R.id.pay\u按钮);
金额=findViewById(R.id.user\u金额);
订单数据=findviewbyd(R.id.data\u文本);
pay.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.d(“点击支付按钮”、“是”);
mFunctions=FirebaseFunctions.getInstance(“us-central1”);
mFunctions.getHttpScalable(“order”).call(5).continueWith(newcontinuation()){
@凌驾
然后公共对象(@NonNull任务)引发异常{
HttpScalableResult=task.getResult();
如果(结果!=null)
{
data=result.getData().toString();
返回result.getData().toString();
}
返回null;
}
});
order_data.setText(数据);
onPaymentClick();
}
});
}
/* ... */
}

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

根据当前代码的外观,您可以混合使用a和旧版本的代码

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

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

someModule.doSomething(input, function (err, result) {
  // check for errors and handle result
});
将通过以下方式转换为使用承诺:

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"
  )
});
要让客户端正确处理错误,您需要在一个

将这两者结合起来,可以得到:

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);
    }); 
  });
});
您还应确保使用来限制对此功能的访问。你不会想给错误的客户开账单的