Tutoriel – Intégration de PayPal à Android

16 août 2016 / Tutoriel / 25 commentaires

Intégrer facilement PayPal à votre application Android !

Aujourd'hui nous allons voir comment implémenter PayPal dans une application Android. PayPal nous fournit un SDK complet qui nous permet d’effectuer des paiements via un compte PayPal ou directement via une carte de crédit. Le SDK va également nous permettre d’avoir une certaine sécurité et un contrôle sur les paiements effectués.

Utilisation de PayPal Developers

D'abord, rendez-vous sur PayPal Developers et créez un compte : PayPal Developers.

Nous allons aller dans la partie "Accounts" de PayPal et créez un compte acheteur et un compte vendeur. Ils vont nous permettre de tester notre appli : PayPal Accounts.

Cliquez sur "Create account", nous arrivons sur la page de création d’un compte. Rentrez une adresse email, un mot de passe, un nom et un prénom, et pour finir mettez 1000$ (parce que vous êtes riche) sur le compte acheteur. Faites de même pour le compte vendeur.

Ensuite, nous allons aller dans le Dashboard : Paypal Dashboard, scrollez jusqu’à "REST API apps" et cliquez sur "Create App".

tuto-paypal-creer-app

Rentrez le nom de votre App et choisissez le compte vendeur que vous venez de créer. Vous allez arriver directement sur la vue "Edit" de votre App. Scrollez jusqu’à "SandBox App Settings" :

tuto-paypal-sandbox-app-settings

Cochez les cases "PayPal Here" et "Log In with PayPal", cliquez ensuite sur "Advanced options".

tuto-paypal-advanced-option

Comme vous pouvez le voir j’ai coché toutes les cases, ceci indique que notre App pourra avoir accès à toutes les informations de l’utilisateur. Ceci est nécessaire pour certaines fonctionnalités du SDK de PayPal que je vais présenter dans la suite du tutoriel.

Nous en avons fini avec la partie PayPal developers, nous allons pouvoir passer à Android.

Intégration du SDK

Pour commencer, ajouter le SDK de PayPal au projet, avec cette ligne de code :

compile 'com.paypal.sdk:paypal-android-sdk:2.14.4'

Pour la suite, nous allons ajouter 3 boutons à notre fichier XML :

<Button
    android:id="@+id/buyItBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Buy a Thing" />

<Button
    android:id="@+id/futurePaymentBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Future Payment Consent" />

<Button
    android:id="@+id/profileSharingBtn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Profile Sharing Consent" />

Le premier bouton va nous permettre de faire un simple paiement, le second à envoyer les informations de paiement d’un l’utilisateur à notre serveur et le dernier à simplement envoyer les informations personnelles de l’utilisateur aux serveurs.

Passons maintenant à l’activité. Pour commencer nous allons configurer la librairie :

private static final String CONFIG_ENVIRONMENT = PayPalConfiguration.ENVIRONMENT_SANDBOX;
private static final String CONFIG_CLIENT_ID = "votre ID";
private static final int REQUEST_CODE_PAYMENT = 1;
private static final int REQUEST_CODE_FUTURE_PAYMENT = 2;
private static final int REQUEST_CODE_PROFILE_SHARING = 3;

private static PayPalConfiguration config = new PayPalConfiguration()
    .environment(CONFIG_ENVIRONMENT)
    .clientId(CONFIG_CLIENT_ID)
    .merchantName("Example Merchant")
    .merchantPrivacyPolicyUri(Uri.parse("https://www.example.com/privacy"))
    .merchantUserAgreementUri(Uri.parse("https://www.example.com/legal"));

La première variable CONFIG_ENVIRONMENT est réglée sur le mode Sandbox. Après vos tests, il faudra passer cette variable en ENVIRONMENT_PRODUCTION, ce qui permettra à votre application de déplacer de l’argent réel.

Dans la deuxième variable, copiez-collez l’id de votre App :

tuto-paypal-id

Déclarons maintenant nos boutons et assignons-les à une fonction :

findViewById(R.id.buyItBtn).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        PayPalPayment thingToBuy = new PayPalPayment(new BigDecimal("0.01"), "USD", "sample item",
        PayPalPayment.PAYMENT_INTENT_SALE);
        Intent intent = new Intent(MainActivity.this, PaymentActivity.class);
        intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
        intent.putExtra(PaymentActivity.EXTRA_PAYMENT, thingToBuy);
        startActivityForResult(intent, REQUEST_CODE_PAYMENT);
    }
});

