Android: библиотека Mobile Express Checkout - PullRequest
1 голос
/ 16 марта 2012

Я работаю в библиотеке Mobile Express Checkout Library для способа оплаты.У меня путаница с URL для перенаправления страницы входа в PayPal.И ниже ссылки, которые я уже использовал.

1 - Sandbox.Paypal.com Это дает мне страницу входа в систему и не может сделать оплату методом карты.И, если я войду в систему с помощью учетной записи PayPal, она перейдет к кнопке оплаты сейчас.После этого метод кнопки не работает.Платеж не прошел успешно.

2 - Paypal.com это вызывает внутреннюю ошибку сервера для меня.Также не отображается страница входа.

В приведенной выше ссылке я не упомянул свой токен и токен устройства.Но я могу получить свой токен из веб-сервиса и токен со ссылкой на устройство из класса слушателя PayPal.

Что я могу сделать для этого?Кто-нибудь ведет меня, если знает?Заранее спасибо.

Обновление

Да, я допустил ошибку в своем веб-сервисе, я исправил эту ошибку и исправил ее.Теперь я могу успешно войти в свою учетную запись PayPal через Sandbox.Paypal.com и платеж будет успешно переведен.В то же время я не могу использовать Pay with Card . Если я выберу метод оплаты с помощью карты, откроется новое окно с изображением ниже -

CardError

Я не знаю, почему это произошло.Если я изменю свой LandingPage = Billing в моем setExpressCheckout веб-сервисе, только я смогу просмотреть страницу Credit Card .И после заполнения реквизитов кредитной карты и т. Д., Мой платеж не был успешным.Это будет показано, как показано на рисунке ниже -

Card Error

Я изменил адрес электронной почты, когда я также заполнил данные кредитной карты.После этого всегда так видно.Что для этого сделать?Я не знаю, где я ошибаюсь.Может ли кто-нибудь помочь мне в этом, пожалуйста.

И, что важно, это первый раз, когда вы просматриваете страницу входа или страницу кредитной карты.Моя программная клавиатура не работает с моим устройством.Если после этого элемент управления перейдет в веб-просмотр, то только он будет включен.Не в первый раз.

Ответы [ 3 ]

6 голосов
/ 31 марта 2012

Я решил мою проблему тестирования через песочницу. Я приложил свой код ниже. Надеюсь, это сработает для вас.

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;
}
}
5 голосов
/ 23 марта 2012

Я решил свою проблему самостоятельно. Sandbox.Paypal.com сделал все для меня. Я допустил ошибку с моим веб-сервисом Mobile Express Checkout Library После проверки моей ошибки, она прекрасно работает для меня. Платеж получен успешно.

И проблема открытия нового окна при нажатии кнопки Pay With Card также была решена. Процесс оплаты осуществляется с помощью веб-просмотра. Когда мы используем средства веб-просмотра, ему нужно немного setWebviewClient Когда я добавил это в свой веб-просмотр, он работает нормально. Теперь я могу перейти на обе страницы логина и PayWith карты. И класс setOnTouchListener включает мою программную клавиатуру там.

Но я не пробовал с оплатой кредитной картой там. Он не будет принимать фиктивные кредитные карты. Я не знаю, почему он не принимает. Я узнаю это также скоро. И обновите это здесь.

3 голосов
/ 23 марта 2012

Я не работал над PayPal, но я предлагаю вам использовать WebViewClient. Если вы используете этот класс для веб-просмотра, вы можете перенаправить веб-страницу на обе страницы 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);
}
}
...