worldline Direct
S'inscrire

Introduction

Pour créer des paiements, vous devez lier votre serveur à notre plateforme via l'une de nos modes d'intégration.
Notre bibliothèque SDK Node.js est la solution idéale pour se connecter à notre plateforme si vous préférez le faire avec votre propre système autonome utilisant le langage Node.js.

En choisissant le SDK Node.js, vous pouvez :

Pour tirer pleinement parti de ce SDK, assurez-vous de répondre à ces exigences :

  • Node.js 18 ou supérieur

Installez la dernière version du SDK Node.js en utilisant le gestionnaire de packages NPM en exécutant :

npm i onlinepayments-sdk-nodejs

Trouvez plus de détails sur GitHub. Consultez également tous les objets et propriétés SDK disponibles dans notre Référence complète de l'API. Une fois prêt, lisez les chapitres suivants sur la préparation et l'utilisation du SDK.

Ce guide fournit un aperçu général des fonctionnalités du SDK. Pour voir comment elles fonctionnent précisément pour les différentes modes d'intégration, consultez les guides dédiés expliquant chaque étape avec des exemples de code complets :

Ciblez l'URL de base de l'API la plus à jour

Nous vous encourageons à toujours cibler l'URL de base de l'API la plus à jour lors de l'envoi de requêtes à notre plateforme. Consultez notre guide dédié pour un aperçu complet.

Pour vous permettre une transition en douceur, les anciennes URL de base de l'API restent disponibles jusqu'à nouvel ordre.

Initialisation

Pour connecter votre système à notre plateforme en utilisant le SDK, vous devez d'abord l'initialiser.

L'initialisation du SDK nécessite de

Après l'initialisation, vous pouvez commencer à traiter les transactions via votre PSPID. Apprenez comment cela fonctionne dans le chapitre dédié.

Jetez un œil aux exemples de code de deux méthodes de connexion couvrant les étapes mentionnées ci-dessus :


const onlinePaymentsSdk = require('onlinepayments-sdk-nodejs');

const directSdk = onlinePaymentsSdk.init({
    integrator: '[your-company-name]', // used for identification in logs
    host: 'payment.preprod.direct.worldline-solutions.com', // Note: Use the endpoint without the /v2/ part here. This endpoint is pointing to the TEST server
    scheme: 'https', // default
    port: 443, // default
    enableLogging: true, // defaults to false
    logger: logger, // if undefined console.log will be used
    apiKeyId: '[your-api-key-id]',
    secretApiKey: '[your-secret-api-key]'
});

Le tableau suivant fournit un aperçu des arguments acceptés par les instances individuelles :

Propriétés
  • string merchantId : Votre PSPID dans notre environnement de test / environnement de production. Assurez-vous d'utiliser la API Key / API Secret correcte avec le PSPID correspondant pour votre requête de transaction.
  • string apiKey : La clé API que vous avez définie dans votre PSPID à laquelle vous enverrez les transactions.
  • string apiSecret : Le API Secret que vous avez défini dans votre PSPID à laquelle vous enverrez les transactions
    Consultez notre guide dédié pour tout savoir sur la API Key / API Secret .
  • string apiEndpoint : Il contient un lien vers notre environnement de test ou de production où vos demandes de transaction sont envoyées.
  • string integrator : Votre nom (entreprise) ou tout identifiant unique. Nous pouvons utiliser la valeur pour déboguer et suivre les demandes que vous avez envoyées à notre plateforme. Par conséquent, nous vous suggérons fortement d'envoyer une valeur qui nous permet de facilement identifier vos demandes dans nos journaux.

Après avoir initialisé le SDK, vous pouvez envoyer des requêtes à notre plateforme via votre PSPID. Apprenez comment le faire dans le prochain chapitre.

Comme nos SDK intègrent toujours la dernière version de notre API, vous pouvez omettre le paramètre "v2" dans votre code, comme montré dans l'exemple ci-dessus.

N'oubliez pas de prêter attention à la correspondance entre l'environnement et les clés. La API Key et le API Secret sont différents pour les environnements de test et de production.

Le chemin complet des endpoints API est

  • environnement de test: https://payment.preprod.direct.worldline-solutions.com/v2/
  • environnement de production: https://payment.direct.worldline-solutions.com/v2/