findViewById(R.id.futurePaymentBtn).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, PayPalFuturePaymentActivity.class);
        intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
        startActivityForResult(intent, REQUEST_CODE_FUTURE_PAYMENT);
    }
});
findViewById(R.id.profileSharingBtn).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, PayPalProfileSharingActivity.class);
        intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
        intent.putExtra(PayPalProfileSharingActivity.EXTRA_REQUESTED_SCOPES, getOauthScopes());
        startActivityForResult(intent, REQUEST_CODE_PROFILE_SHARING);
    }
});

Et pour finir avec le onCreate, nous allons lancer le service PayPal.

Intent intent = new Intent(this, PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
startService(intent);

Ajoutons la fonction getOauthScopes(), elle va nous permettre de récupérer les informations des utilisateurs :

private PayPalOAuthScopes getOauthScopes() {
    Set scopes = new HashSet(Arrays.asList(PayPalOAuthScopes.PAYPAL_SCOPE_EMAIL, PayPalOAuthScopes.PAYPAL_SCOPE_ADDRESS));
    return new PayPalOAuthScopes(scopes);
}

Nous allons maintenant déclarer onActivityResult, qui va nous permettre de traiter les résultats des boutons.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_PAYMENT && resultCode == Activity.RESULT_OK) {
        PaymentConfirmation confirm = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
        if (confirm != null) {
            try {
                Log.i(TAG, confirm.toJSONObject().toString(4));
                Log.i(TAG, confirm.getPayment().toJSONObject().toString(4));
                //TODO: envoyer 'confirm' et si possible confirm.getPayment() à votre server pour la vérification
                Toast.makeText(getApplicationContext(), "PaymentConfirmation info received from PayPal", Toast.LENGTH_LONG).show();
            } catch (JSONException e) {
                Log.e(TAG, "an extremely unlikely failure occurred: ", e);
            }
        }
    } else if (requestCode == REQUEST_CODE_FUTURE_PAYMENT && resultCode == Activity.RESULT_OK) {
        PayPalAuthorization auth =
        data.getParcelableExtra(PayPalFuturePaymentActivity.EXTRA_RESULT_AUTHORIZATION);
        if (auth != null) {
            String authorization_code = auth.getAuthorizationCode();
            sendAuthorizationToServer(auth);
        }
    } else if (requestCode == REQUEST_CODE_PROFILE_SHARING && resultCode == Activity.RESULT_OK) {
        PayPalAuthorization auth = data.getParcelableExtra(PayPalProfileSharingActivity.EXTRA_RESULT_AUTHORIZATION);
        if (auth != null) {
            String authorization_code = auth.getAuthorizationCode();
            sendAuthorizationToServer(auth);
        }
    }
}

Dans le deuxième et troisième cas, lorsque l’utilisateur a terminé, nous appelons la fonction sendAuthorizationToServer(auth), dans laquelle vous devez envoyer le code d’autorisation à votre serveur. Grâce à ce code, vous allez pouvoir générer des tokens que vous allez alors stocker dans votre serveur. Ceci va permettre à l’utilisateur de ne pas avoir à se relogger la prochaine fois qu’il va effectuer un paiement dans votre App.

Et pour finir ce tuto, vous allez devoir stopper le service PayPal dans onDestroy() :

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

Il ne vous reste plus qu’à tester !

Tous les paiements effectués au sein de l'application vont s'afficher dans la partie des notifications du site de PayPal, PayPal Notifications. Notez qu'un petit temps est nécessaire avant que les paiements apparaissent.


Qu'avez vous pensé de cet article ?

FacebookTwitterLinkedInPinterestViadeo

1 commentaire

  1. Thomas dit :

    26 février 2017 à 22 h 02 min

    Cet article m’a vraiment aidé quel travail de qualité, quelle clarté, merci


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

*

Baptiste Vaudey

Développeur chez huco

Catégorie Tutoriel.

Même catégorie

Le scribing : une nouvelle façon de prendre des notes
Tutoriel - Connexion à un compte Facebook via Android
Tutoriel – Connexion à un compte Google via Android