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

在Poynt系统中无法从Payment Fragment传递额外数据,原因何在?

问题分析与解决方案

看起来你遇到的问题是Poynt终端框架对返回的Intent做了标准化处理,导致你自定义添加的额外参数(test、transaction、error)没有被传递到onActivityResult回调中。

为什么会这样?

Poynt的支付集成框架会统一处理支付结果的返回逻辑:当你在PaymentActivity中通过setResult返回带有Intents.ACTION_COLLECT_PAYMENT_RESULT的Intent时,终端系统会解析这个Intent里的transaction和error,然后将它们封装到一个标准的Payment对象中,再通过Intents.INTENT_EXTRAS_PAYMENT这个key传递回调用方的onActivityResult。而你自己添加的自定义参数(比如test)并不会被框架包含在这个标准化的返回Intent里,所以自然无法获取到。

解决办法

1. 利用框架提供的标准数据获取结果

你已经在代码中拿到了Payment对象,其实它已经包含了你需要的核心数据:

  • 交易信息:payment.getTransactions().get(0)就是你之前传入的transaction对象
  • 错误信息:可以通过Payment的状态(比如payment.getStatus())或者Transaction的错误字段来判断是否有支付错误,不需要依赖你自己传入的error参数

修改你的onActivityResult代码,直接从标准对象中获取数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && data != null) {
        Payment payment = data.getParcelableExtra(Intents.INTENT_EXTRAS_PAYMENT);
        Log.d("ConfigurationTest", "Received onPaymentAction from PaymentFragment w/ Status:" + payment.getStatus());
        
        if (payment.getTransactions() != null && payment.getTransactions().size() > 0) {
            Transaction transaction = payment.getTransactions().get(0);
            // 这里可以直接使用transaction对象,就是你之前在PaymentActivity中传入的那个
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            Log.d("TransactionDetails", gson.toJson(transaction));
        }
        
        // 判断是否有错误:如果resultCode是RESULT_CANCELED,或者payment的状态是FAILED等
        if (resultCode == Activity.RESULT_CANCELED) {
            // 处理支付取消/错误逻辑
        }
    }
}

2. 传递自定义数据的替代方案

如果你确实需要传递像test这样的自定义标记,可以换一种方式:

  • 在启动PaymentActivity的时候,通过Intent传入一个自定义参数(比如"test_flag")
  • 在PaymentActivity中保存这个参数,当支付完成后,将它和交易信息一起临时存储(比如用SharedPreferences或者内存缓存)
  • 在onActivityResult回调中,根据交易的唯一标识(比如transaction.getId())去读取保存的自定义数据

示例代码片段:

// 启动PaymentActivity时
Intent intent = new Intent(this, PaymentActivity.class);
intent.putExtra("test_flag", true);
startActivityForResult(intent, REQUEST_CODE_PAYMENT);

// PaymentActivity中处理支付结果时
boolean isTest = getIntent().getBooleanExtra("test_flag", false);
// 支付完成后,保存isTest和transaction的关联
SharedPreferences sp = getSharedPreferences("PaymentTemp", MODE_PRIVATE);
sp.edit().putBoolean("test_" + transaction.getId(), isTest).apply();

// onActivityResult中读取自定义数据
if (payment.getTransactions() != null && payment.getTransactions().size() > 0) {
    Transaction transaction = payment.getTransactions().get(0);
    SharedPreferences sp = getSharedPreferences("PaymentTemp", MODE_PRIVATE);
    boolean test = sp.getBoolean("test_" + transaction.getId(), false);
    Log.d("Sample", String.valueOf(test));
    // 记得用完后删除临时数据,避免冗余
    sp.edit().remove("test_" + transaction.getId()).apply();
}

总结

Poynt的支付框架会标准化返回结果的格式,所以优先使用框架提供的Payment和Transaction对象来获取支付结果。如果需要自定义数据,通过临时存储关联交易ID的方式传递是更可靠的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:25