【问题标题】:Android : Mobile Express Checkout LibraryAndroid : 移动快速结账库
【发布时间】:2012-04-01 23:36:13
【问题描述】:

我正在开发用于付款方式的移动快速结帐库。我对重定向贝宝登录页面的网址有些困惑。而且,下面的链接是我已经使用过的。

1 - Sandbox.Paypal.com 它给了我登录页面,不能用卡支付。而且,如果我使用贝宝帐户登录意味着,它会立即支付按钮。之后,此按钮方法不起作用。付款未成功。

2 - Paypal.com 它为我引发了内部服务器错误。它也不显示登录页面。

在我上面的链接中,我没有在那里提到我的令牌和设备参考令牌。但是,我可以从 webservice 中获取我的令牌,并从 paypal 监听器类中获取 devicereference 令牌。

我可以为此做些什么?有知道的人指导一下吗?提前致谢。

更新

是的,我的网络服务出错了,我已经清除并纠正了这个错误。现在,我可以通过Sandbox.Paypal.com 成功登录我的paypal 帐户,并且付款成功转移。同时我不能使用刷卡支付 如果我选择刷卡方式,它会打开一个新窗口并显示下图 -

我不知道为什么会这样。如果我在 setExpressCheckout 网络服务中更改了我的 LandingPage = Billing,则只有我可以查看 Credit Card 页面。而且,在填写信用卡详细信息等详细信息后,我的付款没有成功。它会显示如下图 -

我在填写信用卡详细信息时也更改了电子邮件地址。之后,它总是这样显示。为此该怎么办?我不知道在哪里弄错了。谁能帮我解决这个问题。

而且,重要的是,第一次浏览登录页面或信用卡页面。我的软键盘无法与我的设备配合使用。如果控件之后进入 web 视图中的某个位置,则只有它会被启用。不是第一次。

【问题讨论】:

  • 诸如“此电子邮件地址已经有一个 Paypal 帐户”之类的消息让我认为您以某种方式发送该数据作为注册,而不是登录。

标签: android paypal-sandbox


【解决方案1】:

我已经解决了我通过沙盒进行测试的问题。我在下面附上了我的代码。希望它对你有用。

Android_PP_Test1Activity.java

 package com.PageViewerTilesDemo.src;

 import java.math.BigDecimal;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.Toast;

import com.paypal.android.MEP.CheckoutButton;
import com.paypal.android.MEP.PayPal;
import com.paypal.android.MEP.PayPalPayment;

public class Android_PP_Test1Activity extends Activity implements
    OnClickListener, OnItemSelectedListener, OnMultiChoiceClickListener,
    OnDismissListener {

private CheckoutButton launchPayPalButton;
final static public int PAYPAL_BUTTON_ID = 10001;
private static final int request = 1;
private ProgressDialog _progressDialog;
private boolean _paypalLibraryInit = false;
private boolean _progressDialogRunning = false;
private ImageView imgView;
public static Context contex;
public static boolean back = false;

public static String resultTitle;
public static String resultInfo;
public static String resultExtra;
private int _value = 100; // some default value that is not index

protected static final int INITIALIZE_SUCCESS = 0;
protected static final int INITIALIZE_FAILURE = 1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.paypal);
    contex = getApplicationContext();
    /*
     * if (_paypalLibraryInit) {
     * 
     * showPayPalButton();
     * 
     * 
     * } else { // Display a progress dialog to the user and start checking
     * for when // the initialization is completed
     * 
     * Thread initThread = new Thread(initLibraryRunnable);
     * initThread.start();
     * 
     * _progressDialog = new ProgressDialog(Android_PP_Test1Activity.this);
     * _progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
     * _progressDialog.setMessage("Loading PayPal Payment Library");
     * _progressDialog.setCancelable(false); _progressDialog.show();
     * _progressDialogRunning = true; Thread newThread = new
     * Thread(checkforPayPalInitRunnable);
     * 
     * newThread.start();
     * 
     * }
     */

    Thread libraryInitializationThread = new Thread() {
        public void run() {
            initLibrary();

            if (PayPal.getInstance().isLibraryInitialized()) {
                hRefresh.sendEmptyMessage(INITIALIZE_SUCCESS);
            } else {
                hRefresh.sendEmptyMessage(INITIALIZE_FAILURE);
            }
        }
    };
    libraryInitializationThread.start();
}

