Skip to main content

Prérequis

Permissions de la clé API

Les abonnements utilisent les mêmes clés API HUB2 et les mêmes en-têtes ApiKey, 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 403 et le code card_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 403 et le code card_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, codes merchant_closed et merchant_suspended).
  • Un marchand parent qui possède des sous-marchands doit appeler les points de terminaison avec le MerchantId du sous-marchand. Avec son propre MerchantId, il reçoit une erreur 403 avec le code group_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é.
Créer un lien avec la 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.
Le lien est à usage unique. Il passe à 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.
N’utilisez pas les webhooks payment_links.completed ou payment_links.paid, ni une redirection vers votre successUrl, comme preuve que l’abonnement existe. Attendez le webhook subscription.created, ou listez les abonnements avec customerId égal à votre purchaseReference.

S’inscrire avec une intention d’abonnement

Inscrire un client Une intention d’abonnement se déroule en trois étapes :
  1. Créez l’intention d’abonnement depuis votre serveur.
  2. Envoyez le client vers la page de saisie de la carte, en effectuant l’action retournée par l’API.
  3. 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 si given 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 reference du consentement doit être unique au sein de votre compte marchand, sous-marchands de votre groupe compris. Un autre marchand HUB2 peut utiliser la même valeur. Utilisez un UUID, éventuellement avec un préfixe, comme dans l’exemple. Réutiliser une référence pour réessayer la même inscription du même client est sans risque. Une référence déjà utilisée pour un autre client, ou déjà inscrite pour un autre sous-marchand de votre groupe, fait échouer l’inscription avec la cause d’échec consent_reference_in_use, après que le client a terminé la page de saisie de la carte. Une référence déjà inscrite dans l’autre mode (sandbox ou live) ou, pour un sous-marchand, déjà utilisée par son marchand parent ou un autre sous-marchand, est refusée immédiatement à la création de l’intention d’abonnement, avec une erreur 409 et le code card_on_file_consent_reference_in_use.
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

Lorsque status 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.
Le client saisit sa carte, termine l’authentification 3D Secure et revient sur 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 webhook subscription.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.
Les causes d’échec propres à une inscription sont : 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.
Ce point de terminaison est limité à 5 requêtes par tranche de 5 secondes pour une même inscription. Au-delà, l’API renvoie HTTP 429 - Too Many Requests. Interrogez-le toutes les quelques secondes et arrêtez dès que le statut est successful ou failed. Consultez les limites de flux.

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’abonnements
Les filtres suivants sont disponibles : customerId (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 :
Pour un abonnement à la demande, cybersourceSubscriptionId, frequency, amount et startDate valent null.

Suspendre un abonnement

Suspendre un abonnement
Seul un abonnement active 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 abonnement
La résiliation est définitive. Elle arrête uniquement les prélèvements futurs : HUB2 ne rembourse ni ne calcule de prorata sur les montants déjà prélevés. Pour reprendre un client, inscrivez-le à nouveau.
Un abonnement active, 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 abonnement merchant_initiated au statut active peut être débité.
La réponse décrit le débit :
Les montants de la réponse, de l’historique et des webhooks sont des chaînes décimales en unités principales : un débit de 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 abonnement
L’historique liste les débits d’un abonnement, du plus récent au plus ancien, avec le même comportement de page, 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.
Pour rapprocher un événement d’un abonnement :
  • subscriptionId dans les événements est la valeur du champ cybersourceSubscriptionId de l’abonnement, et non son id.
  • transactionReference est la valeur du champ cybersourceReference du prélèvement dans l’historique des débits.
  • customerId est la customerReference de l’intention, ou la purchaseReference du lien.
  • Pour un abonnement à la demande, subscriptionId vaut null, et frequency, amount et startDate valent null dans subscription.created. Rapprochez l’événement avec customerId, et listez les abonnements de ce customerId pour obtenir l’id.
L’événement 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’environnement sandbox, 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.