Paypal Android SDK在onActivityResult中获取自定义值

Paypal Android SDK在onActivityResult中获取自定义值,android,android-intent,paypal,paypal-mobile-sdk,Android,Android Intent,Paypal,Paypal Mobile Sdk,我注意到添加了一个选项,可以将自定义或发票添加到PaypalPayment中。我现在可以向PaypalPayment添加一个项目和一个自定义值,如下所示: PayPalPayment payment = new PayPalPayment(new BigDecimal("1.75"), "USD", "sample item", PayPalPayment.PAYMENT_INTENT_SALE); payment.custom("my custom value");

我注意到添加了一个选项,可以将
自定义
发票
添加到PaypalPayment中。我现在可以向PaypalPayment添加一个项目和一个自定义值,如下所示:

PayPalPayment payment = new PayPalPayment(new BigDecimal("1.75"), "USD", "sample item",
            PayPalPayment.PAYMENT_INTENT_SALE);
payment.custom("my custom value");
但是,他们的文档中没有提到如何在ActivityResult中恢复此自定义值。这是我的密码:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == REQUEST_CODE_PAYMENT) {
                if (resultCode == Activity.RESULT_OK) {
                    PaymentConfirmation confirm = data
                            .getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
                    if (confirm != null) {
                        try {
//How do I get `custom` from `confirm` object here???

                            Log.e(TAG, confirm.toJSONObject().toString(4));
                            Log.e(TAG, confirm.getPayment().toJSONObject()
                                    .toString(4));

                            String paymentId = confirm.toJSONObject()
                                    .getJSONObject("response").getString("id");

                            String payment_client = confirm.getPayment()
                                    .toJSONObject().toString();

                            Log.e(TAG, "paymentId: " + paymentId
                                    + ", payment_json: " + payment_client);

                            //Payment verification logic

                        } catch (JSONException e) {
                            Log.e(TAG, "Meow! Coders ye be warned: ",e);
                        }
                    }
                } else if (resultCode == Activity.RESULT_CANCELED) {
                    Log.e(TAG, "The user canceled.");
                } else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
                    Log.e(TAG,"Invalid Payment");
                }
            }
        }
即使我使用invoice number而不是custom,似乎也没有任何方法可以从object中检索,也没有它的方法

您可以通过下面的反射获得字段,但在生产中这样做可能是一个非常糟糕的想法(首先,我不知道字段名“l”是否是稳定的,但在处理付款时,它在Android Studio调试器中具有正确的值):


请注意,您必须捕获许多异常-有关更多信息,请参阅。实际上,PayPal只需要发布一个更新的SDK,并通过getter提供对该字段的访问。同样,我无法想象在生产中实际使用它,但它至少可以在Android 4.2上工作。

我认为将自定义值存储在某个会话对象中,然后将其与
确认
JSON一起发送到服务器,并在那里用REST API验证它会更明智。我们可以在activity
destroy
lifecycle中设置一些超时或方法来清除会话对象。你觉得呢?基本上我就是这么做的。我的用例是在同一个片段上有多个PayPal按钮,因此我制作了一个HashMap,将每个按钮视图对象与我的自定义“PayPal widget”对象关联起来。当用户点击按钮时,我可以找出哪个自定义小部件(和自定义ID)与该特定按钮关联,并将其存储在片段中的“activePaypalWidget”中。然后在ActivityResult上,我可以从activePaypalWidget获取我的自定义值,在我的服务器确认调用中使用它,最后清除片段中的变量,为下一次按钮按下做准备。
Field custom = confirm.getPayment().getClass().getDeclaredField("l");
custom.setAccessible(true);
String customID = (String) custom.get(confirm.getPayment());
Log.i(TAG, customID);