// This handler will allow us to properly update the UI. You cannot touch
// Views from a non-UI thread.
Handler hRefresh = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        Log.i("Paypal", "Inside Handler message");
        switch (msg.what) {
        case INITIALIZE_SUCCESS:
            Log.i("Paypal",
                    "Inside Handler message inside Initialize Success");
            showPayPalButton();
            break;
        case INITIALIZE_FAILURE:
            Log.i("Paypal", "Inside Handler message Failure");
            showFailure();
            break;
        }
    }
};

public void showFailure() {
    /*
     * title.setText("FAILURE");
     * info.setText("Could not initialize the PayPal library.");
     * title.setVisibility(View.VISIBLE); info.setVisibility(View.VISIBLE);
     */
    Log.i("Paypal", "in Failure");
}

public void showPayPalButton() {
    Log.i("Paypal", "Inside Show Paypal Button");
    removePayPalButton();
    // Back in the UI thread -- show the "Pay with PayPal" button
    // Generate the PayPal Checkout button and save it for later use
    PayPal pp = PayPal.getInstance();
    // get the checkoutbutton
    launchPayPalButton = pp.getCheckoutButton(
            Android_PP_Test1Activity.this, PayPal.BUTTON_194x37,
            CheckoutButton.TEXT_PAY);
    // add it to layout
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    // position this at the bottom
    params.addRule(RelativeLayout.CENTER_IN_PARENT);
    // some margins for visual goodness
    params.bottomMargin = 5;
    params.leftMargin = 50;

    launchPayPalButton.setLayoutParams(params);
    launchPayPalButton.setId(PAYPAL_BUTTON_ID);
    launchPayPalButton.setOnClickListener(Android_PP_Test1Activity.this);

    ((RelativeLayout) findViewById(R.id.RelativeLayout01))
            .addView(launchPayPalButton);
}

/*
 * this method removes the PayPal button from the view
 */
private void removePayPalButton() {
    Log.i("Paypal", "Inside removePayPalButton method");
    // Avoid an exception for setting a parent more than once
    if (launchPayPalButton != null) {
        ((RelativeLayout) findViewById(R.id.RelativeLayout01))
                .removeView(launchPayPalButton);
    }
}

/*
 * method to handle PayPal checkout button onClick event - this must be
 * called from the onClick() method implemented by the application
 */
public void PayPalButtonClick(View v) {
    Log.i("Paypal", "Inside PayPalButtonClick method");
    PayPalPayment newPayment = new PayPalPayment();
    newPayment.setSubtotal(new BigDecimal(50));
    newPayment.setCurrencyType("USD");
    newPayment.setRecipient("Rec_1332742330_biz@openxcelltechnolabs.com");
    newPayment.setMerchantName("MANTRA");

    Intent checkoutIntent = PayPal.getInstance().checkout(newPayment, this,
            new ResultDelegate());
    // Use the android's startActivityForResult() and pass in our
    // Intent.
    // This will start the library.
    /*
     * AlertDialog alertDialog = new AlertDialog.Builder(this).create();
     * alertDialog.setTitle("Message");
     * alertDialog.setMessage("You have already purchased this item!");
     * alertDialog.show();
     */
    this.startActivityForResult(checkoutIntent, request);

    // Intent paypalIntent = PayPal.getInstance().checkout(newPayment,
    // this);
    // this.startActivityForResult(paypalIntent, 1);

}

