2016-12-24 32 views
6

Mam zintegrowany PayPal Payment Standard kilka lat temu, aby uzyskać płatność.Standard płatności PayPal zwraca GET zamiast POST z urządzeń mobilnych, dlatego nie można potwierdzić rejestracji płatności

Moja aplikacja jest w sieci Asp.Net. Obecnie jest w trybie piaskownicy.

Mam przycisk Zapłać teraz na mojej stronie posiadający PostBackURL na stronie PayPal z wszystkimi wymaganymi parametrami. Gdy użytkownik kliknie przycisk przekierowuje do serwisu PayPal, którego użytkownik może zapłacić za pośrednictwem swojego konta lub karty debetowej/kredytowej. A po pomyślnej transakcji użytkownik jest odsyłany do mojej aplikacji. Kiedy użytkownik wraca do mojej aplikacji, otrzymuję różne parametry, takie jak "payment_status" w kolekcji Request.Form. Sprawdzam poprawność odpowiedzi i odpowiednio wyświetlam komunikat o sukcesie/niepowodzeniu.

Powyższy przepływ działa poprawnie, gdy użytkownik znajduje się w przeglądarce na pulpicie.

Ale gdy użytkownik jest na urządzeniach mobilnych i pracuje z przeglądarką mobilną. Użytkownik jest wyładowywany na stronie mobilnej PayPal. Tam użytkownik płaci za swoje konto. Następnie wyświetlany jest komunikat o powodzeniu. Ale kiedy użytkownik jest przekierowywany do mojej aplikacji, nie otrzymuję żadnych wartości w kolekcji Request.Form. Z tego powodu nie jestem w stanie zweryfikować odpowiedzi z serwisu PayPal.

Ponadto dowiedziałem się, że w przeglądarkach komputerowych firma PayPal zwraca odpowiedź za pośrednictwem metody POST do mojej witryny, dlatego formularz Request.Form zawiera dane.

Natomiast w przypadku przeglądarek mobilnych PayPal zwraca odpowiedź metodą GET, dlatego Request.Form nie zawiera żadnych danych.

Dlaczego firma PayPal zwraca odpowiedź za pośrednictwem GET? W takim przypadku dane nie są dostępne nawet w teście cyklicznym, jak mogę sprawdzić odpowiedź, czy płatność się udała, czy nie?

Przeczytałem dokumentację i stwierdzono, że nie ma innych specyficznych ustawień dla standardu płatności mobilnych PayPal.

Nie chcę migrować, aby wyrazić zamówienie lub jakąkolwiek inną konfigurację.

Szukałem również wielu wątków na SO związanych z tym samym i nie znalazłem żadnego właściwego rozwiązania, które zaspokaja moją potrzebę, stąd pytanie o nowe pytanie.

+0

próbować używać paypal IPN –

Odpowiedz

2

Robiłem tak przez PayPal w moim projekcie ASP.NET WebAPI .. nadzieję, że to pomóc:

[AllowAnonymous] 
     [HttpPost] 
     [Route("api/PayPal/IPN")] 
     [ResponseType(typeof(OrderPayPalDTO))] 
     public async Task<IHttpActionResult> PayPalIPN() 
     { 
      try 
      { 
       decimal tot; 

       var data = this.Request.Content.ReadAsStringAsync().Result; 
       if (data == null) return BadRequest(); 

       // Parse the query string variables into a NameValueCollection. 
       NameValueCollection qscoll = HttpUtility.ParseQueryString(data); 
       PayPalViewModel payPalModel = new PayPalViewModel(); 

       var payPal = payPalModel.ToPayPalVM(qscoll); //HRE IS A EXTENSION METHOD TO MAP to a CLASS 

       if (payPal == null) return InternalServerError(new Exception()); 

       //Try cast total from paypal 
       if (!decimal.TryParse(payPal.mc_gross, out tot)) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_TOTAL_CAST)); 




       // If status is Ok /or Completed 
       if (payPal.payment_status.Equals(Constant.PaymentStatus.PAYED) || payPal.payment_status.Equals(Constant.PaymentStatus.COMPLETED)) 
       { 
        // update payment 
        bool ok = await this.UpdatePayment(order, user); 
        if (!ok) return InternalServerError(new Exception(Constant.Error.PAYMENT_ERROR_UPDATE)); 
       } 

       return Ok(order); 
      } 
      catch (Exception ex) 
      { 
       _logger.LogException(ex); 
       return (Constant.CONFIGURATION_GLOBALS.IS_DEVELOPMENT_MODE) 
        ? InternalServerError(ex) 
        : InternalServerError(new Exception(Constant.Error.ERROR_GENERIC_500)); 
      } 
     } 

i mój mapowania i klasy PayPalViewModel

public class PayPalViewModel 
    { 
     public string mc_gross { get; set; } 
     public string custom { get; set; } 
     public string payment_status { get; set; } 

     public string payment_type { get; set; } 
     public string mc_currency { get; set; } 

     public string payer_id { get; set; } 
     public DateTime payment_date { get; set; } 
     public string payment_gross { get; set; } 

     /// <summary> 
     /// ToPayPalVM From NameValueCollection 
     /// </summary> 
     /// <returns></returns> 
     public PayPalViewModel ToPayPalVM(NameValueCollection qscoll) 
     { 
      if (qscoll == null) return null; 
      DateTime date = DateTime.Now; 
      string mcGross = qscoll["mc_gross"]; 
      string paymentType = qscoll["payment_type"]; 
      string mcCurrency = qscoll["mc_currency"]; 
      string paymentStatus = qscoll["payment_status"]; 
      string payerId = qscoll["payer_id"]; 
      string paymentDate = qscoll["payment_date"]; 
      string paymentGross = qscoll["payment_gross"]; 
      string cust = qscoll["custom"]; 

      var datePay = DateTime.TryParse(paymentDate, out date); 

      return new PayPalViewModel 
      { 
       mc_gross = mcGross, 
       custom = cust, 
       payment_status = paymentStatus, 
       payment_type = paymentType, 
       mc_currency = mcCurrency, 
       payer_id = payerId, 
       payment_gross = paymentGross, 
       payment_date = (datePay) ? date : DateTime.Now 
      }; 
     } 
    } 
+0

Witam, czy sprawdziłeś ten kod podczas surfowania z poziomu przeglądarek mobilnych? Ponieważ w przeglądarkach mobilnych PayPal wykonuje GET zamiast POST. Zastanawiam się, jak to możliwe, że ta metoda API PayIPN() zostaje trafiona w GET. Czy możesz dać mi znać, gdy PayPal przekierowuje do Twojego wniosku po dokonaniu płatności na swojej stronie, w której formie otrzymujesz odpowiedź jako GET lub POST? –