PayPal Android: aceptar un pago con tarjeta de crédito / PayPal


Ejemplo

En este tutorial, aprenderemos cómo configurar el SDK de Android de PayPal para procesar un pago simple mediante un pago de PayPal o una compra con tarjeta de crédito. Al final de este ejemplo, debe tener un botón simple en una aplicación que, al hacer clic, reenviará al usuario a PayPal para confirmar un pago establecido, luego devolverá al usuario a la aplicación y registrará la confirmación del pago.

El código de aplicación completo para este ejemplo está disponible en el repositorio Github para desarrolladores de PayPal .

Empecemos.

El primer paso es obtener y agregar el SDK a su proyecto . Añadimos la referencia a nuestras dependencias de build.gradle así:

dependencies {
    compile 'com.paypal.sdk:paypal-android-sdk:2.14.1'
    ...
}

Ahora nos dirigimos a nuestro archivo MainActivity.java (o donde quiera que desee agregar la integración del botón de PayPal), y agregamos un objeto de config para la ID de nuestro cliente y el entorno (recinto de seguridad) que usaremos.

private static PayPalConfiguration config = new PayPalConfiguration()
    .environment(PayPalConfiguration.ENVIRONMENT_SANDBOX)
    .clientId("YOUR CLIENT ID");

Ahora vamos a crear un botón en nuestro onCreate(...) , que nos permitirá procesar un pago a través de PayPal una vez que se haga clic.

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button = (Button) findViewById(R.id.paypal_button);
}

Ahora necesitamos definir la funcionalidad de ese botón. En su archivo XML> res> diseño> puede agregar la siguiente definición para el botón, que definirá el texto y el controlador de clic para el botón con el ID paypal_button.

<Button android:id="@+id/paypal_button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/paypal_button"
    android:onClick="beginPayment" />

Cuando se hace clic, el botón llamará al beginPayment(...) . Luego podemos agregar el texto del botón a nuestro archivo strings.xml, de esta manera:

<string name="paypal_button">Pay with PayPal</string>

Con el botón en su lugar, ahora tenemos que manejar el clic del botón para comenzar a procesar el pago. Agregue el siguiente beginPayment(...) debajo de nuestro método onCreate(...) .

public void beginPayment(View view){
    Intent serviceConfig = new Intent(this, PayPalService.class);
    serviceConfig.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
    startService(serviceConfig);

    PayPalPayment payment = new PayPalPayment(new BigDecimal("5.65"), 
        "USD", "My Awesome Item", PayPalPayment.PAYMENT_INTENT_SALE);

    Intent paymentConfig = new Intent(this, PaymentActivity.class);
    paymentConfig.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
    paymentConfig.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
    startActivityForResult(paymentConfig, 0);
}

Lo que estamos haciendo aquí es configurar primero la intención del servicio ( serviceConfig ), utilizando la config que habíamos definido previamente para nuestra ID de cliente y el entorno de sandbox. Luego especificamos el objeto de pago que queremos procesar. Por el bien de este ejemplo, estamos estableciendo un precio, una moneda y una descripción estáticos. En su aplicación final, estos valores deben obtenerse de lo que el usuario está tratando de comprar en la aplicación. Por último, configuramos paymentConfig , agregando tanto la config como payment objetos de payment que habíamos definido previamente, y comenzamos la actividad.

En este punto, al usuario se le presentarán las pantallas de inicio de sesión y pago de PayPal, lo que les permitirá seleccionar si desea pagar con PayPal o con una tarjeta de crédito (mediante entrada manual o card.io si la cámara está disponible). Esa pantalla se verá algo así:

Pantalla de confirmación de pago de PayPal

Una vez hecho esto, debemos tener un controlador listo para cuando PayPal reenvíe al usuario a la aplicación después de la confirmación del pago o la cancelación. Vamos a anular onActivityResult(...) para ese propósito.

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data){
    if (resultCode == Activity.RESULT_OK){
        PaymentConfirmation confirm = data.getParcelableExtra(
            PaymentActivity.EXTRA_RESULT_CONFIRMATION);
        if (confirm != null){
            try {
                Log.i("sampleapp", confirm.toJSONObject().toString(4));

                // TODO: send 'confirm' to your server for verification

            } catch (JSONException e) {
                Log.e("sampleapp", "no confirmation data: ", e);
            }
        }
    } else if (resultCode == Activity.RESULT_CANCELED) {
        Log.i("sampleapp", "The user canceled.");
    } else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
        Log.i("sampleapp", "Invalid payment / config set");
    }
}

Dentro del onActivityResult(...) , estamos comprobando si el resultCode que se devuelve es RESULT_OK (pago confirmado por el usuario), RESULT_CANCELED (pago cancelado por el usuario) o RESULT_EXTRAS_INVALID (hubo un problema de configuración). En el caso de una confirmación válida, obtenemos el objeto que se devuelve del pago y, en este ejemplo, lo registramos. Lo que nos será devuelto debería ser similar al siguiente:

{
    "client": {
        "environment": "sandbox",
        "paypal_sdk_version": "2.14.1",
        "platform": "Android",
        "product_name": "PayPal-Android-SDK"
    },
    "response": {
        "create_time": "2016-05-02T15:33:43Z",
        "id": "PAY-0PG63447RB821630KK1TXGTY",
        "intent": "sale",
        "state": "approved"
    },
    "response_type": "payment"
}

Si observamos el objeto de response , podemos ver que tenemos un state de approved , lo que significa que el pago se confirmó. En este punto, ese objeto debe enviarse a su servidor para confirmar que realmente se realizó un pago. Para obtener más información sobre esos pasos, consulte estos documentos .

Nuestro último paso es limpiar nuestro onDestroy(...) .

@Override
public void onDestroy(){
    stopService(new Intent(this, PayPalService.class));
    super.onDestroy();
}

Eso es todo al respecto. En este ejemplo, hemos creado un botón simple para procesar un pago con PayPal o con una tarjeta de crédito. A partir de este punto, hay algunos pasos siguientes para que pueda ampliar esta muestra:

  • Recopilación de información de pago de forma dinámica según la selección de productos del usuario en el beginPayment(...) .
  • Enviar la confirmación de pago a su servidor y verificar que el pago realmente se realizó.
  • Manejo de los casos de error y cancelación de usuarios dentro de la aplicación.