Hello, my name is Guillaume, I’m a software engineering intern at TESOBE, and in this video, we are going to see how we can receive a SEPA Payment Recall with the OBP SEPA adapter.
In the SEPA scheme, we can receive a Payment Recall after receiving a regular transfer transaction. When we receive a Payment Recall, it’s like a refund request, so the originator wants to get his funds back. And as the beneficiary, we can see if we agree or not with this Payment Recall, so we can accept and return the money or reject the recall request.
So, let’s first suppose that we have already received a credit transfer transaction. We have already received a basic SEPA transaction and the originator wants to get his funds back, so he sends a recall file.
So the SEPA adapter is going to receive a recall file and it’s going to search for the original transaction and make the link with the recall message. Once it’s done, the SEPA Adapter calls the OBP API to create a Refund Transaction Request. This transaction request is stored in the OBP Database and the application can get the transaction request via a simple API call.
Then, once the application receives the recall request, we can send two kinds of messages by completing the transaction request challenge. We can either agree and accept the recall, so we send the money back through a return message, or we can reject the recall by saying “Ok no, I don’t want to send the money back.”
So, let’s see the case of a positive answer. So, if we want to send the money back to the originator, we are going to complete the Refund Transaction Request challenge, we complete the challenge in a good way, this is going to update the transaction request and pass it to the completed status. Once it’s done, the OBP API is going to send a Make payment message to the OBP SEPA adapter, which calls the OBP API to save the refund transaction.
So up to this moment, the application is able to retrieve the refund transaction, and the refund transaction appears on the OBP API. But on the OBP SEPA Adapter, it’s not finished yet because the SEPA adapter needs to link the return, the original recall and the original transaction. And then, it needs to send the return file with a status code: Following Cancellation Request.
And what happens if we don’t want to send the money back? If we reject the recall? So, to do this, we can reject the transaction request challenge, we are going to see how we can do this later.
This is going to update the transaction request and pass it to the rejected status, then the OBP API sends a Notify Transaction Request message to the OBP SEPA adapter, which is going to see that the transaction request is now in the rejected status. And the OBP SEPA adapter links the original recall and the original transaction and saves the Recall Negative Answer, just before sending it to the Clearing & Settlement Mechanism.
So, let’s first come back to this. So we are going to integrate the transaction. So I currently have an OBP API instance running and a SEPA Adapter instance running, and I’m going to show you my account. I currently don’t have transactions on this account and I don’t have transaction requests. So we want to receive a regular payment, a credit transfer, and a credit transfer is this message name: pacs.008.001. So as we can see, we received an amount of €20 from Louis Dupont with this IBAN to our account.
This IBAN is the same as my account IBAN.
Ok, so let’s process this message. To do this we go to Process Incoming Message. We want to process a pacs.008.001.02. We launch the Process Incoming File Actor and this is going to integrate the transaction in the OBP API. So as you can see, this is the save transaction response on the OBP API side. And now, when I go to my transactions, I have this one, which is a credit of €20.
So everything is good, I received the transaction. Now, I go to this state. We are going to receive the SEPA Payment Recall. A SEPA Payment Recall is defined by camt.056, and to do so we need to take the original transaction information, so mainly the transaction ID needs to be the same as the original transaction ID, so does the original end-to-end ID, and the original message ID.
So here are the cancellation status and the message ID, which are generated by the other bank, so we don’t really care about them. But something important is the amount, which needs to be the same: €20. And the settlement date, which also needs to correspond to the original credit transfer transaction.
And the recall has an originator and a Reason Code. So why do we want to get the fund back? Here this Reason Code corresponds to an invalid creditor account number, so in this case, it means that the originator sends the money to a bad account and wants to get his funds back. We can also add additional information and we need a transaction message to be the same.
Ok, let’s now process this file. And Process Incoming File Actor System… and now we want to process the camt.056.001.01.xml, and let’s see what happens.
Ok, as we can see, we have the transaction request creation response. It means that the transaction request has been created on my account, so if I go there I should get the transaction request. And I can see Next Challenge Pending, it means we are waiting for the application response.
And, in our first case, we are going to say that we agree with the refund.
So, to do this, we need to complete the transaction request challenge. To do so I need the transaction request ID, which I put in the URL. And the transaction request challenge ID, which I put there.
So, as I’m in the dummy configuration, the good response is 123 to complete this challenge. And I don’t need those additional fields, which are going to be for the reject afterwards. Here I just say ok I accept to send the funds back, and we send this.
So now, as we can see, the transaction request passes to the completed status and we have the transaction ID, this one. So if I go in my transactions now, I should have a debit of €20 here, with the transaction ID in the response of the transaction challenge complete.
Ok, so now what happens on the SEPA adapter side? We have 3 SEPA messages. Here is the original credit transfer one that we received, here is the recall message we received, and we have the response which is a return message that we need to process. To do that, we are going to process outgoing files, and this is going to generate here our written file by saying “OK, I send back the €20”, and as you can see here it’s FOCR, which means in the SEPA documentation Following Cancellation Request.
Ok, so that’s all good to send a positive response, and now we want to send a negative response. So we return to this stage, we are going to receive another credit transfer transaction with just a different amount and a different message ID. So I can put more or less anything I want there, just it won’t be the same as another message, and we are going to set a transaction of €100. And we are going to leave the same descriptions, ok.
So, we can now process this incoming transaction. So we want the pacs.008.001.02. So let’s process this one. Ok, and so now if I go in my transactions, I can see the credit of €100 that I just received. I am going now to receive another recall, more or less the same, but I just need to have the original message ID and the original transaction ID corresponding to the original credit transfer transaction, like this.
And this is a recall of the total amount of €100 and we keep the same reason, we say “Ok, that’s on a bad account”. And let’s process this incoming file, so the recall camt.056.001.01.
Ok, as you can see, we have now the transaction request created. So if we go in transaction requests, we have … yeah, it’s this one. We have this transaction request and we now want to say that we don’t want to send the funds back and we just want to keep the money. but as we are going to see, we can give a reason. So to do so, I need to reject the transaction request challenge, so I’m going to show you how we can do this.
So first, I take the transaction request ID and put it in the URL for the challenge. Then I take the challenge ID I need to complete and I put it in the body. And now, here I can set up two additional fields: one is named Reason Code, which corresponds to a SEPA Reason Code to say why we don’t want to send the money back, so we are going to see here the Payment Recall Negative Answer Reason Code. And we can say “OK, it’s just the beneficiary’s refusal” because I don’t want to send the money back.
And, we can also add another field named Additional Information to give a reason. For example: “I don’t want to send the money back”, which can be additional information in a language understandable by humans. And, of course, the answer is now on “reject”.
So, let’s send this request. As we can see, it updates the transaction request by adding the Refund Reject Reason Code and the Refund Reject Additional Information, and it passes the transaction request status to ‘rejected’ to say “I don’t want to send the money back” . And if I go in the transaction request, we can also see here that it has adapted.
Ok, and now we have another kind of message here, which is camt.029, which is used for Payment Recall Negative Answer and, as we can see, it’s unprocessed. And the last thing we need to do is to process this file by launching the process outgoing file script.
And, as you can see, just up here, it’s a message from my bank to the beneficiary’s bank. Here you will find the original credit transfer information, the end-to-end ID, transaction ID, and we have here the reason. So, who sends the negative answer, the Reason Code – so customer generated – and the additional information.
And all this refers to the original transaction reference.
Ok so we have seen how we can receive a SEPA Payment Recall and give an answer to this recall. Thank you for listening and bye.