/** init method **/
public void initLibrary() {
    Log.i("Paypal", "Inside initLibrary method");
    PayPal pp = PayPal.getInstance();
    if (pp == null) {
        // This is the main initialization call that takes in your Context,
        // the Application ID, and the server you would like to connect to.
        pp = PayPal.initWithAppID(this, "APP-80W284485P519543T",
                PayPal.ENV_SANDBOX);

        // -- These are required settings.
        pp.setLanguage("en_US"); // Sets the language for the library.
        // --

        // -- These are a few of the optional settings.
        // Sets the fees payer. If there are fees for the transaction, this
        // person will pay for them. Possible values are FEEPAYER_SENDER,
        // FEEPAYER_PRIMARYRECEIVER, FEEPAYER_EACHRECEIVER, and
        // FEEPAYER_SECONDARYONLY.
        pp.setFeesPayer(PayPal.FEEPAYER_EACHRECEIVER);
        // Set to true if the transaction will require shipping.
        pp.setShippingEnabled(true);
        // Dynamic Amount Calculation allows you to set tax and shipping
        // amounts based on the user's shipping address. Shipping must be
        // enabled for Dynamic Amount Calculation. This also requires you to
        // create a class that implements PaymentAdjuster and Serializable.
        pp.setDynamicAmountCalculationEnabled(false);
        // --
        // _paypalLibraryInit = true;

        // if dialog is running, close it
        /*
         * if (_progressDialog.isShowing()) { _progressDialog.dismiss();
         * _progressDialogRunning = false; }
         */
    }
}

// PayPal Activity Results. This handles all the responses from the PayPal
// Payments Library
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    Log.i("Paypal", "Inside onActivityResult method");
    // AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    if (requestCode != request)
        return;
    SharedPreferences myPrefs = this.getSharedPreferences("myPrefs",
            MODE_WORLD_READABLE);
    SharedPreferences.Editor prefsEditor = myPrefs.edit();
    Log.i("Paypal", "Inside onActivityResult method");
    Log.i("Paypal", " Purchase " +Firstpage.purchase);
    if (Firstpage.purchase) {
        prefsEditor.putString("PURCHASE", "TRUE");
        prefsEditor.commit();
        Toast.makeText(Android_PP_Test1Activity.contex,
                "You have successfully completed your Transaction.",
                Toast.LENGTH_LONG).show();
    }else{
        prefsEditor.putString("PURCHASE", "FALSE");
        prefsEditor.commit();
    }


    if (back) {
        Intent intent1 = new Intent(Android_PP_Test1Activity.this,
                SampleTitlesDefault.class);
        startActivity(intent1);
        finish();
    }

}

/*
 * This method handles the PayPal Activity Results. This handles all the
 * responses from the PayPal Payments Library. This method must be called
 * from the application's onActivityResult() handler
 */
public void PayPalActivityResult(int requestCode, int resultCode,
        Intent intent) {
    Log.i("Paypal", "Inside PayPalActivityResult method");
    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setTitle("Test...");
    alertDialog.setMessage("This is your ID " + resultCode);
    alertDialog.show();

}

/**********************************
 * PayPal library related methods
 **********************************/

// This lets us show the PayPal Button after the library has been
// initialized
final Runnable showPayPalButtonRunnable = new Runnable() {

    public void run() {
        showPayPalButton();
    }
};

// This lets us run a loop to check the status of the PayPal Library init
final Runnable checkforPayPalInitRunnable = new Runnable() {
    public void run() {
        checkForPayPalLibraryInit();
    }
};

// This lets us run the initLibrary function
final Runnable initLibraryRunnable = new Runnable() {
    public void run() {
        initLibrary();
    }
};

// This method is called if the Review page is being loaded but the PayPal
// Library is not
// initialized yet.
private void checkForPayPalLibraryInit() {

    Log.i("Paypal", "Inside checkForPayPalLibraryInit method");

    // Loop as long as the library is not initialized
    while (_paypalLibraryInit == false) {
        try {
            // wait 1/2 a second then check again
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // Show an error to the user
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Error initializing PayPal Library")
                    .setCancelable(false)
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    // Could do anything here to handle the
                                    // error
                                }
                            });
            AlertDialog alert = builder.create();
            alert.show();
        }
    }
    // If we got here, it means the library is initialized.
    // So, add the "Pay with PayPal" button to the screen
    runOnUiThread(showPayPalButtonRunnable);
}

public void onDismiss(DialogInterface dialog) {
    // TODO Auto-generated method stub

}

