MobupayMobupay
Chargement de vos clés API…

Cartes enregistrées

Proposer le paiement en un clic à vos clients qui reviennent.

La règle à retenir

La page de paiement affiche les cartes enregistrées d'un client si et seulement si la session porte un customerId au moment où elle est créée. Cette condition est évaluée à l'ouverture de la page : rien de ce qui se passe ensuite ne peut la rattraper.

1

Comprendre le cycle de vie

Une carte enregistrée appartient à un client (objet customer, identifiant cus_...), lui-même rattaché à votre compte marchand. Le portefeuille est cloisonné : les cartes d'un de vos clients ne sont jamais visibles d'un autre marchand Mobupay.

Deux façons d'obtenir ce client, et elles ne se valent pas :

Vous envoyezLe client est crééLe portefeuille s'affiche
saveCustomer: trueà la fin du paiementnon, jamais
customerId: "cus_..."déjà crééoui

saveCustomer n'est donc pas une alternative à customerId : c'est la façon d'en obtenir un, à la première commande. Un intégrateur qui s'appuie sur saveCustomer seul, commande après commande, enregistre des cartes que son client ne verra jamais, et son portefeuille se remplit de doublons de la même carte.

2

Déclarer votre intention, pas vos paramètres

Le paramétrage d'un acquéreur carte est complexe, et il n'y a aucune raison qu'il le soit pour vous. Vous déclarez ce que vous voulez faire ; Mobupay traduit, et assume les paramètres les plus favorables. Trois intentions couvrent tous les cas, et elles se déclarent par le champ intention à la création de la session.

one_offEncaisser une fois

Votre client saisit sa carte et paie. Sa carte n'est pas conservée : il la ressaisira à la prochaine commande.

Quand la choisir : Un achat ponctuel, un visiteur de passage, ou simplement quand vous ne voulez rien conserver.

one_clickLe client repaie en un clic

La carte est conservée. Votre client repaie depuis votre application en la choisissant, et confirme chaque paiement auprès de sa banque.

Quand la choisir : Une application où le client est devant l'écran au moment de payer : commande, réservation, recharge.

unscheduledVous débitez quand vous le décidez

La carte est conservée et vous la débitez selon l'usage de votre client, sans qu'il ait à valider. Sa banque l'accepte parce qu'il vous y a autorisé en enregistrant sa carte.

Quand la choisir : Une consommation facturée après coup, un abonnement, un solde à régulariser. Votre client n'est pas devant l'écran.

POST /api/v1/payments/sessions

{
  "order": { "reference": "CMD-1042", "amount": 4500, "currency": "XPF" },
  "customerId": "cus_2KmBz9aQp4nT8R",
  "intention": "one_click",
  "redirectUrl": "https://boutique.nc/merci",
  "notificationUrl": "https://boutique.nc/webhooks/mobupay"
}

Le champ est facultatif, et son absence ne change rien à vos intégrations existantes : une session qui présentera un portefeuille relève du un clic, les autres du paiement unique.

Ce que l'intention change, et qui ne se voit pas

En one_click, votre client est devant l'écran : Mobupay ouvre une authentification pour ce paiement, et sa banque peut lui demander de le confirmer. En unscheduled, il est absent : le prélèvement est présenté comme initié par vous, en s'appuyant sur l'autorisation qu'il a donnée en enregistrant sa carte. Déclarer l'une pour l'autre expose à un refus pour suspicion de fraude, et c'est la raison d'être de ce champ.

L'intention se déclare aussi depuis votre espace marchand, à la création d'un lien de paiement et à l'enregistrement d'une carte, avec les mêmes trois choix.

3

Récupérer le customerId (sans appel supplémentaire)

Le webhook payment.authorized que vous recevez déjà porte toujours le customerId :

{
  "type": "payment.authorized",
  "data": {
    "paymentId": "pay_xxxxxxxx",
    "customerId": "cus_2KmBz9aQp4nT8R",
    "customerCreated": true,
    "paymentMethodId": "pm_xxxxxxxx",
    "cardBrand": "VISA",
    "cardLast4": "4242"
  }
}

Écrivez data.customerId sur l'utilisateur concerné dans votre base, à la réception. Vous n'avez rien d'autre à appeler : la correspondance se construit toute seule au fil des commandes.

paymentMethodId vous dit en prime qu'une carte vient d'être enregistrée, et customerCreated distingue une fiche créée d'une fiche retrouvée.

4

Créer vos clients à l'avance (recommandé)

Plus robuste que d'attendre le premier paiement : créez la fiche au moment où l'utilisateur ouvre un compte chez vous.

curl -X POST https://api.mobupay.nc/api/v1/customers \
  -H "Authorization: Bearer sk_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@example.com",
    "externalId": "votre-identifiant-utilisateur",
    "firstName": "Prénom",
    "lastName": "Nom"
  }'

