Prérequis
Permissions de la clé API
Les abonnements utilisent les mêmes clés API HUB2 et les mêmes en-têtesApiKey, MerchantId et Environment que le reste de l’API. Accordez à la clé les permissions requises par les points de terminaison que vous appelez.
Clés API
Conditions du compte
- Votre marchand doit être enregistré en Côte d’Ivoire. Sinon, une intention d’abonnement est refusée avec une erreur
403et le codecard_on_file_ineligible_country. - Le card-on-file doit être activé sur votre marchand par HUB2. Sinon, une intention d’abonnement est refusée avec une erreur
403et le codecard_on_file_disabled. - Ces deux mêmes conditions s’appliquent à un lien d’abonnement. Le lien peut être créé, mais le client ne peut pas finaliser l’inscription depuis sa page.
- Un marchand fermé ou suspendu ne peut pas utiliser ces points de terminaison (
403, codesmerchant_closedetmerchant_suspended). - Un marchand parent qui possède des sous-marchands doit appeler les points de terminaison avec le
MerchantIddu sous-marchand. Avec son propreMerchantId, il reçoit une erreur403avec le codegroup_owner_transaction_forbidden. Un sous-marchand ne voit et ne gère que les abonnements qu’il a inscrits. Consultez la page sous-marchands.
Inscrire un client
L’inscription enregistre la carte du client et crée l’abonnement. Choisissez l’une des deux méthodes.S’inscrire avec un lien d’abonnement
Créer un lien d’abonnement Le lien décrit le prélèvement récurrent. Partagez avec votre client l’URL retournée dans la réponse.
Si vous omettez
successUrl ou failureUrl, le client arrive sur une page de résultat hébergée par HUB2.
La réponse est un objet lien. Le champ url est la page à partager, et status vaut active tant que le lien n’est pas utilisé ou n’a pas expiré.
purchaseReference d’un lien encore actif retourne ce lien existant au lieu d’en créer un nouveau.
Ce que voit le client
1
La page d'inscription
Le client ouvre le lien. La page affiche le nom de votre entreprise et le montant récurrent. Le client saisit une adresse e-mail, coche la case de consentement qui autorise les prélèvements récurrents, puis clique sur le bouton d’inscription.
2
La page de saisie de la carte
Le client est envoyé vers une page sécurisée pour saisir sa carte et terminer l’authentification 3D Secure. Le client n’est pas débité à cette étape.
3
Le retour
Le client revient sur votre
successUrl ou votre failureUrl.completed dès que le client a été envoyé vers la page de saisie de la carte, quel que soit le résultat final de l’authentification de la carte. Si HUB2 refuse l’inscription avant la page de saisie de la carte, le lien reste active et le client peut réessayer.
S’inscrire avec une intention d’abonnement
Inscrire un client Une intention d’abonnement se déroule en trois étapes :- Créez l’intention d’abonnement depuis votre serveur.
- Envoyez le client vers la page de saisie de la carte, en effectuant l’action retournée par l’API.
- Récupérez le résultat de l’inscription.
1. Créer l’intention d’abonnement
Recueillez le consentement du client dans votre interface avant l’appel. Le consentement est obligatoire : la requête est rejetée s’il est absent ou sigiven n’est pas à true.
Un abonnement planifié exige amount, frequency et startDate. Un abonnement à la demande n’accepte ni frequency ni startDate, car rien n’est planifié. Pour un abonnement à la demande, amount est ignoré dans l’environnement live, mais reste validé s’il est envoyé ; en sandbox, il sélectionne le résultat simulé.
L’objet
consent comporte trois champs :
La réponse contient l’identifiant du paiement d’inscription et son statut. Conservez le
paymentId : il identifie l’inscription dans les étapes suivantes.
2. Envoyer le client vers la page de saisie de la carte
Lorsquestatus vaut action_required, action a la même forme que le nextAction d’un paiement. Construisez un formulaire à partir de action.data.url, action.data.method et des champs de action.data.data, puis soumettez-le depuis le navigateur du client.
onSuccessRedirectionUrl ou onFailedRedirectionUrl. Si HUB2 n’a pas encore enregistré de résultat lorsque le client revient, celui-ci est envoyé vers l’URL d’échec. Une redirection ne suffit donc pas pour conclure : confirmez toujours le résultat avec le point de terminaison de statut ou le webhook subscription.created.
3. Récupérer le résultat de l’inscription
Récupérer le statut d’une inscription Abonnez-vous au webhooksubscription.created pour savoir que l’inscription a réussi. Aucun webhook n’est envoyé lorsqu’une inscription échoue : interrogez donc le statut de l’inscription pour détecter les échecs et les inscriptions abandonnées.
Une inscription échouée retourne un
failureCause avec un code, un message et, pour des paramètres invalides, la liste des paramètres concernés dans params.
Une inscription peut aussi échouer avec les autres causes d’échec liées à la carte, par exemple
card_declined ou card_expired. Consultez la liste complète dans Causes d’échec des paiements. Traitez les codes inconnus comme un échec générique.
Le point de terminaison de statut répond 404 lorsqu’aucune inscription portant cet identifiant n’appartient à votre marchand dans l’environnement courant.
Gérer les abonnements
Utilisez dans les points de terminaison ci-dessous l’id de l’abonnement, retourné sous le nom subscriptionId par le point de terminaison de statut de l’inscription.
Statuts d’un abonnement
Lister les abonnements
Récupérer une collection d’abonnementscustomerId (correspondance exacte avec votre référence du client), billingMode (rbs_scheduled ou merchant_initiated) et status. Les résultats sont paginés avec page (1 par défaut) et perPage (10 par défaut), et l’en-tête Content-Range indique la plage et le total.
La réponse est un tableau d’abonnements. Chaque élément ressemble à ceci :
cybersourceSubscriptionId, frequency, amount et startDate valent null.
Suspendre un abonnement
Suspendre un abonnementactive ou delinquent peut être suspendu. L’appel retourne l’abonnement mis à jour et déclenche le webhook subscription.suspended. L’API ne propose pas d’opération pour reprendre un abonnement suspendu.
Résilier un abonnement
Résilier un abonnementactive, suspended ou delinquent peut être résilié. L’appel retourne l’abonnement mis à jour et déclenche le webhook subscription.cancelled. Résilier un abonnement déjà résilié ou terminé est refusé avec une erreur 409.
Débiter un abonnement à la demande
Débiter un abonnement Seul un abonnementmerchant_initiated au statut active peut être débité.
La réponse décrit le débit :
1500 XOF renvoie "1500.00", un débit de 1500 centimes d’EUR renvoie "15.00".
indicator vaut MIT pour un prélèvement que vous ou HUB2 initiez sur la carte enregistrée, et CIT pour une opération initiée par le client.
Réessayer sans risque. La reference est votre clé d’idempotence pour un abonnement donné. Après un délai d’attente dépassé ou une erreur 5xx, renvoyez la même requête avec la même reference et le même amount : la carte n’est jamais débitée deux fois, et l’appel retourne le débit une fois son résultat connu. Réutiliser une reference avec un amount différent est refusé avec une erreur 409. Utilisez une nouvelle reference pour chaque nouveau débit.
Les débits à la demande ne déclenchent pas de webhooks payment.succeeded ou payment.failed. La réponse de l’appel et l’historique des débits donnent le résultat.
Consulter l’historique des débits
Récupérer l’historique des débits d’un abonnementpage, perPage et Content-Range que la liste des abonnements. Chaque élément comporte un id, un amount (une chaîne décimale comme "5000.00"), un status (pending, success ou failed), une transactionDate, l’indicator, et la merchantReference que vous avez envoyée pour un débit à la demande (null pour un prélèvement planifié).
Un prélèvement planifié apparaît d’abord avec le statut pending. Son statut final est défini une fois que HUB2 a confirmé le résultat, ce qui peut prendre un certain temps après la date du prélèvement.
Webhooks
Les abonnements utilisent le mécanisme habituel des webhooks. Enregistrez un point de terminaison et abonnez-vous aux événements ci-dessous. Consultez le guide d’intégration des webhooks.
L’objet
data de chaque événement contient les champs ci-dessous. Les montants sont des chaînes décimales en unités principales ("15.00" pour 15 EUR).
Important
Le
data d’un prélèvement planifié diffère du data d’un paiement ponctuel : il ne contient ni id de paiement ni intentId. Vérifiez la présence de subscriptionId avant de lire data.id : lorsqu’il est présent, l’événement est un prélèvement planifié, et un gestionnaire qui lit d’abord data.id n’obtient aucune valeur.subscriptionIddans les événements est la valeur du champcybersourceSubscriptionIdde l’abonnement, et non sonid.transactionReferenceest la valeur du champcybersourceReferencedu prélèvement dans l’historique des débits.customerIdest lacustomerReferencede l’intention, ou lapurchaseReferencedu lien.- Pour un abonnement à la demande,
subscriptionIdvautnull, etfrequency,amountetstartDatevalentnulldanssubscription.created. Rapprochez l’événement aveccustomerId, et listez les abonnements de cecustomerIdpour obtenir l’id.
payment.failed ne contient pas de cause d’échec.
Erreurs
La référence de l’API liste les codes de statut HTTP de chaque point de terminaison. Le format des erreurs est décrit dans Gestion des erreurs.Sandbox
Dans l’environnementsandbox, aucune vraie page de saisie de carte n’est affichée. Le résultat d’une inscription est simulé, et vous le lisez avec le point de terminaison de statut de l’inscription.
Pour un abonnement planifié, le amount de la requête sélectionne le résultat :
Pour un abonnement à la demande, omettez
amount pour simuler une inscription réussie. Les autres valeurs sélectionnent le résultat de la même façon que dans le tableau.