Annuler une initiation de paiement
➤ Cas d'usage
Cette méthode permet au PISP d'annuler une demande d'initiation de paiement déjà enregistrée, à condition que le paiement n'ait pas encore été exécuté et que sa date d’exécution n’est pas atteinte (i.e. date d’exécution prévue au moins à J+1 par rapport à la date de demande d’annulation).
Autrement dit, cet appel permet d'envoyer à la banque (ASPSP) d'un client une demande d'annulation d'un paiement qui a été initié avec la méthode POST /payment-requests (voir la rubrique "Cas d'usage" > "Initier un paiement") et qui n'est pas encore échu.
Pour cet ASPSP, un virement SCT qui a été initié via l’API DSP2 PISP (quelle que soit la version) est annulable via l’API DSP2 PISP ou directement par le PSU via son application web ou mobile.
➤ Prérequis
Pour procéder à cette requête il est nécessaire de remplir les prérequis d’éligibilité pour le rôle TPP "PISP" (voir la rubrique "Eligibilité"), et d'avoir récupéré le jeton d'accès OAUTH2 (voir la rubrique "Vue d'ensemble" > "Récupérer un jeton").
Le TPP a déjà envoyé une requête DSP2 API PISP en version 1.4.2 qui a été enregistrée par l'ASPSP et à laquelle l'ASPSP a répondu avec un lien de localisation vers la demande de paiement / virement sauvegardée.
Corollaire : Pour annuler une initiation de paiement qui a été initiée par l’API DSP2 en version 1.4.0, il convient d’utiliser une requête DSP2 PISP en version 1.4.0 également (i.e. PUT /stet/psd2/v1/payment-requests/{resourceId}).
➤ Requête
Le point d'entrée dépendra du code établissement.
Vous devez utiliser la même valeur du paramètre <cdetab> que celle utilisée pour le jeton d'accès.
Pour rappel, la liste de nos établissements et les valeurs possibles des <cdetab> sont précisées dans la rubrique "Limitations".
Par exemple, voici la requête pour annuler en production un paiement pour un client de cet ASPSP :
- PUT https://www.12579.live.api.89c3.com/stet/psd2/v1.4.2/payment-requests/{paymentRequestResourceId}
➤ Paramètres obligatoires ou facultatifs du body requis pour l'appel de ce service
Paramètre obligatoire paymentRequestResourceId : identifiant de la requête d'initiation de paiement pour laquelle on souhaite annuler le virement.
La structure du body et les champs obligatoires sont décrits dans la norme STET.
En préalable, le Tiers de Paiement peut et doit récupérer les informations de son virement avec la méthode GET /stet/psd2/v1.4.2/payment-requests/{paymentRequestResourceId} afin de vérifier que le paiement est à un statut annulable. Pour savoir si un virement est éligible les informations suivantes doivent être valorisées dans la requête comme suit :
- La donnée paymentInformationStatus doit avoir l'une des valeurs : ACTC / ACCP / ACSP
- La donnée transactionStatus (au niveau de la transaction dans l’objet creditTransferTransaction) doit avoir la valeur PDNG (si paymentInformationStatus = ACSP), sinon il ne doit pas être renseigné
- La donnée serviceLevel doit être renseigné à SEPA (seuls les virements SCT différé ou permanent sont annulables)
- La donnée currency doit être renseignée à EUR
- La donnée localInstrument ne doit pas être valorisée
- La donnée requestedExecutionDate doit être dans le futur : à minima à J+1
Pour permettre à la banque de comprendre que la requête est une demande d'annulation d'une initiation de paiement, certaines informations doivent être modifiées dans la requête comme suit (API DSP2 STET_V1.4.2.17 Part 3 Interaction Examples p.23) :
- La donnée transactionStatus(au niveau de la transaction dans l’objet creditTransferTransaction) doit être positionnée à "RJCT" (Rejeté)
- La donnée statusReasonInformation (au niveau de la transaction dans l’objet creditTransferTransaction) doit être positionnée avec l'une des valeurs suivantes :
statusReasonInformation | Signification |
---|---|
DS02 | Annulation à la demande du client |
DUPL | Annulation à la demande du PISP en cas de doublon par rapport à un paiement/virement précédent |
FRAD | Annulation à la demande du PISP si l'origine du paiement/virement est frauduleux |
TECH | Annulation à la demande du PISP pour un problème technique de son côté |
- Il faut également enlever toute la partie _links
- Pour finir il faut supprimer l'intitulé du parent "paymentRequest": {" ainsi que l’accolade fermante en bas du flux "}"
Les autres données de la requête doivent être identiques à celles récupérées avec la méthode GET.
➤ Cas du SCT Récurrent
L’initiation d'un paiement récurrent peut être annulée tant qu’elle est en cours de traitement (ACSP) jusqu’à l’exécution du dernier paiement.
Si tous les paiements ont été exécutés, l’initiation d'un paiement récurrent est impossible à annuler.
➤ Résultat retourné
A la soumission de la requête, et si toutes les données sont correctement formatées, une réponse (HTPP 200) sera retournée.
Cette réponse contiendra le ressourceId du paiement, ainsi que le mode d'authentification SCA Redirect (seul mode disponible), l'URL de consentement en fonction de la banque du payeur (urlconsent_approval_URL) et le non rejeu.
Remarques :
- La donnée paymentRequestRessourceId, essentielle pour pouvoir annuler un paiement, est incluse en tant que paramètre dans l'URL de consentement "consentApproval" renvoyée lors de l’initiation de paiement.
- Idem pour le non rejeu : c'est le paramètre nonce dans l'URL de consentement.
➤ Codes erreur
Type d'erreur | Code HTTP | Libellé | Motif |
---|---|---|---|
Générique, mauvaise structure | 400 | Bad request | error code : FF01 message : RJCT |
Mauvais format du BIC | 400 | Bad request | error code : FF01 message : RJCT error : le champ creditorAgent.bicFi bicFi-Code allocated to a financial institution by the ISO 9362 Registration Authority as described in ISO 9362 |
Mauvais format du serviceLevel | 400 | Bad request | error code : FF01 message : RJCT error : value not one of declared Enum instance names: [SEPA, NURG] |
Mauvais format, chargeBearer autre que SLEV | 400 | Bad request | error code: FF01 message: RJCT error: value not one of declared Enum instance names: [SLEV] |
Mauvais format du schemeName | 400 | Bad request | error code: FF01 message : RJCT error : le champ creditor.privateId.schemeName schemeName-Possible values BANK,COID,SREN,DSRET,NIDN,OAUT,CPAN |
Mauvais format du purpose | 400 | Bad request | error code: FF01 message: RJCT error: value not one of declared Enum instance names: [TRPT, CASH, CPKC, ACCT, COMC] |
Mauvais format du categoryPurpose | 400 | Bad request | error code: FF01 message: RJCT error: value not one of declared Enum instance names: [CASH, DVPM] |
Mauvais jeton d'accès, problème d'authentification | 403 | Forbidden | |
Request resource inconnu | 404 | Not Found | |
Mauvaise requête ou requête hors périmètre autorisé | 405 | Method not allowed | |
Message générique | 500 | Internal server error |