Si vous êtes prêt à passer à l'environnement de production, remplacez le lien du endpoint apiEndpoint = 'https://payment.preprod.direct.worldline-solutions.com/' par le lien de l'environnement de production apiEndpoint = 'https://payment.direct.worldline-solutions.com/'

Pour les transactions sans impact financier, utilisez le endpoint de test. Les transactions seront envoyées à notre environnement de test, et donc à votre compte de test.

Pour les transactions avec impact financier, utilisez le endpoint de production. Les transactions seront envoyées à notre environnement de production, et donc à votre compte de production.

Utiliser le SDK

Après l'initialisation réussie de l'instance de directSdk, vous avez un accès complet à notre API RESTful. Cela vous permet de :

  • Envoyer des demandes pour de nouvelles transactions pour l'une de nos modes d'intégration côté serveur.
  • Obtenir le statut actuel de vos transactions.
  • Effectuer des demandes de maintenance (c'est-à-dire, captures, remboursements) sur des transactions existantes.

La version la plus récente de notre SDK renvoie également le chemin complet dans redirectURL, vous permettant de ne pas concaténer l'URL de base "https://payment." avec partialRedirectURL. Apprenez-en plus dans notre guide Hosted Checkout Page.

Consultez nos cas de test sur GitHub, y compris des exemples de code complets, et notre référence complète de l'API pour découvrir ce qui est possible.

Ci-dessous, vous trouverez certaines des actions les plus courantes que vous pouvez effectuer :

Créer de nouvelles transactions

Pour créer une nouvelle transaction, vous pouvez utiliser une instance de directSdk pour l'une de nos modes d'intégration. Cela peut être fait par :

  • Routage de la demande vers votre PSPID sur notre plateforme (pour directSdk).
  • Création d'une demande pour les modes d'intégration respectives.

L'instance du SDK ne garde en mémoire que les données utilisées pour l'initialiser. Elle ne suit ni les sessions actives ni les demandes précédentes. Votre système est responsable de la gestion des sessions et des paiements Direct.

Les sessions et les paiements n'ont pas d'impact sur les autres sessions et paiements.

Assurez-vous que la méthode de paiement que vous souhaitez utiliser est activée dans votre compte de test/production. Vérifiez cela dans le Merchant Portal via Entreprise > Moyens de paiement.

Vous utilisez le Back Office ?
Vous pouvez vérifier le statut d'activation de la méthode de paiement via Configuration > Activation PM.

Obtenir le statut d'une transaction

Notre API RESTful vous permet de demander le statut d'une transaction à tout moment via l'un de nos appels GET :

Une requête GetPaymentDetails ressemble à ceci :


const merchantId = "PSPID";
const sdkResponse = await directSdk.payments.getPaymentDetails(merchantId, 'PAYMENT_ID',{});
Propriétés
string PAYMENT_ID : La référence unique de votre transaction sur notre plateforme. Cette référence peut être récupérée à partir de directSdk.payments.createPayment()
ou directSdk.hostedCheckout.createHostedCheckout() créés dans la section précédente.

Pour plus d'informations sur les statuts, consultez la page de documentation des statuts.

Effectuer une opération de maintenance

Pour effectuer des actions de suivi sur les transactions existantes (ex. : captures ou remboursements), utilisez respectivement notre appel API CapturePayment ou RefundPayment :

CapturePayment


/* 
 *…. Initialisation....
 */
const merchantId = "PSPID";
const sdkResponse = await directSdk.payments.capturePayment(
merchantId,
"PAYMENT_ID",
{
amount: 2980,
isFinal: true,
},
{}
);

RefundPayment

/*  
 *…. Initialisation.... 
 */ 
 
const merchantId = "PSPID";
const sdkResponse = await directSdk.payments.refundPayment(
merchantId,
"PAYMENT_ID",
{
amountOfMoney: {
currencyCode: "EUR",
amount: 1,
},
},
{}
);
Propriétés
string PAYMENT_ID : La référence unique de votre transaction sur notre plateforme. Cette référence peut être récupérée à partir de directSdk.payments.createPayment() ou directSdk.hostedCheckout.createHostedCheckout() créés dans la section précédente.

Vous pouvez spécifier une returnUrl facultatif, qui sera utilisée pour rediriger votre client vers votre site web.


/* 
 *…. Initialisation....
 */

const merchantId = "PSPID";
const sdkResponse= await directSdk.hostedCheckout.createHostedCheckout(
merchantId,
{
order: {
amountOfMoney: {
currencyCode: "USD",
amount: 2345,
},
customer: {
merchantCustomerId: "1234",
billingAddress: {
countryCode: "US",
},
},
},
hostedCheckoutSpecificInput: {
variant: "testVariant",
locale: "en_GB",
},
},
{}
);

Cet appel renvoie une réponse CreateHostedCheckoutResponse. Stockez le hostedCheckoutId et le RETURNMAC qu'il contient, ainsi que toute autre information pertinente pour vous. Vous en aurez besoin pour les étapes décrites dans les chapitres suivants.

Cette réponse contient également une partialRedirectURL.

Vous devez concaténer l'URL de base "https://payment." avec partialRedirectURL selon la formule

https://payment. + partialRedirectURL

et effectuer une redirection de votre client vers cette URL. Une fois que le client visite le Hosted Checkout Page, le processus de paiement continue là-bas.

Hosted Tokenization Page

Pour utiliser cette méthode d'intégration, vous devez


// Initialisation

const merchantId = "PSPID";
const sdkResponse = await directSdk.hostedTokenization.createHostedTokenization(
merchantId,
{
askConsumerConsent: true,
locale: "en_GB",
variant: 'YOUR_TEMPLATE.html',
}, 
{}
);

À partir de sdkResponse, récupérez hostedTokenizationId et partialRedirectUrl. Utilisez partialRedirectUrl pour l'iframe et hostedTokenizationId ou tokenId (voir encadré d'information) pour créer le paiement réel via la méthode d'intégration Server-to-server.

