Comment configurer des paiements récurrents

Il est probable que, à un moment donné, vous souhaitiez implémenter des paiements récurrents ou par abonnement pour un service SaaS ou autre. Heureusement, PayPal offre les outils dont nous avons besoin pour mettre en œuvre une solution de paiement par abonnement entièrement intégrée..


Ce que nous allons construire

Remarque: J'utilise Laravel dans ce tutoriel, mais vous pouvez appliquer ces concepts à d'autres langages et frameworks.

Nous allons configurer PayPal pour accepter les paiements d'abonnement et configurer notre auditeur de notification de paiement instantané (IPN). Une fois le composant d'inscription terminé, nous examinerons le processus d'annulation via l'API de PayPal. Je commence avec une application barebones Laravel avec un simple enregistrement et une connexion, et nous ajouterons les composants nécessaires pour introduire les paiements d'abonnement au fur et à mesure de l'avancement du didacticiel..


Étape 1: Configuration de vos boutons d'abonnement

PayPal fournit un champ personnalisé que nous pouvons utiliser pour transmettre l'identifiant de l'utilisateur..

Avant de commencer, assurez-vous d'avoir un compte PayPal. C'est gratuit, mais vous devez avoir un compte professionnel pour mettre en œuvre les paiements d'abonnement sur votre site..

PayPal propose plusieurs types de boutons que nous pouvons utiliser, notamment: Acheter maintenant, S'abonner et Facturation automatique. Aujourd'hui, nous allons examiner le bouton S'abonner. Les boutons d'abonnement vous permettent de définir le montant de la facture, ainsi que la période de paiement périodique. Vous pouvez également configurer une période d’essai et laisser PayPal créer le compte de l’utilisateur lorsqu’il envoie une requête ping à votre serveur..

Tout d'abord, connectez-vous à votre compte PayPal et accédez à Profil -> Mes préférences de vente. Puis cherchez le Boutons PayPal section et sélectionnez Abonnements de la liste déroulante. Assurez-vous de remplir le reste de l'information.

Je vous recommande de ne pas cocher la case "Demandez à PayPal de créer les noms d'utilisateur et les mots de passe pour les clients" et sélectionnez l'option "Utiliser mon identifiant de compte marchand sécurisé"..

Nous allons permettre aux utilisateurs de créer un compte gratuit, puis de les mettre à niveau ultérieurement..

Créez votre bouton et copiez le code généré. vous l'utiliserez dans votre application.

Passer des informations supplémentaires

Comme nous établissons un lien entre les abonnements et les comptes, nous devons savoir qui effectue un paiement. Pour ce faire, le moyen le plus simple consiste à faire correspondre l'adresse e-mail de la transaction PayPal au compte e-mail utilisé pour la connexion à notre application. Ce n'est pas infaillible, cependant, car beaucoup de gens utilisent des adresses électroniques différentes. Nous devons donc transmettre l'identifiant de l'utilisateur de notre application à PayPal..

Heureusement, PayPal fournit un champ personnalisé que nous pouvons utiliser pour transmettre l'identifiant de l'utilisateur. Sa limite est de 256 caractères. Donc, je vais utiliser une structure JSON, nous permettant de transmettre des informations supplémentaires si nous avons besoin de.

Assurez-vous de consulter la liste complète des variables HTML acceptées..


Étape 2: Préparation de votre application

Nous devons d’abord configurer notre tableau des paiements, où nous stockons nos transactions. Créons-le avec les colonnes suivantes:

  • identifiant: Un entier auto-incrémenté et notre clé primaire.
  • txn_id: Notre identifiant de transaction que PayPal nous donnera. Définir ceci comme varchar.
  • identifiant d'utilisateur: Nous allons utiliser cela pour configurer notre relation avec la table des utilisateurs, un entier fera l'affaire.
  • paypal_id: L'ID de profil PayPal dont nous aurons besoin pour gérer les annulations ultérieurement. Définir ceci comme varchar.
  • créé à: Nous l'utilisons pour voir quand la transaction est terminée et démarrer l'abonnement.

Aussi, ajoutez un abonnement colonne à votre utilisateur table. Je vais définir cela comme un entier pour permettre plusieurs niveaux: un, deux et trois pour déverrouiller des fonctionnalités supplémentaires. J'ai également créé le modèle qui nous permettra d'interagir avec le tableau des paiements..


Étape 3: Écrire votre auditeur

