在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
相关产品推荐
相关产品推荐

