安卓 : Mobile Express Checkout Library

标签 android paypal-sandbox

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

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

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

在我上面的链接中,我没有提到我的 token 和设备引用 token 。但是,我可以从 webservice 获取我的 token ,从 paypal 监听器类获取 devicereference token 。

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

更新

是的,我在我的网络服务上犯了一个错误,我已经清除了那个错误并进行了更正。现在,我可以通过Sandbox.Paypal.com成功登录我的paypal账户了。并且,付款成功转移。同时我不能使用Pay with Card 如果我选择pay with card方式,它会打开一个新窗口并显示下图-

CardError

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

Card Error

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

而且,重要的是,首次登录页面或信用卡页面的 Web View 。我的软键盘不适用于我的设备。如果控件在 web View 中的某个地方之后,只有它会被启用。不是第一次。

最佳答案

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

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);
    }

}

    }

结果委托(delegate).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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737052/

相关文章:

php - Paypal 实现 : Hidden Elements to PHP

android - 如何使用 eclipse android-junit 启动配置从测试应用程序中排除测试

android - 有没有办法从根 build.gradle 文件共享 buildTypes 和 signingConfigs?

android - 无法使 View 覆盖 FrameLayout 中的另一个 View

android - 在 Android 应用程序中集成 PayPal(MECL) 库

paypal - 如何使用 PayPal 从一个帐户向另一个帐户转账

java - 文件循环导致 Nexus 7 强制关闭,而不是 SGS2?

java - 如何在循环的服务器请求中使用 Phaser?

paypal - 结帐时,PayPal 在沙盒环境中将商户名称显示为测试商店。

php - Paypal自定义变量解决方案