2013-08-04 17 views
5

Znam jego podstawowe pytania, ale nie mam już dostępu do formularzy internetowych. Używam Stripe.js po raz pierwszy i chcę go użyć w połączeniu z stripe.net do przetworzenia strony klienta. Oto kod klienta:jak uzyskać js POST w webformie asp.net?

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
CodeBehind="StripePage.aspx.cs" Inherits="StripePage.StripePage" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
<script type="text/javascript" src="https://js.stripe.com/v2/"></script> 
<script type="text/javascript"> 
    // This identifies your website in the createToken call below 
    // You need to put your real publish key here. 
    Stripe.setPublishableKey('pk_test_1nDJ3hA1Mv2Sy9bUoYcBMXmm'); 
    // ... 
    // I am using jquery to process the payment. It knows what form to 
    // process it on based on the name 'payment-form' 
    jQuery(function ($) { 
     //payment submission 
     $('#payment-form').submit(function (event) { 
      var $form = $(this); 

      // Disable the submit button to prevent repeated clicks 
      $form.find('button').prop('disabled', true); 

      Stripe.createToken($form, stripeResponseHandler); 

      // Prevent the form from submitting with the default action 
      return false; 
     }); 

     //if there is a error, it is displayed on the page if there was 
     //no error this is where it gets sent to the server. 
     var stripeResponseHandler = function (status, response) { 
      var $form = $('#payment-form'); 

      if (response.error) { 
       // Show the errors on the form 
       $form.find('.payment-errors').text(response.error.message); 
       $form.find('button').prop('disabled', false); 
      } else { 
       // token contains id, last4, and card type 
       var token = response.id; 
       // Insert the token into the form so it gets submitted to the server 
       $form.append($('<input type="hidden" name="stripeToken" />').val(token)); 
       // and submit 
       $form.get(0).submit(); 
      } 
     }; 
    }); 
</script> 

<form method="POST" id="paymentForm" runat="server"> 
    <span class="payment-errors" runat="server"></span> 

    <div class="form-row"> 
     <label> 
      <span>Card Number</span> 
      <br /> 
      <input id="number" type="text" data-stripe="number" clientidmode="Static" /> 
      <input type="text" size="20" data-stripe="number" runat="server" /> 
     </label> 
    </div> 

    <div class="form-row"> 
     <label> 
      <span>CVC</span> 
      <br /> 
      <input type="text" size="4" data-stripe="cvc" runat="server" /> 
     </label> 
    </div> 

    <div class="form-row"> 
     <label> 
      <span>Expiration (MM/YYYY)</span> 
      <br /> 
      <input type="text" size="2" data-stripe="exp-month" runat="server" /> 
     </label> 
     <br /> 
     <input type="text" size="4" data-stripe="exp-year" runat="server" /> 
    </div> 
    <asp:Button ID="submit" ClientIDMode="Static" runat="server" Text="SubmitPayment" OnClick="submit_Click" /> 
</form> 
</asp:Content> 

Ostatnia rozmowa w JS tworzy obiekt JSON, że chcę wiedzieć, w jaki sposób dostać się na stronie C# w przycisk kliknij:

protected void submit_Click(object sender, EventArgs e) 
{ 
.... 
} 

Ja chce wykonać implementację javascript, aby uniknąć konieczności przestrzegania PCI. Czy podchodzę do tego niepoprawnie? Czy powinien to być cały Stripe.net, aby przetworzyć wszystko i całkowicie pominąć js? A jeśli tak, jak mogę uzyskać dane posta formularza w zdarzeniu kliknięcia przycisku?

+1

To jest podejście, które zalecamy. Twój formularz zostanie przesłany przez JavaScript jak zwykły formularz, tak jakby Twój użytkownik kliknął "prześlij" bez żadnego JS. Możesz więc obsłużyć go w taki sam sposób, jak zwykłe przesyłanie formularzy. – brian

+0

