Caisse express sur SFCC
Ce guide fournit aux e-commerçants Salesforce Commerce Cloud (SFCC) les étapes clés pour intégrer la solution Caisse express d’Affirm à l’aide de la cartouche Affirm SFRA. Cela suppose que vous avez déjà terminé l’intégration standard d’Affirm à SFCC. Pour consulter la référence de l’API Caisse express indépendante de la plateforme, consultez la documentation officielle de la Caisse express d'Affirm.
Aperçu
La Caisse express d’Affirm est une solution hébergée par Affirm qui peut être lancée à partir de n’importe quelle page hébergée par un commerçant, sans nécessiter au préalable l’adresse d’expédition du client ni le montant final de la commande. Affirm recueille l’adresse de livraison, la méthode d’expédition et les modalités de financement au cours de son processus de paiement hébergé, puis renvoie les détails complets à votre boutique en ligne pour finaliser la commande.
Remarque : la Caisse express fonctionne en parallèle avec le mode de paiement Affirm standard sur la page de paiement, mais elle ne le remplace pas. Les clients peuvent toujours utiliser le flux de paiement traditionnel d’Affirm au moment du passage à la caisse. La Caisse express offre simplement un point d’entrée supplémentaire et plus rapide.
En quoi Affirm Express Checkout diffère d’Affirm Checkout standard
| Passage à la caisse standard | Caisse express | |
|---|---|---|
| Initié à partir de | Page de paiement (après la saisie de l’adresse) | Toute page de commerçant |
| Expédition/facturation | Perçu d’abord par le commerçant | Recueillies par Affirm pendant le processus |
| objet de paiement | Inclut shipping, billing, total | Omet ces éléments — n’envoie que items, subtotal, metadata |
| Rappel du serveur | None | Affirm appelle votre point de terminaison Expédition et totaux (de serveur à serveur) |
| Vérification HMAC | Non requis | Obligatoire pour le point de terminaison Expédition et totaux |
| Initié à partir de | Page de paiement (après la saisie de l’adresse) | Toute page de commerçant |
Disponibilité régionale
- États-Unis uniquement — toutes les transactions doivent être en USD
- L’adresse d’expédition du client doit être une adresse valide aux États-Unis
- Si vous ne livrez pas dans certaines régions des États-Unis (p. ex., Hawaï, Alaska), gérez cela à l’aide du code d’erreur
UNSUPPORTED_SHIPPING_ZONE
Comment intégrer
Conditions préalables
Avant d’activer la Caisse express, vérifiez :
- L’intégration SFRA standard d’Affirm fonctionne — les cartouches
int_affirmetint_affirm_sfrasont installées, les préférences du site sont configurées et les fonctions de paiement standard d’Affirm fonctionnent correctement. - Version de la cartouche — vous êtes sur la branche
master(ou une version ultérieure au 02/10/2026). - Configuration du compte Affirm — communiquez avec votre gestionnaire de compte technique Affirm (TAM) pour activer la Caisse express sur votre compte commerçant
- Le mode VCN est désactivé — la Caisse express n'est pas compatible avec l'intégration de numéro de carte virtuelle Affirm (VCN). La préférence de site
AffirmVCNIntegrationdoit être définie suroff. - La balise de script d'en-tête Affirm est incluse — Vérifiez que votre modèle
htmlHead.ismlcomprend le script SDK d'Affirm : . Cela fait partie de l’intégration standard et est nécessaire pour l’API JavaScriptaffirm.checkout()utilisée par Express Checkout. - Client privé SLAS configuré — Le Paiement express utilise SCAPI pour calculer les totaux d’expédition dans un contexte sans session. Cela nécessite un client privé SLAS. Consultez l’étape 2 pour les détails de configuration.
Step 1: Import Metadata
Importez les métadonnées mises à jour pour ajouter les nouvelles préférences du site et les définitions de service requises pour la Caisse express.
Téléversez metadata/affirm.zip dans votre instance à partir de Administration > Développement du site > Importation et exportation du site, puis sélectionnez-le et lancez l’importation.
Cette seule importation ajoute tout ce qui suit :
| Métadonnées | Type | Objet |
|---|---|---|
AffirmExpressCheckoutEnabled | Préférence du site (booléen) | Interrupteur principal de la Caisse express |
AffirmSCAPIShortCode | Préférence du site (chaîne) | Code court SCAPI pour votre instance |
AffirmSCAPIOrgId | Préférence du site (chaîne) | ID de l’organisation SCAPI |
AffirmSCAPISiteId | Préférence du site (chaîne) | ID de site SFCC pour les appels SCAPI |
AffirmSLASClientId | Préférence du site (chaîne) | ID client SLAS |
AffirmSLASClientSecret | Préférence du site (mot de passe) | Secret client de SLAS |
AffirmSCAPI | Profil de service | Délai d’attente de 30 s, limitation du débit pour les appels SCAPI |
affirm.slas.auth | Service | SLAS token endpoint |
affirm.scapi.basket | Service | Opérations de panier SCAPI |
affirm.checkout.read | Service | Lit les détails du paiement à partir de l’API Affirm v2 après que l’utilisateur a terminé le paiement express |
Vérifier l'importation
Après l’importation, confirmez que chaque élément de métadonnées a été créé avec succès :
- Préférences du site — Accédez à Outils du commerçant > Préférences du site > Préférences personnalisées > AFFIRM_PAYMENT. Faites défiler jusqu'au bas de la page et vérifiez que les préférences SCAPI/SLAS s'affichent.
- Services — Accédez à Administration > Opérations > Services. Vérifiez que
affirm.slas.authetaffirm.scapi.basketapparaissent dans la liste des services avec le profilAffirmSCAPIattribué.
Si certains de ces éléments sont manquants, relancez l’importation et consultez le journal d’importation pour repérer les erreurs.
Remarque : Le schéma
services.xmlexige que tous les élémentsapparaissent avant tout élément . Si vous modifiez services.xmlmanuellement, respectez cet ordre.
Étape 2 : configurer le client privé SLAS
La Caisse express utilise SCAPI (Shopper Commerce API) pour créer un panier sans session afin de calculer les frais d’expédition. Cela nécessite un client privé SLAS (Shopper Login and Activity Sequence).
Créer le client
- Assurez-vous que votre utilisateur dispose du rôle Administrateur de l’organisation SLAS dans Account Manager
- Accédez à l’IU Admin SLAS à
https://{shortCode}.api.commercecloud.salesforce.com/shopper/auth-admin/ - Cliquez sur Clients > Ajouter un client
- Sélectionnez votre instance B2C Commerce comme locataire
- Choisissez "BFF or Web App" comme type d’application (crée un client privé avec un secret généré automatiquement)
- Copiez immédiatement le secret — il ne s’affiche qu’une seule fois
- Configurez :
- Channels/Sites: votre ID de site SFCC (p. ex.,
RefArch,YourSite) - Portées :
sfcc.shopper-baskets-orders.rw,sfcc.shopper-myaccount.baskets.rw,sfcc.shopper-context.rw
- Channels/Sites: votre ID de site SFCC (p. ex.,
Important : La propagation des nouveaux clients SLAS peut prendre jusqu'à 15 minutes. Attendez avant de tester.
Testez le client
curl -X POST "https://{shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/{orgId}/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "{clientId}:{clientSecret}" \
-d "grant_type=client_credentials&channel_id={siteId}"
Une réponse réussie renvoie access_token, refresh_token et expires_in.
Étape 3 : Configurer les préférences du site
Dans Outils pour les commerçants > Préférences du site > Préférences personnalisées du site > AFFIRM_PAYMENT:
- AffirmExpressCheckoutEnabled — Réglez sur
true - AffirmSCAPIShortCode — Le code court de votre instance (p. ex.,
abcd1234). Se trouve dans BM sous Administration > Préférences globales > Paramètres SCAPI. - AffirmSCAPIOrgId — Votre ID d’organisation SCAPI (p. ex.
f_ecom_xxxx_001). Se trouve dans la même page des paramètres SCAPI. Remarque : utilisez le format complet avec le préfixef_ecom_. - AffirmSCAPISiteId — Votre identifiant de site SFCC (p. ex.,
RefArch). Doit correspondre à la valeur Channels/Sites configurée sur votre client SLAS. Laissez vide pour effectuer une détection automatique viaSite.getCurrent().getID(). - AffirmSLASClientId — L’ID client de l’étape 2
- AffirmSLASClientSecret — Le secret de l’étape 2
- Vérifiez que ces préférences existantes sont correctement configurées :
- AffirmOnline —
true - AffirmStaticJS —
Yes(nécessaire pour que le SDK Affirm puisse se charger) - AffirmPublicKey — votre clé API publique Affirm
- AffirmPrivateKey — votre clé API privée Affirm (utilisée pour la vérification HMAC)
- AffirmVCNIntegration —
off(La caisse express est incompatible avec VCN) - AffirmMode —
sandboxpour les tests,productionpour la production
- AffirmOnline —
Étape 4 : Activer l’exécution du hook API
Accédez à Administration > Préférences globales > Commutateurs de fonctionnalités et activez l’exécution du hook d’API. Ceci est requis pour le hook modifyPUTResponse qui calcule les totaux d’expédition lorsqu’une adresse de livraison est définie dans le panier SCAPI.
Étape 5 : Créer les ressources côté client
Le JavaScript côté client d’Express Checkout doit être compilé. Assurez-vous que vos chemins package.json font correctement référence à la cartouche SFRA de base, puis exécutez :
sgmf-scripts --compile jsCela compile cartridge/client/default/js/expressCheckout.js en cartridge/static/default/js/expressCheckout.js.
Si vous n’utilisez pas d’outil de compilation, vous pouvez utiliser le bundle précompilé déjà inclus à cartridge/static/default/js/expressCheckout.js.
Étape 6 : téléversez les cartouches
Téléversez les cartouches int_affirm et int_affirm_sfra sur votre instance SFCC au moyen de WebDAV ou de votre IDE préféré (p. ex. VS Code avec l’extension Prophet, Eclipse avec UX Studio). Téléversez-les dans le répertoire de la version de code active à l’emplacement suivant :
https://.demandware.net/on/demandware.servlet/webdav/Sites/Cartridges//
Ajoutez-les ensuite au chemin de cartouches de votre site dans Administration > Sites > Gérer les sites> Sélectionner votre site > Paramètres. Dans le champ Cartouches, assurez-vous que int_affirm_sfra apparaît avant int_affirm:
int_affirm_sfra:int_affirm:...existing_cartridges...
Étape 7 : Vérifier le point de terminaison Expédition et totaux
L’URL du point de terminaison Expédition et totaux est automatiquement transmise à Affirm par l’intermédiaire du champ merchant_shipping_and_totals_callback_url dans l’objet checkout. Pour empêcher l’injection d’URL de rappel malveillantes lors de la création du paiement, Affirm vérifie le nom d’hôte merchant_shipping_and_totals_callback_url par rapport à une liste de modèles de noms d’hôte attendus enregistrés pour votre compte commerçant. Seul le nom d’hôte est validé; le chemin de l’URL, les paramètres de chemin et les paramètres de requête ne sont pas vérifiés. Affirm prend en charge et encourage l’utilisation de listes d’autorisations différentes selon l’environnement, p. ex. pour les environnements de test et de production.
Pour enregistrer ou mettre à jour vos modèles de nom d'hôte autorisés, contactez votre responsable technique de compte (TAM), car ces listes d'autorisations sont configurées en interne par Affirm et ne sont pas directement accessibles ou modifiables par les commerçants.
La cartouche génère automatiquement cette URL à l’aide de URLUtils.https('Affirm-ShippingTotals'), qui correspond au nom d’hôte approprié à votre environnement (test ou production). Vous pouvez vérifier l’URL générée en consultant les journaux de débogage Caisse express pour la valeurmerchant_shipping_and_totals_callback_url .
Aperçu de l’architecture
Approche SCAPI à double panier
Le principal défi du paiement express est que le rappel Expédition et totaux d’Affirm est une requête de serveur à serveur — il n’y a pas de session de navigateur. Les paniers SFCC sont liés à une session (BasketMgr.getCurrentBasket() ne renvoie rien sans session), donc nous ne pouvons pas calculer directement les frais d’expédition sur le panier de la boutique en ligne.
La solution : créer un deuxième panier via SCAPI (Salesforce Commerce API) pendant la phase de session du navigateur. Les paniers SCAPI sont accessibles au moyen d’un jeton Bearer, et non d’une session, ce qui les rend accessibles dans le rappel S2S sans session.
Identité du jeton et jetons de rafraîchissement
Les paniers SCAPI sont associés à l’identité de l’invité qui les a créés. Un autre jeton SLAS (même provenant du même client) ne peut pas accéder au panier — il renvoie "Client non valide."
Pour résoudre ce problème sans stockage côté serveur, nous chiffrons le jeton de rafraîchissement SLAS, l’ID de panier SCAPI et l’ID d’expédition dans un paramètre opaque de la chaîne de requête (scapi) sur le merchant_shipping_and_totals_callback_url. Lors du rappel S2S, la cartouche déchiffre le paramètre, échange le jeton de rafraîchissement contre un nouveau jeton d’accès avec la même identité d’invité, et l’utilise pour accéder au panier.
Le chiffrement utilise AES avec la clé privée Affirm, de sorte que les jetons ne sont exposés ni dans les URL ni dans les journaux du serveur. Le champ order_id reste un UUID bien formé tout au long du cycle de vie du paiement.
Flux de bout en bout
Phase 1: ExpressCheckout (Browser Session — GET)
├── Get SLAS token (client_credentials) → access_token + refresh_token
├── Create SCAPI basket with storefront basket items
├── Apply coupons to SCAPI basket
├── Encrypt SCAPI IDs + refresh token → append as ?scapi= query param on callback URL
├── Store SCAPI IDs + token in session (for Cancel/Confirmation cleanup)
└── Return Affirm checkout object with clean order_id (UUID only)
Phase 2: ShippingTotals (S2S, No Session — POST)
├── Decrypt ?scapi= query param → extract basketId, shipmentId, refreshToken
├── Exchange refresh token → new access token (same guest identity)
├── Call SCAPI setShippingAddress on the SCAPI basket
├── SCAPI hooks fire (two-phase design):
│ ├── afterPUT (transactional):
│ │ ├── Iterates all applicable shipping methods
│ │ ├── For each: set method → calculate → capture totals
│ │ └── Stores results on request.custom.affirmShippingTotals
│ └── modifyPUTResponse (read-only):
│ └── Attaches results to response as c_shippingOptions + c_subtotalCents
└── Return shipping_options to Affirm
Phase 3: ExpressConfirmation (Browser Session — POST)
├── Read checkout details from Affirm API (GET /api/v2/checkout/{checkout_id})
├── Apply shipping address, billing address, shipping method to storefront basket
├── Set Affirm payment instrument
├── Recalculate basket
├── Create and place SFCC order
├── Authorize with Affirm, validate totals
├── Send confirmation email
├── Cleanup: delete SCAPI basket (best-effort)
└── Redirect to Order-Confirm page
Nouveaux points de terminaison du contrôleur
La cartouche ajoute trois nouveaux points de terminaison au contrôleur Affirm :
Affirm-ExpressCheckout (OBTENEZ)
Affirm-ExpressCheckout (OBTENEZ)- Appelé par : Navigateur (JS côté client)
- Objectif : Créer un panier SCAPI et renvoyer l’objet Affirm Checkout
- Paramètres :
pid(facultatif, pour PDP),quantity(facultatif, 1 par défaut) - Reenvois : JSON avec
checkoutObjectpour l’appelaffirm.checkout() - Ce qu’elle fait :
- Vérifie que la fonctionnalité est activée et que VCN est désactivé
- Si
pidest fourni (flux PDP) : ajoute le produit au panier de la vitrine - Gets SLAS token via
client_credentialsgrant - Crée un panier SCAPI qui reflète les articles du panier de la vitrine
- Applique les coupons du panier de la vitrine au panier SCAPI
- Chiffre les identifiants SCAPI + le jeton de rafraîchissement dans le paramètre de requête
merchant_shipping_and_totals_callback_url - Renvoie l’objet Caisse express
Affirm-ShippingTotals (POST)
Affirm-ShippingTotals (POST)- Appelé par : le système dorsal d’Affirm (serveur à serveur, sans session)
- Objectif : renvoie les options d’expédition et les totaux disponibles pour une adresse donnée
- En-têtes :
X-Affirm-Signature(HMAC-SHA512),Content-Type: application/json - Corps : {order_id, currency, shipping: { line1, city, state, zipcode, country }}
- Renvois : JSON avec un tableau
shipping_options(chaque élément contenantshipping_type,shipping_label,shipping_amount,tax_amount,total) - Ce qu’elle fait :
- Vérifie la signature HMAC-SHA512 de l’en-tête
X-Affirm-Signature - Déchiffre l’ID du panier SCAPI, l’ID d’expédition et le jeton de rafraîchissement à partir du paramètre de requête
scapi - Échange le jeton de rafraîchissement contre un jeton d’accès (même identité d’invité)
- Normalise le code de pays (
USA→US) - Valide l’adresse d’expédition (États-Unis seulement)
- Appelle SCAPI
setShippingAddresssur le panier SCAPI - Le hook
modifyPUTResponsecalcule les options d’expédition pour toutes les méthodes applicables - Renvoie HTTP 200 avec les options, ou HTTP 422 avec les codes d’erreur
- Vérifie la signature HMAC-SHA512 de l’en-tête
Remarque: Affirm envoie le code de pays au format ISO 3166-1 alpha-3 (p. ex.,
"USA"). La cartouche normalise automatiquement ce code au format alpha-2 (p. ex.,"US") pour assurer la compatibilité avec SCAPI.
Affirm-ExpressConfirmation (POST)
Affirm-ExpressConfirmation (POST)- Appelé par : redirection du navigateur depuis Affirm après que l’utilisateur a terminé son paiement
- Parameter:
checkout_token - Ce qu’elle fait :
- Lit les détails du passage en caisse à partir de l’API Affirm via
GET /api/v2/checkout/{checkout_id} - Applique l’adresse d’expédition, l’adresse de facturation, le mode d’expédition et le courriel au panier
- Recalcule les totaux du panier
- Autorise la transaction avec Affirm
- Crée et passe la commande SFCC
- Envoie un courriel de confirmation
- Nettoie le panier SCAPI (dans la mesure du possible)
- Redirige vers la page
Order-Confirm
- Lit les détails du passage en caisse à partir de l’API Affirm via
Crochets d’extensibilité
La cartouche expose quatre points d’extension HookMgr facultatifs permettant à une cartouche de commerçant de personnaliser le comportement Caisse express sans créer de branche dérivée à partir de ce code. Chacun est protégé par HookMgr.hasHook — si l’un d’eux n’est pas implémenté, le comportement par défaut s’applique. Enregistrez les implémentations dans le hooks.json de votre propre cartouche.
app.affirm.express.modifyShopperContextBody
app.affirm.express.modifyShopperContextBody- Appelé par :
scapiBasket.setShopperContext, avant le PUT de contexte client SCAPI (Phase 1,Affirm-ExpressCheckout) - Objectif : ajouter ou remplacer des champs dans le corps du contexte de l’acheteur envoyé à SCAPI (p. ex.
effectiveDateTime,assignmentQualifiers.store,couponCodes) afin que les promotions de la vitrine et les critères de groupe de clients se déclenchent à nouveau correctement dans le panier SCAPI miroir - Paramètres :
body(l’objet de requête de contexte de l’acheteur),basket(la vitrinedw.order.Basket) - Renvois : le corps modifié
app.affirm.express.prefilterPossibleShippingMethods
app.affirm.express.prefilterPossibleShippingMethods- Appelé par : le
afterPUTdu hook SCAPIshippingAddressTotals, avant la bouclecalculatepour chaque méthode (phase 2,Affirm-ShippingTotals) - Objectif: limiter les objets
dw.order.ShippingMethodpris en compte pour une adresse donnée avant que les totaux ne soient calculés pour chacun d'eux (p. ex. exclure le ramassage en magasin ou les méthodes limitées à une région). Filtrer ici plutôt que dans app.affirm.express.filterShippingMethods donne accès à moins de renseignements (montants), mais présente l'avantage de réduire la latence globale en évitant un appel SCAPI. - Paramètres :
applicableShippingMethods(dw.util.Collectionsurdw.order.ShippingMethod),basket,shipment,shippingAddress(OrderAddressWO) - Renvoie: la collection réduite, Remarque : si vous créez une nouvelle liste, renvoyez une véritable dw.util.Collection
app.affirm.express.filterShippingMethods
app.affirm.express.filterShippingMethods- Appelé par :
Affirm-ShippingTotals, une fois les options d’expédition calculées - Objectif: supprimer, réorganiser ou modifier le libellé des options d'expédition déjà calculées avant leur renvoi à Affirm
- Paramètres :
shippingOptions(tableau de {shipping_type, shipping_label, shipping_amount, tax_amount, total}),shippingAddress(Object) - Renvois : le tableau modifié
app.affirm.express.overrideErrorMessage
app.affirm.express.overrideErrorMessage- Appelé par :
Affirm-ShippingTotals, pour toute réponse d'erreur - Objectif : personnaliser le message pour un code d’erreur Affirm donné
- Paramètres :
errorCode(string) - Renvois : le message à utiliser. Ce message ne sera pas nécessairement affiché au client — l’interface d’Affirm contrôle la présentation finale.
Nouveaux fichiers
| Fichier | Cartouche | Objet |
|---|---|---|
scripts/scapi/slasAuth.js | int_affirm | Obtention du jeton SLAS (client_credentials + refresh_token autorisations) |
scripts/scapi/scapiBasket.js | int_affirm | CRUD du panier SCAPI (créer, définir l’adresse, appliquer un coupon, supprimer) |
(modified) | int_affirm | Ajoute getExpressCheckout() (crée l’objet Express Checkout) et getSubtotal() |
(modified) | int_affirm | Ajoute readCheckout() — récupère les détails du paiement à partir de l'API Affirm v2 lors d'ExpressConfirmation |
scripts/hooks/scapi/shippingAddressTotals.js | int_affirm_sfra | modifyPUTResponse hook — calcule tous les totaux des méthodes d’expédition |
scripts/hooks.json (modified) | int_affirm_sfra | Enregistre le hook SCAPI |
controllers/Affirm.js (modified) | int_affirm_sfra | Ajoute les points de terminaison ExpressCheckout, ShippingTotals et ExpressConfirmation (voir Nouveaux points de terminaison du contrôleur ci-dessous) |
scripts/checkout/affirmOrderFinalize.js (modified) | int_affirm_sfra | Logique commune de finalisation de commande (configure le paiement, autorise, crée et passe la commande) utilisée par les confirmations standard et Express |
Intégration de modèle
Le cartridge comprend le positionnement des boutons prêt à l’emploi sur les pages PDP et du panier. Si votre vitrine utilise les modèles SFRA standard, les boutons s’afficheront automatiquement une fois la fonctionnalité activée.
How It Works
Button template: templates/default/affirm/expressCheckoutButton.isml
Ce modèle est rendu de manière conditionnelle — il ne s’affiche que lorsque :
AffirmExpressCheckoutEnabledesttrueAffirmOnlineesttrueAffirmVCNIntegrationn’est pason
Placements préconfigurés :
| Page | Modèle modifié | Emplacement du bouton |
|---|---|---|
| Page de détails du produit | templates/default/product/productDetails.isml | Après le bouton « Ajouter au panier » |
| Page du panier | templates/default/cart/cart.isml | Avant les boutons de caisse |
Chargement du script : templates/default/common/scripts.isml charge le bundle expressCheckout.js lorsque Caisse express est activé.
Personnalisation du placement des boutons
Si votre vitrine remplace les modèles SFRA par défaut, vous devez inclure manuellement le bouton de paiement express. Ajoutez l’inclusion ISML suivante à l’endroit où vous souhaitez que le bouton apparaisse :
Sur la page PDP :
<isinclude template="affirm/expressCheckoutButton" />Une fois ces valeurs pdict définies :
<isset name="pageType" value="product" scope="pdict"></isset> <isset name="expressPid" value="${product.id}" scope="pdict"></isset> <isset name="expressQuantity" value="${product.selectedQuantity}" scope="pdict" />Dans le panier :
<isinclude template="affirm/expressCheckoutButton" />Avec :
<isset name="pageType" value="cart" scope="pdict" />Personnalisation de l’apparence du bouton
Le bouton prend en charge des attributs d’apparence facultatifs au moyen de pdict.expressButtonAttrs :
<isset name="expressButtonAttrs" value="${{
theme: 'dark',
shape: 'pill',
size: 'lg',
buttonText: 'Checkout with Affirm'
}}" scope="pdict" />Ces éléments correspondent aux attributs data-theme, data-shape, data-size et data-button-text du conteneur du bouton, utilisés par la méthode affirm.ui.checkoutButton.render() du SDK Affirm.
Actualisation des boutons après les mises à jour AJAX
Si votre vitrine met à jour dynamiquement le contenu de la page au moyen d’AJAX (p. ex. les changements de quantité dans le panier, "Afficher plus" dans les résultats de recherche), vous devez appeler affirm.ui.refresh() après la mise à jour du DOM pour afficher de nouveau les éléments d’interface Affirm, y compris les boutons Caisse express. Il s’agit de la même exigence que pour la messagerie promotionnelle Affirm.
// In your cart.js or wherever you handle AJAX cart updates:
success: function (data) {
// ... update cart HTML ...
if (typeof affirm !== 'undefined') {
affirm.ui.refresh();
}
}Dépannage
Problèmes courants
| Problème | Cause | Corriger |
|---|---|---|
| Le bouton Caisse express ne s'affiche pas | AffirmOnline ou AffirmExpressCheckoutEnabled est faux, ou AffirmStaticJS est No | Activez les trois dans les préférences du site |
| SLAS auth returns 401 | ID/secret du client incorrect, ou client pas encore propagé | Vérifiez que les identifiants correspondent à l’IU Admin de SLAS. Attendez 15 minutes pour les nouveaux clients. |
| ShippingTotals renvoie « Client invalide » | Un nouveau jeton SLAS ne peut pas accéder au panier créé par un autre jeton | Assurez-vous que le paramètre de requête chiffré scapi est présent dans l’URL de rappel et se déchiffre correctement |
| ShippingTotals renvoie "Ressource introuvable" | Chemin de l’URL SCAPI incorrect | Vérifiez shipping-address (trait d’union) et non shipping_address (trait de soulignement) |
Affirm renvoie RPC_ERROR_SHIPPING_OPTIONS_INVALID_MERCHANT_RESPONSE | Non-correspondance du code de pays ou erreur de format de la réponse | Affirm envoie des codes de pays alpha-3 (p. ex., "USA"); le cartridge les normalise en alpha-2 pour SCAPI. Vérifiez que la réponse correspond au schéma attendu par Affirm. |
hooks.json erreur : "Le chemin vers les hooks doit être relatif" | Le chemin du script de crochet utilise */cartridge/... plutôt qu’un chemin relatif | Utilisez ./hooks/scapi/shippingAddressTotals (par rapport à hooks.json) |
L’importation de services.xml échoue | <service-profile> éléments après <service> éléments | Déplacez tous les profils avant les services dans le XML |
Fichiers journaux
| Fichier journal | accepte |
|---|---|
custom-Affirm-*.log | Journaux du contrôleur Affirm et du module SCAPI |
service-affirm-scapi-*.log | Détails de l’appel de service du panier SCAPI |
service-affirm-slas-*.log | Détails de l’appel d’authentification SLAS |
customerror-*.log | Erreurs non traitées |
Activez le journal des communications pour les services affirm.scapi.basket et affirm.slas.auth dans Administration > Opérations > Services afin d’assurer la journalisation complète des requêtes/réponses HTTP.
Mis à jour 15 days ago