protected override IPaymentResult PerformProcessPayment(SalePreparationBase preparation, IPaymentMethod paymentMethod) { // We have to use the CheckoutConfirmationModel in this implementation. If this were to be used // outside of a demo, you could consider writing your own base controller that inherits directly from // Merchello.Web.Mvc.PaymentMethodUiController<TModel> and complete the transaction there in which case the // BazaarPaymentMethodFormControllerBase would be a good example. var form = UmbracoContext.HttpContext.Request.Form; var DebitOrderNumber = form.Get("DebitOrderNumber"); if (string.IsNullOrEmpty(DebitOrderNumber)) { var invalidData = new InvalidDataException("The Purchase Order Number cannot be an empty string"); return new PaymentResult(Attempt<IPayment>.Fail(invalidData), null, false); } // You need a ProcessorArgumentCollection for this transaction to store the payment method nonce // The braintree package includes an extension method off of the ProcessorArgumentCollection - SetPaymentMethodNonce([nonce]); var args = new ProcessorArgumentCollection(); args.SetDebitOrderNumber(DebitOrderNumber); // We will want this to be an Authorize(paymentMethod.Key, args); // -- Also in a real world situation you would want to validate the PO number somehow. return preparation.AuthorizePayment(paymentMethod.Key, args); }