Plusieurs boutiques
Rattacher chaque encaissement à la bonne boutique, quel que soit le moyen de paiement.
Un compte Mobupay peut porter plusieurs boutiques : deux sites de vente en ligne, un site et une enseigne, une marque par activité. Une boutique est un point de vente logique. Elle porte son nom, sa charte, son contact, et le contrat d'encaissement sur lequel ses paiements sont ventilés. Vos boutiques se créent depuis votre espace marchand, Paramètres puis Boutiques : il n'y a rien à créer par l'API.
Une clé API par site : la voie recommandée
Créez une clé API par site et rattachez-la à sa boutique au moment de la création, dans Développeur, Clés API. Installez ensuite chaque clé sur le site correspondant.
Il n'y a alors rien à transmettre dans l'appel. Une clé installée sur un site EST ce site : Mobupay rattache l'encaissement à sa boutique sans que vous ayez à écrire une ligne. C'est aussi la seule façon qui reste juste si quelqu'un modifie les réglages du module plus tard, ou si votre code de création de paiement est partagé entre plusieurs sites.
Pour savoir ce que porte une clé avant d'intégrer, appelez GET /api/v1/whoami : la réponse rend la boutique rattachée, ou null si la clé dessert tout le compte.
Une même clé pour plusieurs boutiques : le champ storeId
Quand une seule clé dessert plusieurs boutiques (un outil de gestion unique qui encaisse pour deux enseignes, par exemple), nommez la boutique à chaque création de paiement avec storeId. Le champ accepte l'identifiant de la boutique (sto_…) ou son code, celui que vos propres systèmes connaissent déjà.
Il est accepté sur les trois entrées de paiement : POST /payments/sessions, POST /payments/links et POST /payments/direct.
POST https://api.mobupay.nc/api/v1/payments/sessions
Authorization: Bearer sk_live_VOTRE_CLE
Content-Type: application/json
{
"storeId": "PAITA", <-- premier niveau, code ou sto_...
"order": { "reference": "CMD-1042", "amount": 5000, "currency": "XPF" },
"redirectUrl": "https://votre-site.nc/merci",
"notificationUrl": "https://votre-site.nc/webhook"
}Le champ est de premier niveau, jamais dans order
Placez-le à côté de externalId, pas à l'intérieur de order. L'objet order écarte les clés qu'il ne connaît pas sans rien dire : un storeId glissé dedans disparaît en silence, l'appel réussit, et le paiement part sur le contrat par défaut. Le piège a déjà coûté un complément d'adresse (street2) et un transporteur (delivery.method).
Si votre clé porte déjà une boutique, elle fait autorité : le corps peut la répéter, jamais la contredire. Nommer une autre boutique est refusé (STORE_KEY_MISMATCH).
Une boutique inconnue est refusée, jamais ignorée
Un storeId que Mobupay ne reconnaît pas fait échouer l'appel en 400. Rien n'est encaissé et rien n'est rattaché par défaut. C'est délibéré : un rapprochement faux se découvre des mois plus tard, à la clôture, alors qu'une erreur se voit une fois, en développement, et se corrige.
| Code | Quand |
|---|---|
| UNKNOWN_STORE | Aucune boutique de votre compte ne porte cet identifiant ni ce code. |
| STORE_INACTIVE | La boutique existe mais elle est désactivée. |
| STORE_KIND_MISMATCH | La boutique est déclarée point de vente physique : elle n'encaisse pas à distance. |
| STORE_CONTRACT_INACTIVE | Le contrat d'encaissement rattaché à la boutique n'est plus actif. Aucun repli silencieux sur le contrat par défaut : il changerait la plaque et la ventilation sans le dire. |
| STORE_CONTRACT_CONFLICT | L'appel et la boutique désignent deux contrats différents. |
| STORE_KEY_MISMATCH | La clé API est rattachée à une boutique, et l'appel en nomme une autre. |
En retour, la boutique retenue vous est restituée : ce qui entre ressort. Les trois réponses de création portent un objet store de la forme { id, code, name }, les webhooks payment.* et refund.* le portent aussi, et GET /payments/{id} le rend sur tout paiement. Le code y figure, pas seulement l'identifiant : c'est lui que vos systèmes reconnaissent. Sur un rejeu d'idempotence d'un lien de paiement, le champ est absent plutôt que null : rendre null affirmerait qu'il n'y a pas de boutique, alors que le lien existait déjà.
Le libellé du relevé bancaire ne vient pas du nom de la boutique
Renommer une boutique ne change pas ce que votre client lit sur son relevé. Ce libellé vient de la plaque commerciale portée par le contrat d'encaissement, pas du nom que vous donnez à la boutique. Deux boutiques qui partagent le même contrat produisent donc le même libellé.
Pour qu'une enseigne apparaisse sous son propre nom au relevé, il lui faut son propre contrat d'encaissement, que vous rattachez ensuite à sa boutique. Parlez-en au support : c'est une démarche contractuelle, pas un réglage.
En test, le contrat de la boutique est ignoré
Avec une clé sk_test_*, un seul contrat existe : celui de l'environnement de test. Le contrat rattaché à votre boutique n'est donc pas employé, et vous ne pouvez pas vérifier en test la ventilation qu'il produira en production.
Mobupay vous le dit plutôt que de vous laisser croire à une recette réussie : la réponse porte alors storeContractIgnored: true. Le rattachement à la boutique, lui, fonctionne normalement, et store vous est bien restitué. Le champ est absent en production.
{
"paymentId": "pay_2NjK8mLk0093xY",
"sessionId": "ses_BHl4xKp8mNz12Q",
"checkoutUrl": "https://checkout.mobupay.nc/session/ses_BHl4xKp8mNz12Q",
"store": { "id": "sto_7Kq2mZp4nT8xB1", "code": "PAITA", "name": "Boutique de Païta" },
"storeContractIgnored": true
}Nommer un contrat sans passer par une boutique
Usage avancé. Le champ merchantConfigId reste accepté sur les trois entrées de paiement : il désigne directement un contrat d'encaissement, sans boutique. Il s'adresse à l'intégrateur qui pilote ses contrats lui-même. La voie normale reste la boutique, qui désigne son contrat sans que vous ayez à le connaître.
Les deux ne se contredisent jamais en silence : si l'appel nomme un contrat et que la boutique en porte un autre, l'appel est refusé (STORE_CONTRACT_CONFLICT). Un arbitrage silencieux changerait la plaque du relevé et la ventilation des fonds sans que vous puissiez le savoir.
Dans les modules e-commerce
Les modules WooCommerce, PrestaShop, Magento et Odoo exposent un réglage « Boutique Mobupay » qui transmet exactement ce champ. Laissé vide, le module ne transmet rien et la clé décide : c'est le comportement recommandé quand chaque site a sa propre clé. Voir le guide Connecteurs e-commerce.