Jeśli jego formularze internetowe ASP.NET prawdopodobnie będziesz chciał dodać ukryte pole tekstowe w początkowym obciążeniu i twardy kod jego identyfikator klienta. Następnie w swoim zapytaniu użyj JQuery, aby ustawić wartość conferences dla twojego tokena i wywołać zdarzenie POSTBACK, aby program ASP.NET mógł ponownie się połączyć i znaleźć serwer po stronie serwera. – Matt

Odpowiedz

6

Dzięki za porady w komentarzach. Po wielu lekturze Internetu i ciągnięciu za włosy, odszedłem na chwilę i wróciłem z tym rozwiązaniem.

  1. Wykonane przycisk tylko standardowe wejście html (nie asp: przycisk)
  2. Dostaliśmy wysłane z powrotem informacje który został wysłany przez JavaScript w zdarzeniu Page_Load jak tak

Code Behind :

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     StripeConfiguration.SetApiKey("[API Secret Key"); 
     NameValueCollection nvc = Request.Form; 
     string amount = nvc["amount"]; 
     var centsArray = amount.Split('.'); 
     int dollarsInCents = Convert.ToInt32(centsArray[0]) * 100; 
     int remainingCents = Convert.ToInt32(centsArray[1]); 
     string tokenId = nvc["stripeToken"]; 

     var tokenService = new StripeTokenService(); 
     StripeToken stripeToken = tokenService.Get(tokenId); 


     var myCharge = new StripeChargeCreateOptions 
     { 
      TokenId = tokenId, 
      AmountInCents = dollarsInCents + remainingCents, 
      Currency = "usd" 
     }; 
     var chargeService = new StripeChargeService(); 
     StripeCharge stripeCharge = chargeService.Create(myCharge); 
    } 
} 

Wydaje się używając NameValueCollection (która mieszka w przestrzeni nazw System.Collections.Specialized) dało mi możliwość chwycić to, co potrzebne z żądania .Form przez wyciągnięcie go poprzez nazwę zmiennej. Odkąd zmieniono nazwy zmiennych, chodziło tylko o to, aby je pobrać, a następnie za dokumentacją biblioteki Stripe .NET, aby pobrać token i przetworzyć płatność.

4

Chcę po prostu dodać komentarz do odpowiedzi, ale nie mogę jeszcze. Tak naprawdę nie jest to odpowiedź, a raczej odpowiedź na ustalenia własne PO.

Robię dokładnie to samo, używając Stripe.js. Mogę po prostu pobrać StripeToken za pomocą Request.Form i uzyskać wszystkie inne pola nie związane z c/c w zwykły sposób w kodzie z tyłu (np. Int Total = PaymentTotal.Value;); ale zauważam, że nie chodzi o pobieranie danych, ale o to, że masz mieć, aby poradzić sobie z tym na Page_Load (lub w jakimś późniejszym punkcie cyklu życia strony), ponieważ zdarzenie onclick przycisku Submit nigdy nie jest faktycznie wyrzucane , ponieważ formularz jest faktycznie przesyłany za pomocą js, a nie przycisku.

Tak więc, będąc dosłownie i trochę odpowiadając na oryginalne pytanie, nie można faktycznie uzyskać danych w zdarzeniu kliknięcia przycisku, bez wywoływania tego zdarzenia ręcznie po odświeżeniu strony (domyślam się).

Mam nadzieję, że kiedyś kogoś uratuję, jeśli zdecyduje się na to, aby Stripe i .NET współpracowały ze sobą.

+0

Uzgodnione. Właściwie używam tego samego wydania od jednego dnia. Czy jest to sposób, aby poradzić sobie z tym tylko przy ładowaniu strony, a raczej w zdarzeniu kliknięcia przycisku z kodem?Ponieważ mam prawie 50 pól wraz z wymaganymi polami dla Stripe do wewnętrznego procesu rejestracji użytkownika. Wydaje się to możliwe tylko przy kliknięciu przycisku. Poza tym za każdym razem, gdy nastąpi powrót, wykona proces pasków. Rozwiązaniem może być ustawienie flagi na kliknięciu przycisku i obsłużenie go przy ładowaniu strony w sprawdzianiu ispostback wraz z flagą klikniętego przycisku. –