I'm trying to use the unofficial plugin for Dibs Easy (but I guess official Dibs D2 plugin works the same way), and I was wondering how to fill the TransactionInfo of current order to use in FetchPaymentStatus (or any other) method.
That is, it can be set only privately, and I don't see any method that can set it.
thank you for the answer.
I've ended up with something like this:
var order = sessionManager.GetCurrentOrder(store.Id).AsWritable(uow).UpdateTransaction(0, paymentId, Vendr.Core.Models.PaymentStatus.PendingExternalSystem);
orderService.SaveOrder(order);
var status = dibs.FetchPaymentStatus(order, payment.PaymentProviderSettings);
if (status?.TransactionInfo?.PaymentStatus == Vendr.Core.Models.PaymentStatus.Authorized || status?.TransactionInfo?.PaymentStatus == Vendr.Core.Models.PaymentStatus.Captured)
{
order.Finalize(order.TotalPrice.Value.WithTax, paymentId, status.TransactionInfo.PaymentStatus);
}
it'll probably work, but is a few things I'd recommend against.
You are current updating the transaction and then finalizing it depending on the payment status returned but there is no point calling the UpdateTransaction method if you are going to finalize so I'd probably put that in an if/else.
For the finalized amount you are just passing the order total price through but this should really be retrieved from the payment gateway as the purpose of this is to say "this is the amount that was captured by the gateway". Also, if you are using Vendr 1.5.0+ then if you are to use the order amount, you should really be using the order.TransactionAmount property.
Generally speaking, there should only be a need to "Save" an order once per request. Given everything is happening within a Unit of Work, this makes it all transnational and so you should only really need to save at the end of the transaction.
I agree that UpdateTransaction looks out of place here, but I don't see how else should I fetch the payment status when I get redirected to thank you page from the payment gateway.
The way I see it - I need to call the UpdateTransaction to fill the TransactioId property of the current order with the transaction id passed by the payment provider gateway in the thank you url.
Then I can get the payment status by calling the FetchPaymentStatus, which uses order.TransactionInfo.TransactionId to query the payment provider API.
There must be something I'm missing here, I'm sure, but I don't see it, and I couldn't find any example of handling the payment flow, be it older DIBS D2, or any other payment system.
From what you are saying, I'm not sure you are going about things the right way.
Is this a follow on from your custom payment provider implementation question previously? If so, this should all really be part of the payment provider, but from what you are saying here, it sounds like you are doing this all on your continue page and then updating the transaction info externally.
If you are implementing a payment provider, and you need to process the payment at the point of returning to the site then you should pass the continueUrl we provide you during the payment providers GenerateForm method to the gateway and also set your payment provider to have FinalizeAtContinueUrl set to true. When this is set to true, when the gateway returns you to the continue URL, it will also trigger the ProcessCallback method where you can extract your transaction information and return it in the CallbackResult where Vendr will take care of finalizing the order for you. Once it's done that it will automatically redirect you to the confirmation page configured in your payment provider.
There really should be any need for you to do all of this stuff external to a payment provider implementation.
I have now refactored my code, so that it should be more in line with checkout flow schematic (i.e. using BeginPaymentForm).
But @using (Html.BeginPaymentForm do crash with "System.UriFormatException: Invalid URI: The URI is empty"
I guess it can't find the callback url, and, honestly, I can't find where to put it either. There is no callback url property in Payment method settings, and looks like no method to do so from code.
How to fill TransactionInfo
Hi,
I'm trying to use the unofficial plugin for Dibs Easy (but I guess official Dibs D2 plugin works the same way), and I was wondering how to fill the TransactionInfo of current order to use in FetchPaymentStatus (or any other) method.
That is, it can be set only privately, and I don't see any method that can set it.
Thanks
Hi Fedor,
To update the transaction info on an order you either need to call
order.Finalize
ororder.UpdateTransaction
if the order is already finalized.Hope this helps
Matt
Hi Matt,
thank you for the answer. I've ended up with something like this:
Is this the correct way of finalizing the order?
it'll probably work, but is a few things I'd recommend against.
You are current updating the transaction and then finalizing it depending on the payment status returned but there is no point calling the
UpdateTransaction
method if you are going to finalize so I'd probably put that in anif/else
.For the finalized amount you are just passing the order total price through but this should really be retrieved from the payment gateway as the purpose of this is to say "this is the amount that was captured by the gateway". Also, if you are using Vendr 1.5.0+ then if you are to use the order amount, you should really be using the
order.TransactionAmount
property.Generally speaking, there should only be a need to "Save" an order once per request. Given everything is happening within a Unit of Work, this makes it all transnational and so you should only really need to save at the end of the transaction.
Matt
I agree that
UpdateTransaction
looks out of place here, but I don't see how else should I fetch the payment status when I get redirected to thank you page from the payment gateway.The way I see it - I need to call the
UpdateTransaction
to fill theTransactioId
property of the current order with the transaction id passed by the payment provider gateway in the thank you url.Then I can get the payment status by calling the
FetchPaymentStatus
, which usesorder.TransactionInfo.TransactionId
to query the payment provider API.There must be something I'm missing here, I'm sure, but I don't see it, and I couldn't find any example of handling the payment flow, be it older DIBS D2, or any other payment system.
Thanks, Fedor
Hi Fedor,
From what you are saying, I'm not sure you are going about things the right way.
Is this a follow on from your custom payment provider implementation question previously? If so, this should all really be part of the payment provider, but from what you are saying here, it sounds like you are doing this all on your continue page and then updating the transaction info externally.
If you are implementing a payment provider, and you need to process the payment at the point of returning to the site then you should pass the continueUrl we provide you during the payment providers
GenerateForm
method to the gateway and also set your payment provider to haveFinalizeAtContinueUrl
set to true. When this is set to true, when the gateway returns you to the continue URL, it will also trigger theProcessCallback
method where you can extract your transaction information and return it in theCallbackResult
where Vendr will take care of finalizing the order for you. Once it's done that it will automatically redirect you to the confirmation page configured in your payment provider.There really should be any need for you to do all of this stuff external to a payment provider implementation.
Matt
Hi Matt,
I'm trying to implement the Dibs Easy payment. I'm using the unofficial plugin from here: https://github.com/bjarnef/vendr-payment-provider-dibs/tree/feature/dibs-easy
I have now refactored my code, so that it should be more in line with checkout flow schematic (i.e. using
BeginPaymentForm
).But
@using (Html.BeginPaymentForm
do crash with "System.UriFormatException: Invalid URI: The URI is empty"I guess it can't find the callback url, and, honestly, I can't find where to put it either. There is no
callback url
property in Payment method settings, and looks like no method to do so from code.Maybe @bjarnef could please help?
Thanks, Fedor
So it seems I'm not very bright, as it took me some time to figure this out :)
All I had to do was use
Html.BeginPaymentForm
and Vendr and payment plugin would handle all the rest.It's all good now.
is working on a reply...