Vous pouvez envoyer soit le tokenID, soit le hostedTokenizationId dans votre requête CreatePayment. Apprenez-en davantage sur l'utilisation de chaque option dans les chapitres dédiés de notre guide sur la Hosted Tokenization Page :


// Initialisation

const merchantId = "PSPID";
const sdkResponse = await directSdk.payments.createPayment(
merchantId,
{
cardPaymentMethodSpecificInput: {
card: {
cvv: "123",
cardNumber: "4567350000427977",
expiryDate: "1220",
cardholderName: "Wile E. Coyote",
},
token: 'TOKEN_FROM_HOSTED_TOKENIZATION_RESPONSE',
},
order: {
amountOfMoney: {
currencyCode: "EUR",
amount: 2980,
},
},
},
  {}
);

Server-to-server

Une réponse de paiement minimale paymentResponse nécessite au moins de définir un objet Order et une méthode de paiement :


// The example object of the AmountOfMoney
const merchantId = "PSPID";
const sdkResponse = await directSdk.payments.createPayment(
merchantId,
{
cardPaymentMethodSpecificInput: {
card: {
cvv: "123",
cardNumber: "4567350000427977", // // Find more test data here
expiryDate: "1220",
cardholderName: "Wile E. Coyote",
},
paymentProductId: 3,
},
order: {
amountOfMoney: {
currencyCode: "EUR",
amount: 2980,
},
},
},
{}
);

Nous avons des guides dédiés pour chacune des modes d'intégration mentionnées ci-dessus :

Les documents contiennent tous les détails essentiels dont vous avez besoin pour profiter pleinement du potentiel des modes d'intégration, y compris les flux de transactions complets, des exemples de code et d'autres fonctionnalités utiles.

Gérer les exceptions

Si une transaction est rejetée, notre plateforme fournit des informations détaillées avec une instance d'Exception. Le code HTTP status associé vous aide également à résoudre l'erreur.

Vous pouvez rencontrer deux types d'exceptions : exceptions de transaction et exceptions HTTP.

Exceptions de transaction

Ce type d'exception concerne les demandes de transaction qui sont techniquement correctes mais qui ont été rejetées par l'émetteur de votre client ou par votre acquéreur. Si la transaction est renvoyée dans l'exception, cela signifie qu'elle a été créée dans nos systèmes mais n'a pas été traitée avec succès.

Les exemples de code suivants utilisent des méthodes implicites fournies à titre d'exemple. Vous êtes censé fournir votre propre implémentation pour celles-ci ou les remplacer par une logique similaire :

