2016-07-26 18 views
2

Hallo Ich verwende SagePay Server Integration nach dem Zahlungsvorgang den Zahlungsprozess5006: Weiterleitung an die Vendors-Website nicht möglich. SagePay

5006: Kann nicht Vendors Website umleiten. Der Anbieter konnte eine RedirectionURL nicht bereitstellen.

meine Web-Konfigurationsdatei:

<sagePay> 
    <!-- The public-facing hostname that SagePay can use to contact the site --> 

    <add key="NotificationHostName" value="ubtfront.azurewebsites.net" /> 
    <!--<add key="NotificationHostName" value="ubtfront.azurewebsites.net" />--> 
    <!-- The protocol defaults to http, but you can override that to https with the following setting --> 
    <add key="Protocol" value="http" /> 
    <!-- Your notification controller --> 
    <add key="NotificationController" value="PaymentResponse" /> 
    <!-- Your notification action. These three settings together are used to build the notification URL --> 
    <!-- EG: http://my.external.hostname/PaymentResponse/Notify --> 
    <add key="NotificationAction" value="Notify" /> 
    <!-- Action names for URLS that the user will be directed to after payment either succeeds or fails --> 
    <!-- The URL is constructed from the notificationHostName and NotificationController. --> 
    <!-- Eg: http://my.external.hostname/PaymentResponse/Success --> 
    <add key="SuccessAction" value="Success" /> 
    <add key="FailedAction" value="Failed" /> 

    <!-- VAT multiplier. Currently at 20% --> 
    <add key="VatMultiplier" value="1" /> 
    <!-- Name of vendor. You will need to change this --> 
    <add key="VendorName" value="VendorName" /> 
    <!-- Simulator, Test or Live --> 
    <add key="Mode" value="Test" /> 
</sagePay> 

Meine Zahlungsantwort Controller:

public class PaymentResponseController : Controller 
    { 
     IOrderRepository _orderRepository; 

     public PaymentResponseController(IOrderRepository orderRepository) 
     { 
      _orderRepository = orderRepository; 
     } 

     public ActionResult Notify(SagePayResponse response) 
     { 
      // SagePay should have sent back the order ID 
      if (string.IsNullOrEmpty(response.VendorTxCode)) 
      { 
       return new ErrorResult(); 
      } 

      // Get the order out of our "database" 
      var order = _orderRepository.GetById(response.VendorTxCode); 

      // IF there was no matching order, send a TransactionNotfound error 
      if (order == null) 
      { 
       return new TransactionNotFoundResult(response.VendorTxCode); 
      } 

      // Check if the signature is valid. 
      // Note that we need to look up the vendor name from our configuration. 
      if (!response.IsSignatureValid(order.SecurityKey, SagePayMvc.Configuration.Current.VendorName)) 
      { 
       return new InvalidSignatureResult(response.VendorTxCode); 
      } 

      // All good - tell SagePay it's safe to charge the customer. 
      return new ValidOrderResult(order.VendorTxCode, response); 
     } 

     public ActionResult Failed(string vendorTxCode) 
     { 
      return View(); 
     } 

     public ActionResult Success(string vendorTxCode) 
     { 
      return View(); 
     } 
    } 

ich kann nicht herausfinden, wo ich falsch werde mir bitte helfen, es herauszufinden. Jede Art von Hilfe ist willkommen ....

+0

müssen Sie erfolgreich URL und fehlgeschlagene URL in Ihre 'sagepay' Anfrage übergeben. –

+0

Könnten Sie mir bitte eine Musteranfrage senden? Ich bin damit verloren. Bitte hilf mir. @SunilKumar – kirushan

+0

Verwenden Sie das SagePayMvc Nuget-Paket zufällig? – Diego

Antwort

0

