【问题标题】:PayPal Integration with AndroidPayPal 与 Android 的集成
【发布时间】:2012-06-29 09:19:57
【问题描述】:

我看到了一些相关的问题,但没有人关注我遇到的具体问题:

我正在使用 PayPal MPL 库。

我构建了我的 PayPalPayment 对象,然后创建了用于结帐的活动。运行良好。我的问题是,在 ResultDelegate 上,我需要从我的活动中调用一个函数,该函数在付款后发生并进行一些更改(例如存储 SharedPreferences 等)。

所以是这样的:

public class ResultDelegate implements PayPalResultDelegate, Serializable {
    public void onPaymentSucceeded(String payKey, String paymentStatus) {
        System.out.println("SUCCESS, You have successfully completed your transaction.");
        System.out.println("PayKey: "+payKey);
        System.out.println("PayStatus: "+paymentStatus);

        callMyCustomAfterPaymentFunction();
    }
    ...
}

现在问题是,我尝试为 ResultDelegate 创建一个构造函数来接受我的活动。我现有的代码是:

//On the activity class
public class MainMenuActivity extends Activity {
    public void onCreate(Bundle savedInstanceState)
    {
        ...
        Button buy = (Button) findViewByID(R.id.buy_button);
        buy.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v)
            {
                new PurchaseTask(activity).execute();
            }
        }
    }
}

public class PurchaseTask extends AsyncTask <String, Void, String> {
    protected String doInBackground()
    {
        ...
        PayPal pp = PayPal.getInstance();
        CheckoutButton cb = pp.getCheckoutButton(...);
        cb.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                ResultDelegate delegate = new ResultDelegate(myActivity);
                Intent checkout = PayPal.getInstance().checkout(paument, activity, delegate);
                activity.StartActivity(checkoutIntent);
            }
        }
    }
}

//On the ResultDelegate class

public class ResultDelegate implements PayPalResultDelegate, Serializable {
    private Activity myActivity;

    public void onPaymentSucceeded(String payKey, String paymentStatus) {
        System.out.println("SUCCESS, You have successfully completed your transaction.");
        System.out.println("PayKey: "+payKey);
        System.out.println("PayStatus: "+paymentStatus);

        myActivity.performAfterPaymentOperations();
    }
    ...
}

所以目标是从 ResultDelegate 调用活动函数。或者更简单,只是为了能够在 ResultDelegate onPaymentSucceeded() 触发时存储一些 SharedPreference 更改。

但我收到 NotSerializableException 提示 myActivity 字段不可序列化。

然后,我将瞬态标识符添加到 ResultDelegate 内的活动字段中,但现在我得到了 NullPointerException。

【问题讨论】:

  • 你的Delegate 是一个单独的线程吗?请张贴SSCCE。或发布您的ActivtyDelegate 代码。
  • 我想是的。 PayPal 活动是通过 Intent 调用的。 ResultDelegate 是 PayPal 类的子类,用于创建自定义类,然后在创建 PayPal 活动时用作参数。 ResultDelegate 的子类化允许您将自己的代码放在 onPaymentSucceeded() 侦听器中,该侦听器在 PayPalActivity 完成付款时触发。但是,我无法从 ResultDelegate 内部访问我的活动,这是至关重要的。代码经过编辑以提高可读性并添加了详细信息。

标签: android paypal


【解决方案1】:

Paypal Mobile Chekout guide

paypal 网站上提供的实现与您的不同。他们正在做startActivityForResult() 开始PaypalActivity。在onActivityResult() 方法中,他们正在检查statusCode 以检查事务状态并采取相应措施。

按照该文档进行实施。

在您的代码中,我没有找到使用AsyncTask 的意义。你的ResultDelegateSerializable,而Activity 并不是它抛出NotSerializableException 的原因。

编辑:

既然您正在为 Google Android 平台开发,那么为什么不使用 Google Checkout In-App?

编辑:

当您的PaypalActivity 完成时,将调用此方法。该活动会将resultCode 传递给此onActivityResult 方法。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (resultCode) {
    case Activity.RESULT_OK:
        // The payment succeeded
        String payKey = data.getStringExtra(PayPalActivity.EXTRA_PAY_KEY);
        // Tell the user their payment succeeded
        break;
    case Activity.RESULT_CANCELED:
        // The payment was canceled
        // Tell the user their payment was canceled
        break;
    case PayPalActivity.RESULT_FAILURE:
        // The payment failed -- we get the error from the EXTRA_ERROR_ID
        // and EXTRA_ERROR_MESSAGE
        String errorID = data.getStringExtra(PayPalActivity.EXTRA_ERROR_ID);
        String errorMessage = data
                .getStringExtra(PayPalActivity.EXTRA_ERROR_MESSAGE);
        // Tell the user their payment was failed.
    }
}

问候, 阿基夫·哈米德

【讨论】:

  • 您好,我正在为 Google Play 不支持的国家/地区开发。 startActivityForResult 细节似乎很有意义。我会测试它并尽快回复。
  • 好的,请检查您在编辑前刚刚在评论中提出的resultCode 变量问题的编辑。
  • 我还计划将 paypal 集成到 android 应用程序中我需要一些帮助。我使用 android paypal sdk 并使用以下链接:mayuran26.blogspot.in/2014/09/…
【解决方案2】:

您可以像这样创建自定义侦听器:

创建自定义监听器:

  OnDoubleTap mListener;

    // Double tap custome listenre to edit photoes
    public interface OnDoubleTap {
        public void onEvent(Uri imgPath, int mPos);

    }

    public void setDoubleTapListener(OnDoubleTap eventListener) {
        mListener = eventListener;

    }

现在像这样在任何你想要的地方调用它:

mListener.onEvent(Uri, 1));

现在,每当您调用此侦听器时,它都会在您使用此侦听器的活动中触发,如下所示:

myCanvas.setDoubleTapListener(new OnDoubleTap() {

        @Override
        public void onEvent(Uri imgPath, int Pos) {
            // TODO Auto-generated method stub
            Toast.makeText(mContext, "LISTENER WORKING !!!", Toast.LENGTH_SHORT).show();

        }
    });

myCanvas 是您创建侦听器的类的对象。

【讨论】:

  • 感谢您的帮助!但问题毕竟是 onActivityResult 监听器。
【解决方案3】:

试试这个解决方案:

PayPalPayment thingToBuy = new PayPalPayment(new BigDecimal(price),getResources().getString(R.string.curruncy_code), getResources().getString(R.string.app_name),
                    PayPalPayment.PAYMENT_INTENT_SALE);
            Intent intent = new Intent(CreateEventStep4.this, PaymentActivity.class);
            intent.putExtra(PaymentActivity.EXTRA_PAYMENT, thingToBuy);
            startActivityForResult(intent, REQUEST_PAYPAL_PAYMENT);

PaymentConfirmation confirm = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
            if (confirm != null) {
                try {

                    Log.e("paymentExample", confirm.toJSONObject().toString());


                    JSONObject jsonObj=new JSONObject(confirm.toJSONObject().toString());

                    String paymentId=jsonObj.getJSONObject("response").getString("id");
                    System.out.println("payment id:-=="+paymentId);

                    screenShotFile = takeScreenshot(frmTemplate);
                    uploadImage(myEvent.getEvent_id(),screenShotFile);

                } catch (JSONException e) {
                    Log.e("paymentExample", "an extremely unlikely failure occurred: ", e);
                }

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2012-06-28
    • 2020-11-12
    • 2017-10-25
    • 2017-11-25
    • 2020-10-19
    • 2011-09-25
    • 2016-01-22
    • 2015-10-08
    相关资源
    最近更新 更多