如何从[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(); } } }); }
关键改动说明
- 异步处理:通过
async/await等待Square支付API的异步请求完成,确保拿到的是实际响应而非Promise对象。 - 金额格式修正:Square的
amount_money.amount要求传入最小货币单位(比如美分),之前的1.00会被识别为1美分,改成100才是1美元,避免支付失败。 - 错误处理:统一用try/catch捕获异步错误,代码更简洁易读,同时客户端也能拿到明确的错误信息。
内容的提问来源于stack exchange,提问作者EvOlaNdLuPiZ
相关产品推荐
相关产品推荐