externalId est le champ important : c'est votre identifiant, celui que vous maîtrisez. Il vous permet de retrouver la fiche sans dépendre de l'adresse de courriel, qu'un client peut changer.

Si l'adresse ou l'externalId existe déjà, l'API répond 409 et ne renvoie pas la fiche. Retrouvez-la alors par une recherche :

GET /api/v1/customers?externalId=votre-identifiant-utilisateur
GET /api/v1/customers?email=client@example.com
5

Passer le customerId à chaque session

Première commande, client encore inconnu :

{
  "order": { "amount": 3500, "currency": "XPF", "reference": "CMD-1042" },
  "email": "client@example.com",
  "saveCustomer": true,
  "allowCustomerToSavePaymentMethod": true,
  "redirectUrl": "https://example.com/retour",
  "notificationUrl": "https://example.com/webhook"
}

Commandes suivantes, une fois que vous avez son cus_... :

{
  "order": { "amount": 2800, "currency": "XPF", "reference": "CMD-1108" },
  "customerId": "cus_2KmBz9aQp4nT8R",
  "allowCustomerToSavePaymentMethod": true,
  "redirectUrl": "https://example.com/retour",
  "notificationUrl": "https://example.com/webhook"
}
  • customerId et saveCustomer ne s'emploient pas ensemble : quand vous connaissez le client, la fiche existe déjà.
  • Gardez allowCustomerToSavePaymentMethod à true : c'est ce qui autorise le client à enregistrer une nouvelle carte, y compris quand il en a déjà.
  • La case est présentée déjà cochée. Si votre parcours exige un consentement explicite, passez savePaymentMethodCheckedByDefault à false : la case s'affiche alors vide, et seul un geste de votre client l'active.
  • Pour un utilisateur non connecté, gardez le premier format. Le mélange des deux régimes est prévu et sans danger.
  • Un cus_ de l'environnement de test ne fonctionne pas en production, et réciproquement : chaque environnement a ses propres fiches. Un identifiant qui n'appartient pas à votre compte donne une erreur 400 CUSTOMER_NOT_FOUND.
6

Vérifier

Sur une clé de test, dans cet ordre :

  1. Une première commande avec email + saveCustomer, en cochant l'enregistrement de la carte. Relevez le customerId du webhook.
  2. Une seconde commande pour le même utilisateur, avec customerId. La page doit afficher la carte enregistrée et un bouton de paiement en un clic, et non un formulaire vierge.
  3. Une troisième en enregistrant une deuxième carte : les deux doivent apparaître, et la carte par défaut être présélectionnée.

Si l'étape 2 affiche encore un formulaire vierge, le customerId n'est pas parti dans le corps de la requête : vérifiez vos journaux d'appel avant toute autre piste.

7

Exemption 3D Secure gérée par Mobupay

Sur un paiement en un clic, Mobupay peut demander à la banque du porteur de ne pas l'authentifier. C'est Mobupay qui décide, paiement par paiement, dans les limites que vous avez réglées : votre intégration n'a rien à envoyer, et aucun champ de l'API ne déclenche l'exemption.

Une exemption n'est demandée que si toutes ces conditions sont réunies :

  • le porteur paie lui-même avec une carte enregistrée (intention one_click) ;
  • la carte a déjà été authentifiée chez vous ;
  • le montant ne dépasse pas votre seuil : 100 € par défaut, 250 € au plus ;
  • la carte n'a pas atteint votre nombre de paiements exemptés sur 24 heures : 3 par défaut, 5 au plus ;
  • la carte est une carte CB, si vous gardez ce critère ;
  • aucun remboursement ni aucune contestation sur cette carte chez vous depuis 180 jours ;
  • au plus 5 % de vos paiements remboursés sur les 90 derniers jours.

Ne sont jamais exemptés : l'enregistrement d'une carte et le premier paiement qui l'enregistre, les prélèvements faits sans le porteur (intention unscheduled), et les paiements encaissés sur le contrat d'encaissement Mobupay.

La banque garde le dernier mot : elle peut accorder l'exemption, authentifier le porteur sans défi, ou lui en présenter un. Si elle refuse l'exemption, Mobupay relance une fois l'authentification, sans exemption, sur la même carte.

Un paiement exempté n'est pas authentifié : il ne bénéficie pas du transfert de responsabilité. En cas de fraude, le remboursement est à votre charge.

Le bloc authentication de la lecture d'un paiement dit ce que la banque a répondu : exempted vaut true quand elle a accordé l'exemption, et liabilityShift dit si la responsabilité a été transférée. Ces champs valent null tant que la réponse n'est pas connue.

Régler l'exemption sur votre boutique

La précaution qui compte

N'envoyez un customerId que pour un utilisateur authentifié chez vous. Il donne accès aux cartes masquées du titulaire et permet de payer avec : c'est à vous, et à vous seul, de savoir que la personne devant l'écran est bien celle-là.