Type d'exception /
Code de statut HTTP
Exemple de code
Transactions rejetées /
Divers (voir l'objet PaymentResponse)
// Initialisation
const merchantId = "PSPID";
let paymentId = null;
try {
paymentId = directSdk.payments.createPayment(merchantId, {}, {});
} catch (error) {
console.error(error);
return;
}

const payment = await directSdk.payments.getPayment(merchantId, paymentId, {});

if (isNotSuccessful(payment)) {
handleError(payment);
}
Remboursement rejeté /
Divers (voir l'objet PaymentResponse)
// Initialisation
const merchantId = "PSPID";
const payId = "PAY_ID";
let refundId = null;
try {
refundId = await sdkInstance.payments.refundPayment(
merchantId,
payId,
{
amountOfMoney: {
currencyCode: "EUR",
amount: 1,
},
},
{}
);
} catch (error) {
console.error(error);
return;
}
const refunds = await directSdk.refunds.getRefunds(merchantId, payId, {});
if (isNotSuccessful(refunds, refundId)) {
handleError(refunds);
}

Exceptions HTTP

Ce type d'exception se réfère à divers problèmes causés par des erreurs techniques dans l'appel API ou la demande de paiement.

Vous pouvez combiner l'un des extraits de code suivants avec cette requête standard CreatePayment :

// Initialisation
const merchantId = "PSPID";
const sdkResponse = null;
try {
sdkResponse = await directSdk.payments.createPayment(
merchantId,
{
cardPaymentMethodSpecificInput: {
card: {
cvv: "123",
cardNumber: "4567350000427977",
expiryDate: "1220",
cardholderName: "Wile E. Coyote",
},
paymentProductId: 3,
},
order: {
amountOfMoney: {
currencyCode: "EUR",
amount: 2980,
},
},
},
{}
);
} catch (error) {
// quelque chose a mal tourné, enregistrons-le...
console.error(error);
return;
}
if (sdkResponse.errors.length > -1) {
// nous avons une erreur spécifique
sdkResponse.forEach((error) => {
// votre logique de gestion des erreurs
console.error(error);
});
}
Type d'exception /
Code de statut HTTP
Exemple de code
ValidationException /
400
if (response.status === 400) {
console.log("Erreur de validation de l'entrée :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}
AuthorizationException /
403
if (response.status === 403) {
console.log("Erreur d'autorisation :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}
IdempotenceException /
409
if (response.status === 409) {
console.log("Erreur d'idempotence :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}}
ReferenceException /
404/409/410
if (
response.status === 404 ||
response.status === 409 ||
response.status === 410
) {
console.log("Référence d'objet incorrecte :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}}
PlatformException /
500/502/503
if (
response.status === 500 ||
response.status === 502 ||
response.status === 503
) {
console.log("Erreur survenue chez Direct ou un partenaire/acquéreur en aval :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}}
ApiException /
Tout autre code
if (response.errors.length > -1) {
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}}
CommunicationException /
Codes 300 sans corps ou réponse non JSON
if (response.status.match(/3[0-9]{2}\b/)) {
console.log("Erreur de communication :");
response.errors.forEach((error) => {
console.log(error.code, error.message);
});
}}

Codes de statut HTTP

Toutes nos exceptions sont liées à un ou plusieurs codes de statut HTTP, indiquant la cause principale de nombreuses erreurs possibles.

Code de statut Description Type d'exception
200

Réussi
Notre plateforme a traité votre requête correctement

-
201

Créé
Notre plateforme a traité votre requête correctement et a créé une nouvelle ressource. Nous renvoyons l'URI de cette ressource dans l'en-tête Location de la réponse

-
204

Pas de contenu
Notre plateforme a traité votre requête correctement

-
Divers
CreatePaymentResult clé présente dans la réponse

Paiement Rejeté
Soit notre plateforme, soit l'un de nos partenaires/acquéreurs en aval a rejeté votre requête

DeclinedPaymentException
Divers
payoutResult clé présente dans la réponse

Règlement Rejeté
Soit notre plateforme, soit l'un de nos partenaires/acquéreurs en aval a rejeté votre requête

DeclinedPayoutException

Divers
RefundResult clé présente dans la réponse

Remboursement Rejeté
Soit notre plateforme, soit l'un de nos partenaires/acquéreurs en aval a rejeté votre requête

DeclinedRefundException
400

Mauvaise requête
Votre requête contient des erreurs, ainsi, notre plateforme ne peut pas la traiter

ValidationException
403

Non autorisé
Vous essayez de faire quelque chose qui n'est pas permis ou que vous n'êtes pas autorisé à faire

AuthorizationException
404

Non trouvé
L'objet que vous essayez d'accéder n'a pas pu être trouvé sur le serveur

ReferenceException
409

Conflit
Votre requête idempotente a entraîné un conflit en raison de :

  • La première requête n'est pas encore terminée
  • Votre requête a entraîné un conflit. Soit vous avez soumis une requête en double, soit vous essayez de créer quelque chose avec une clé dupliquée
IdempotenceException
ReferenceException
410

Disparu
L'objet que vous essayez d'atteindre a été retiré.

ReferenceException
500

Erreur interne du serveur
Une erreur est survenue sur notre plateforme

PlatformException
502 Mauvaise passerelle
Notre plateforme n'a pas pu traiter un message d'un partenaire/acquéreur en aval
PlatformException
503 Service indisponible
Le service que vous essayez d'atteindre est temporairement indisponible. Veuillez réessayer plus tard
PlatformException
Autre Erreur inattendue
Une erreur inattendue s'est produite
ApiException

Fonctionnalités supplémentaires

Le SDK a beaucoup plus à offrir. Jetez un œil aux fonctionnalités suivantes, car elles vous aideront à construire la solution parfaite.

Obtenir les méthodes de paiement disponibles

Avant d'initier le processus de paiement réel, vous envoyez une requête GetPaymentProducts à notre plateforme. La réponse contient une liste des méthodes de paiement disponibles dans votre PSPID. Selon les préférences de vos clients, vous pouvez offrir une sélection sur notre Hosted Checkout Page ou sur votre propre environnement de boutique en ligne en utilisant des requêtes CreatePayment ultérieures.


// Initialisation
const merchantId = "PSPID" const paymentProducts = await directSdk.products.getPaymentProducts(merchantId, { countryCode: 'NL', currencyCode: 'EUR', });

Envoyer des requêtes idempotentes

L'une des principales fonctionnalités de l'API REST est sa capacité à détecter et à éviter l'envoi de requêtes (par exemple, des requêtes de paiement) accidentellement en double. Le SDK rend très facile pour vous de vous assurer que vous envoyez uniquement des requêtes uniques – idempotentes – à notre plateforme.

Utilisez l'argument supplémentaire paymentContext et définissez sa propriété nommée idempotence sur une requête CreatePayment. Le SDK enverra un en-tête X-GCS-Idempotence-Key avec la clé d'idempotence comme valeur.

Si vous envoyez des requêtes de cette manière à notre plateforme, nous vérifierons ce qui suit :

  • Si vous envoyez une demande ultérieure avec la même clé d'idempotence, la réponse contient un en-tête X-GCS-Idempotence-Request-Timestamp. Le SDK définira la propriété idempotence.requestTimestamp de l'argument CallContext.
  • Si la première requête n'est pas encore terminée, l'API du serveur RESTful renvoie un code de statut 409. Ensuite, le SDK lance une IdempotenceException avec la clé d'idempotence originale et l'horodatage de la requête d'idempotence.

// Initialisation
const merchantId = "PSPID";
const idempotenceKey = newUUID();
const paymentContext: PaymentContext = {
idempotence: {
key: idempotenceKey
}
};
directSdk.payments.createPayment(
merchantId,
{
cardPaymentMethodSpecificInput: {
card: {
cvv: "123",
cardNumber: "4567350000427977",
expiryDate: "1220",
cardholderName: "Wile E. Coyote",
},
paymentProductId: 3,
},
order: {
amountOfMoney: {
currencyCode: "EUR",
amount: 2980,
},
},
},
paymentContext,
(error, sdkResponse) => {
if (paymentContext.idempotence.requestTimestamp) {
// this call is made with idempotence and is still being handled
console.log(
"idempotence timestamp",
paymentContext.idempotence.requestTimestamp
);
}
}
);

Si une clé d'idempotence est envoyée pour un appel qui ne prend pas en charge l'idempotence, l'API du serveur RESTful ignorera la clé et traitera la requête comme une première requête.


Utiliser la logging

Le SDK prend en charge la logging des requêtes, des réponses et des exceptions de la communication API. Cela peut être utile pour le dépannage ou le suivi des étapes individuelles dans le flux de paiement.

Pour utiliser cette fonctionnalité de logging, vous devez implémenter l'interface CommunicatorLogger.

Le SDK propose deux implémentations de la fonctionnalité de logging :

  • System.out (SysOutCommunicatorLogger)
  • java.util.logging.Logger (JdkCommunicatorLogger)

Assurez-vous d'utiliser les classes suivantes :

  • ResourceLogger

Pour utiliser cette fonctionnalité, fournissez une implémentation de l'interface Logger. Vous pouvez activer/désactiver la journalisation en appelant setLogger sur un objet directSdk.context et en fournissant le logger comme argument logger.

Le SDK obfusque les données sensibles dans le journal.

Webhooks

La partie du SDK qui gère la prise en charge des webhooks est appelée le webhooks helper. Elle gère de manière transparente à la fois la validation des signatures par rapport aux corps des événements envoyés par le système de webhooks (y compris la recherche de la clé secrète pour les identifiants de clé - à ne pas confondre avec la API Key et le API Secret ), et le dé-marquage de ces corps vers des objets. Cela vous permet de vous concentrer sur l'essentiel, sans parcourir toutes les informations supplémentaires et les extraire vous-même. Pour en savoir plus sur les webhooks, lisez notre guide dédié. 

Fournir des clés secrètes

Configurez les "WebhooksKey" / "WebhooksKeySecret" et les endpoints de vos webhooks serveur dans le Merchant Portal:


keyId = '[WebhooksKey"]',
secretKey = '[WebhooksKeySecret]'

Les clés secrètes sont fournies à l'aide d'une fonction qui prend deux arguments :

  • L'ID de clé pour retourner la clé secrète.
  • Une fonction de rappel qui prend soit une erreur en tant que premier argument, soit la clé secrète pour l'ID de clé donnée en tant que deuxième argument (dans ce cas, le premier argument doit être nul).

Le SDK fournit une implémentation pour cette fonction : webhooks.inMemorySecretKeyStore.getSecretKey. Cela récupérera les clés secrètes à partir d'un magasin de clés en mémoire.

Vous pouvez ajouter ou supprimer des clés en utilisant les fonctions suivantes :

  • webhooks.inMemorySecretKeyStore.storeSecretKey(keyId, secretKey) pour stocker une clé secrète pour un ID de clé.
  • webhooks.inMemorySecretKeyStore.removeSecretKey(keyId) pour supprimer la clé secrète stockée pour un ID de clé.
  • webhooks.inMemorySecretKeyStore.clear() pour supprimer toutes les clés secrètes stockées.

Si vous avez besoin d'un stockage plus avancé, par exemple pour une base de données ou un système de fichiers, nous vous recommandons d'écrire votre propre implémentation.

Initialiser le webhooks helper

Incluez et initialisez le webhooks helper comme suit :

// Initialisation
const webhooks = require("direct-sdk-nodejs").webhooks;
// remplacez webhooks.inMemorySecretKeyStore.getSecretKey par votre propre fonction si nécessaire
webhooks.init({
getSecretKey: webhooks.inMemorySecretKeyStore.getSecretKey,
});

Utiliser le webhooks helper

Depuis un point d'entrée que vous avez créé vous-même, appelez la méthode unmarshal de l'instance du webhooks helper:

  • Le corps en tant que string ou tampon. Cela devrait être le corps brut tel que reçu du système de webhooks.
  • Un objet contenant les en-têtes de requête tels que reçus du système de webhooks. Les clés doivent être les noms des en-têtes.
// Initialisation
const webhooks = require("direct-sdk-nodejs").webhooks;
const webhooksHelper = webhooks.init();
webhooksHelper.unmarshal(body, requestHeaders, (error, event) => {
if (error) {
// something went wrong in validating the signature or unmarshalling the event
} else {
// process the event
}
});

Cette page vous a-t-elle été utile ?

Avez-vous des commentaires ?

Merci pour votre réponse.
New Feature

Try out our new chatbot and find answers to all your questions.