Bitte folgenden Code bezieht, müssen Sie Ihren Erfolg passiert und gescheitert URL mit Ihrem request, ich habe dies erreicht durch die Verwendung folgenden Code:

 private static void SetSagePayFormAPIData(IFormPayment request, PaymentGatewayRequest paymentRequest) 
     { 
      var isCollectRecipientDetails = SagePaySettings.IsCollectRecipientDetails; 

      request.VpsProtocol = SagePaySettings.ProtocolVersion; 
      request.TransactionType = SagePaySettings.DefaultTransactionType; 
      request.Vendor = SagePaySettings.VendorName; 

      //Assign Vendor tx Code. 
      request.VendorTxCode = SagePayFormIntegration.GetNewVendorTxCode(); 

      request.Amount = paymentRequest.GrossAmount; 
      request.Currency = SagePaySettings.Currency; 
      request.Description = "Your Payment Description";    
      request.SuccessUrl = "Your SuccessUrl"; 
      request.FailureUrl = "Your FailureUrl"; 
      request.BillingSurname = paymentRequest.BillingSurname; 
      request.BillingFirstnames = paymentRequest.BillingFirstnames; 
      request.BillingAddress1 = paymentRequest.BillingAddress1; 
      request.BillingCity = paymentRequest.BillingCity;//Pass Billing City Name 
      request.BillingCountry = paymentRequest.BillingCountry;//Pass Billing City Name 

      request.DeliverySurname = paymentRequest.DeliverySurname; 
      request.DeliveryFirstnames = paymentRequest.DeliveryFirstnames; 
      request.DeliveryAddress1 = paymentRequest.DeliveryAddress1; 
      request.DeliveryCity = paymentRequest.DeliveryCity;//Pass Delivery City Name 
      request.DeliveryCountry = paymentRequest.DeliveryCountry;//Pass Delivery Country 

      //Optional 
      request.CustomerName = paymentRequest.BillingFirstnames + " " + paymentRequest.BillingSurname; 
      request.VendorEmail = SagePaySettings.VendorEmail; 
      request.SendEmail = SagePaySettings.SendEmail; 

      request.EmailMessage = SagePaySettings.EmailMessage; 
      request.BillingAddress2 = paymentRequest.BillingAddress2; 
      request.BillingPostCode = paymentRequest.BillingPostCode; 
      request.BillingState = "UK";//Pass Billing State 
      request.BillingPhone = paymentRequest.BillingPhone; 
      request.DeliveryAddress2 = paymentRequest.DeliveryAddress2; 
      request.DeliveryPostCode = paymentRequest.DeliveryPostCode; //Delivery Post Code 
      request.DeliveryState = "UK"; //Pass Delivery State 
      request.DeliveryPhone = paymentRequest.DeliveryPhone; 

      request.AllowGiftAid = SagePaySettings.AllowGiftAid; 
      request.ApplyAvsCv2 = SagePaySettings.ApplyAvsCv2; 
      request.Apply3dSecure = SagePaySettings.Apply3dSecure; 

      request.CustomerEmail = paymentRequest.CustomerEmail; 

      request.BillingAgreement = ""; 
      request.ReferrerId = SagePaySettings.ReferrerID; 

      request.BasketXml = SagePayPaymentController.ToBasketstring(paymentRequest); 

      request.VendorData = string.Empty; //Use this to pass any data you wish to be displayed against the transaction in My Sage Pay. 

     } 

es Hoffnung hilft Ihnen :)

+0

Ich benutze Server-Integration .. Dies funktioniert nicht. – kirushan

+0

Bei der Server-Typ-Integration müssen Sie die "Notification URL" übergeben: 'NotificationUrl = ServerPaymentRequest.NotificationUrl;' –

0

Sage nicht-Ports auf die URLs nicht mag (von Sage docs):

die Sage Pay-Server eine HTTP oder HTTPS POST an den No senden tificationURL Skript auf Ihrem Server das Ergebnis der Transaktion Ports 80 mit, um anzuzeigen, und 443. Bitte stellen Sie sicher, diese Ports nur verwenden, wie hart alle anderen Ports Codierungsfehler

Die SagePayMvc Bibliothek generiert den aktuellen Kontext verwendet die bauen Notify, Success und Failure URLs, dh es fügt auch den aktuellen Anfrage-Port hinzu.

Beim lokalen Testen wurde erwartet, dass mein Staging-Server (Azure) die Antwort von Sage erhält, aber mein aktueller Port wurde der Anforderung http://example.com:51118/PaymentResponse/Notify hinzugefügt, was dazu führte, dass der Fehler 5006 von Sage ausgelöst wurde.

Ich benutze MVC5, also musste ich Teile des Codes in der Bibliothek zwicken, damit es funktioniert.

Ich habe die BuildNotificationUrl-Eigenschaft in der DefaultUrlResolver-Klasse geändert, um die URL ohne Verwendung des Ports zu erstellen, da sie standardmäßig 80 oder 443 sein müsste.

Sie könnte so etwas weniger tun:

public virtual string BuildNotificationUrl(RequestContext context) { 
    var configuration = Configuration.Current; 
    var urlHelper = new UrlHelper(context); 
    var routeValues = new RouteValueDictionary(new {controller = configuration.NotificationController, action = configuration.NotificationAction}); 
    var url = urlHelper.RouteUrl(null, routeValues, configuration.Protocol, configuration.NotificationHostName); 
    var uri = new Uri(url); 

    return uri.GetComponents(UriComponents.AbsoluteUri & ~UriComponents.Port, UriFormat.UriEscaped); 
} 

Hoffnung, das hilft.