PayPal offre une solution simple pour nous avertir lorsqu'un paiement a été traité. ils l'appellent les notifications de paiement instantané (IPN). Pour tirer parti d'IPN, nous devons créer un auditeur IPN pour notre application. L’auditeur valide les données, les insère dans notre table des paiements et définit le niveau de souscription de l’utilisateur..

Heureusement, nous n'avons pas à réinventer la roue grâce à cette classe pratique. Nous allons utiliser le IpnListener classe pour vérifier rapidement les données, et nous pouvons ensuite traiter cela pour les insérer dans notre base de données. Avec Laravel, nous pouvons placer la classe dans notre dossier de bibliothèques, ce qui la charge automatiquement..

Créez un nouveau contrôleur ou une nouvelle route et ajoutez le code suivant:

$ listener = new IpnListener (); essayez $ vérifié = $ auditeur-> processIpn ();  catch (Exception $ e) exit (0);  if ($ vérifié) // la réponse IPN était "VERIFIED" sinon // la réponse IPN était "INVALID"

J'ai appelé mon dossier ipn.php, et je vais mapper à / ipn. N'oubliez pas que PayPal POSTERA à cette URL. donc, si vous utilisez des verbes HTTP / REST, configurez-le en conséquence. De là, nous pouvons traiter nos données:

$ listener = new IpnListener (); essayez $ vérifié = $ auditeur-> processIpn ();  catch (Exception $ e) return Log :: error ($ e-> getMessage ());  if ($ vérifié) $ data = $ _POST; $ user_id = json_decode ($ data ['custom']) -> user_id; $ subscription = ($ data ['mc_gross_1'] == '10')? 2: 1; $ txn = array ('txn_id' => $ data ['txn_id'], 'user_id' => $ user_id, 'paypal_id' => $ data ['subscr_id'], 'subscription' => $ subscription, 'expire' => date ('Ymd H: i: s', strtotime ('+ 1 mois')),); Payment :: create ($ txn);  else Log :: error ('Transaction non vérifiée'); 

Dans ce code, nous décodons d'abord le code JSON transmis à notre champ personnalisé, ce qui nous permet d'accéder facilement à l'ID utilisateur. Nous définissons ensuite le niveau d'abonnement en fonction du montant de la transaction et le stockons dans la base de données. Nous enregistrons également les erreurs en utilisant la classe Log de Laravel. Il peut également être intéressant d’envoyer un reçu à l’utilisateur, mais je vous en laisse le soin..


Étape 4: Activer IPN

Ensuite, nous devons activer IPN et configurer PayPal pour qu'il envoie une requête ping à notre auditeur. Parce que le panneau d'administration de PayPal peut être difficile à naviguer, j'ai inclus les captures d'écran suivantes pour vous guider. Aller à Profil -> Préférences de vente:

Alors cherche Notifications de paiement instantanées:

Ensuite, cliquez sur Choisissez les paramètres IPN:

Et puis entrez l'URL de votre auditeur:


Étape 5: Obtention du nom d'utilisateur, du mot de passe et de la signature de votre API

Pendant que nous sommes dans le tableau de bord, il est utile de disposer des informations d'identification de notre API avant de régler notre processus d'annulation. Aller à Profil -> Préférences de vente:

Chercher Accès API:

Sélectionner Option 2:

Demander une signature API:

Et prenez note de vos informations d'identification:


Étape 6: Traitement des annulations

Vous devez disposer d'un compte professionnel pour pouvoir effectuer les paiements d'abonnement..

Remarque: Vous allez avoir besoin d'un certificat SSL pour gérer les annulations, ou PayPal avec une erreur.

Pour offrir la meilleure expérience utilisateur possible, vous souhaiterez probablement gérer les annulations dans votre application ou votre service. PayPal fournit quelques API qui nous permettent de le faire: NVP ou SOAP. Je recommanderais d'aller avec NVP.

La documentation de PayPal semble trop compliquer les choses, mais NVP (Name-Value-Pair) est essentiellement une chaîne encodée par une URL que nous pouvons cURL.

La méthode qui nous intéresse est ManageRecurringPaymentsProfileStatus. Nous pouvons modifier l'état de l'abonnement en choisissant l'une des trois actions suivantes:

  • Annuler: Seuls les abonnements actifs ou suspendus peuvent être annulés. Le choix de cette action empêche l’utilisateur de se réactiver ultérieurement.
  • Suspendre: Seuls les abonnements actifs peuvent être suspendus. Cette action permet aux utilisateurs de réactiver leur abonnement ultérieurement.
  • Réactiver: Seuls les abonnements suspendus peuvent être réactivés, ce qui permet de rétablir l’abonnement..