@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
    // TODO Auto-generated method stub

}

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {
    // TODO Auto-generated method stub

}

public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onClick(View v) {
    if (v == (CheckoutButton) findViewById(PAYPAL_BUTTON_ID)) {
        PayPalButtonClick(v);
    }

}

    }

ResultDelegate .java

 package com.PageViewerTilesDemo.src;

import java.io.Serializable;

import android.content.SharedPreferences;
import android.util.Log;

import com.paypal.android.MEP.PayPalResultDelegate;

public class ResultDelegate implements PayPalResultDelegate, Serializable {

private static final long serialVersionUID = 10001L;


public void onPaymentSucceeded(String payKey, String paymentStatus) {
    Log.i("Result Delegate","Inside opPaymentSucceedde");
    Android_PP_Test1Activity.resultTitle = "SUCCESS";
    Android_PP_Test1Activity.resultInfo = "You have successfully completed your transaction.";
    Android_PP_Test1Activity.resultExtra = "Key: " + payKey;
    Firstpage.purchase=true;
    Android_PP_Test1Activity.back=true;
//  Toast.makeText(Android_PP_Test1Activity.contex,"You have successfully completed your transaction.", Toast.LENGTH_LONG);
    /*Intent intent = new Intent(ResultDelegate.this,
            SampleTitlesDefault.class);
    startActivity(intent);*/
}

public void onPaymentFailed(String paymentStatus, String correlationID,String payKey, String errorID, String errorMessage) {
    Android_PP_Test1Activity.resultTitle = "FAILURE";
    Android_PP_Test1Activity.resultInfo = errorMessage;
    Android_PP_Test1Activity.resultExtra = "Error ID: " + errorID + "\nCorrelation ID: "
            + correlationID + "\nPay Key: " + payKey;
    Android_PP_Test1Activity.back=true;
}

public void onPaymentCanceled(String paymentStatus) {
    Android_PP_Test1Activity.resultTitle = "CANCELED";
    Android_PP_Test1Activity.resultInfo = "The transaction has been cancelled.";
    Android_PP_Test1Activity.resultExtra = "";
    Android_PP_Test1Activity.back=true;
}
}

【讨论】:

  • 没看到我的问题?我在这里要求Mobile Express Checkout Library 而不是Mobile payment Library 我已经完成了那个方法。谢谢你回答我。
  • @Bhavesh hii 你能告诉我用信用卡支付吗?
  • @Bhavesh Patadiya 您能帮我解决当前的问题吗?
【解决方案2】:

我没有在paypal工作过,但是我建议你使用WebViewClient如果你使用这个类来webview,你可以将网页重定向到paypal的两个页面。

public class HelloWebViewClient extends WebViewClient
{
public HelloWebViewClient()
{
// do nothing
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}

@Override
public void onPageFinished(WebView view, String url)
{
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
}

【讨论】:

    【解决方案3】:

    我自己解决了我的问题。 Sandbox.Paypal.com 为我做了一切。我在Mobile Express Checkout Library 的网络服务上犯了一个错误之后,验证我的错误它对我来说非常适合。支付成功。

    而且,我们点击刷卡按钮时打开新窗口的问题也已经解决了。使用网络视图进行的付款过程。当我们使用 web-view 方式时,它需要一些 setWebviewClient 当我将它添加到我的 web-view 时它工作正常。现在,我可以访问登录页面和支付卡页面。而且,setOnTouchListener 类在那里启用了我的软键盘。

    但是,我没有尝试在那里使用信用卡付款。它不接受虚拟信用卡。我不知道为什么它不接受。我也会很快发现这一点。而且,在这里更新。

    【讨论】:

    • 你好@praveen 我已经完成了贝宝。但现在我用 paypal_MECL 替换它。我要遵循哪些步骤???
    猜你喜欢
    • 2012-07-01
    • 2012-09-13
    • 2018-04-15
    • 2013-05-04
    • 2012-10-13
    • 2014-04-15
    • 2017-03-12
    • 2013-05-17
    • 2015-06-15
    相关资源
    最近更新 更多