You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从[object Promise]获取信息?基于GCF的Square支付处理问题

解决Cloud Functions调用Square支付返回[object Promise]的问题

嘿,我看你在处理Square支付时碰到了返回OK:[object Promise]的问题,这是因为你的Cloud Functions代码没有正确处理异步操作——payments_api.createPayment()是一个异步Promise,但你直接把这个Promise对象转成了字符串,自然拿不到有效数据。另外还有个容易踩坑的细节,Square的金额参数要求用最小货币单位,之前的写法也会导致支付失败,我一起帮你修正。

修正后的Cloud Functions代码

我们用async/await来处理异步请求,确保拿到支付响应后再返回结果,同时修复金额格式问题:

const functions = require('firebase-functions');
const SquareConnect = require('square-connect');
const crypto = require('crypto');

// 给函数添加async关键字,支持await语法
exports.fxtest = functions.https.onCall(async (data, context) => { 
  const defaultClient = SquareConnect.ApiClient.instance;
  defaultClient.basePath = "https://connect.squareupsandbox.com";
  const oauth2 = defaultClient.authentications['oauth2'];
  oauth2.accessToken = 'sandbox-token-ommitted';
  const idempotency_key = crypto.randomBytes(23).toString('hex');
  const payments_api = new SquareConnect.PaymentsApi();
  const item_source = data.source_id;
  // Square要求金额用最小单位,1美元=100美分,这里修正为100
  const item_price = 100; 
  const item_currency = 'USD';
  
  const request_body = {
    "idempotency_key": idempotency_key,
    "source_id": item_source,
    "amount_money": {
      "amount": item_price,
      "currency": item_currency
    }
  };

  try {
    // 用await等待支付请求完成,拿到实际响应数据
    const paymentResponse = await payments_api.createPayment(request_body);
    // 返回序列化后的响应,方便客户端解析
    return { response: 'OK:' + JSON.stringify(paymentResponse) };
  } catch(error) {
    // 捕获并返回错误信息
    return { response: 'ERROR:' + JSON.stringify(error) };
  }
});

Android端代码优化

你的Android代码基础没问题,但可以优化一下结果解析,同时处理调用失败的情况:

private FirebaseFunctions mFunctions;
private Task<HttpsCallableResult> fxtest(String text, Context ctx, CardDetails crds){
  Map<String, Object> data = new HashMap<>();
  data.put("source_id", crds.getNonce());
  
  return this.mFunctions.getHttpsCallable("fxtest").call(data)
    .addOnCompleteListener((Activity) ctx, new OnCompleteListener<HttpsCallableResult>() {
      @Override
      public void onComplete(@NonNull Task<HttpsCallableResult> task) {
        if (task.isSuccessful()) {
          // 解析返回的响应数据
          Map<String, Object> resultMap = (Map<String, Object>) task.getResult().getData();
          String responseMsg = (String) resultMap.get("response");
          Toast.makeText(ctx, "支付结果: " + responseMsg, Toast.LENGTH_LONG).show();
        } else {
          // 处理云函数调用失败的情况
          String errorMsg = task.getException() != null ? task.getException().getMessage() : "未知错误";
          Toast.makeText(ctx, "调用失败: " + errorMsg, Toast.LENGTH_LONG).show();
        }
      }
    });
}

关键改动说明

  1. 异步处理:通过async/await等待Square支付API的异步请求完成,确保拿到的是实际响应而非Promise对象。
  2. 金额格式修正:Square的amount_money.amount要求传入最小货币单位(比如美分),之前的1.00会被识别为1美分,改成100才是1美元,避免支付失败。
  3. 错误处理:统一用try/catch捕获异步错误,代码更简洁易读,同时客户端也能拿到明确的错误信息。

内容的提问来源于stack exchange,提问作者EvOlaNdLuPiZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:51:16