Nous allons utiliser l'action cancel, car nos boutons d'abonnement créent un nouvel abonnement si l'utilisateur souhaite le réactiver ultérieurement. Donc, notre demande ressemblerait à quelque chose comme ça:

$ input = Input :: all (); $ req = array ('USER' => 'VOTRE_API_USER', 'PASSWORD' => 'VOTRE_API_PASSWORD', 'SIGNATURE' => 'VOTRE_API_SIGNATURE', 'VERSION' => 76 .0 ',' METHOD '=>' ManageRecurringPaysProfileStatus ', 'PROFILEID' => urlencode ($ input ['paypal_id']), 'ACTION' => 'Annuler', 'NOTE' => 'Utilisateur annulé sur le site Web',); $ ch = curl_init (); // Permutez-les si vous testez avec le bac à sable // curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_URL, 'https://api-3t.paypal.com/nvp'); curl_setopt ($ ch, CURLOPT_VERBOSE, 1); curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_POST, 1); curl_setopt ($ ch, CURLOPT_POSTFIELDS, http_build_query ($ req)); curl_exec ($ ch); curl_close ($ ch); renvoyer Redirect :: to ('settings') -> avec ('cancelled', true);

Nous pouvons maintenant annuler facilement l'abonnement, mais pour une raison quelconque, PayPal a choisi de ne pas envoyer de demande IPN. Ce n'est pas un problème cependant, car nous avons configuré notre application pour inclure un expire colonne. Donc, nous pouvons vérifier ce champ pour déterminer si l'utilisateur est abonné.


Étape 7: Jouer dans le bac à sable

PayPal fournit un bac à sable afin que nous puissions tester notre implémentation. Si vous ne l'avez pas utilisé auparavant, vous devrez créer un compte gratuit. À partir de là, vous pourrez tester plusieurs utilisateurs et transactions pour vous assurer que votre code fonctionne comme prévu..

Nous allons tester notre auditeur pour nous assurer qu'il fonctionne correctement sans avoir à effectuer de véritables transactions. Avant de faire quoi que ce soit dans le sandbox, nous devons configurer notre écouteur IPN pour qu'il envoie une requête ping au sandbox au lieu du serveur actif..

$ listener-> use_sandbox = true;

Maintenant, dirigez-vous vers le Sandbox PayPal, connectez-vous, cliquez sur Outils de test à gauche et ouvrez le simulateur IPN.

Entrez l'URL de votre auditeur et sélectionnez Paiement express du bas vers le bas. Vous pouvez utiliser la plupart des détails par défaut, mais n'oubliez pas de mettre votre JSON dans le champ personnalisé vers le bas de la page..


Étape 8: Vérification de l'abonnement

Nous avons donc configuré notre abonnement et autorisé les utilisateurs à annuler le service. Comment pouvons-nous vérifier cela? Laravel facilite les choses et sa méthode traduit dans de nombreux langages et frameworks. Je vais ajouter une méthode à mon Utilisateur modèle qui nous donne accès à l'abonnement en utilisant la classe Auth de Laravel:

abonnement à une fonction publique () return Payment :: where ('user_id', '=', Auth :: user () -> id) -> where ('expires', '>', date ('Ymd H: i: s ', time ())) -> first (tableau (' subscription ',' expire ',' paypal_id ',' txn_id ')); 

Nous pouvons maintenant accéder à cela et vérifier très facilement dans nos contrôleurs et vues. Par exemple:

abonnement(); if ($ sub && $ sub-> subscription == 1) echo 'Vous êtes sur le plan standard';  elseif ($ sub && $ sous-> abonnement == 2) echo 'Vous êtes sur le plan premium';  else echo 'Vous n'êtes pas abonné'; ?>

En conclusion

J'espère que ce tutoriel vous a montré à quel point il est facile de configurer des paiements récurrents ou des paiements d'abonnement dans vos applications. PayPal n’est certes pas le seul processeur de paiement, mais c’est l’un des plus reconnus et des plus utilisés..

À partir de là, vous pouvez ajouter des reçus, des rappels de paiement et des notifications d'annulation pour créer une solution entièrement intégrée..