2013-08-04 3 views
5

So che è una domanda rudimentale, ma sono fuori allenamento sui webform. Sto usando Stripe.js per la prima volta e voglio usarlo in combinazione con stripe.net per elaborare il lato client. Ecco il codice del client:come ottenere js POST in asp.net webform?

<%@ 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> 

L'ultima chiamata in JS crea un oggetto JSON che voglio sapere come raggiungere sulla pagina C# sul pulsante clic:

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

Sono voler fare l'implementazione javascript per evitare di dover fare la conformità PCI. Mi sto avvicinando in modo errato? Dovrebbe essere tutto Stripe.net per elaborare tutto e saltare il js interamente? O se questo è giusto, come posso ottenere il modulo di postare i dati nell'evento click del pulsante?

+1

Questo è l'approccio che raccomandiamo. Il tuo modulo verrà inviato dal JavaScript come un normale modulo, come se il tuo utente abbia fatto clic su "Invia" senza alcun JS. Quindi puoi gestirlo allo stesso modo di un normale invio di moduli. – brian

+0

Se si tratta di moduli Web ASP.NET, è probabile che si desideri aggiungere un campo di testo nascosto nel caricamento iniziale e inserire il proprio ID client nel codice. Quindi, nel callback della stripe, utilizzare JQuery per impostare il valore di controllo sul token e attivare l'evento POSTBACK in modo che ASP.NET possa rebindare e trovare il lato server. – Matt

risposta

6

Grazie per i suggerimenti nei commenti. Dopo molte ricerche su internet e tirando i capelli, mi sono allontanato un po 'e sono tornato con questa soluzione.

  1. Realizzato il pulsante appena un ingresso HTML standard (non l'asp: Button)
  2. Ha ottenuto il postback informazioni che stava per essere inviato tramite il JavaScript Page_Load in questo modo

codice sottostante :

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); 
    } 
} 

Sembra come utilizzando il NameValueCollection (che vive in System.Collections.Specialized spazio dei nomi) mi ha dato la possibilità di afferrare quello che mi serviva da Request .Form estraendolo tramite nome variabile. Dal momento che ho aggiornato i nomi delle variabili, era semplicemente una questione di afferrarli e quindi di seguire la documentazione della libreria di Stripe .NET per ottenere il token ed elaborare il pagamento.

4

Voglio solo postare un commento alla risposta, ma non mi è ancora permesso. Quindi, questa non è davvero una risposta, più una risposta alle scoperte dell'OP stesso.

Sto facendo esattamente la stessa cosa, usando Stripe.js. Posso semplicemente prendere stripeToken usando Request.Form e ottenere tutti gli altri campi non c/c-correlati nel solito modo nel code-behind (ad es. Int Total = PaymentTotal.Value;); ma quello che sto notando non è tanto l'acquisizione dei dati, è che tu hai per gestirlo su Page_Load (o in un momento successivo nel ciclo di vita della pagina), perché l'evento onclick del pulsante Invia non viene mai effettivamente attivato , poiché il modulo viene effettivamente inviato utilizzando js e non il pulsante.

Quindi, essendo tutto letterale e un pò di rispondere alla domanda iniziale, non si può effettivamente ottenere i dati in caso pulsante di scatto, w/o sparare manualmente tale evento il postback (sto supponendo).

Speriamo di salvare qualcun altro un po 'di tempo per capire se vengono qui cercando di far funzionare insieme Stripe e .NET.

+0

concordato. In realtà sto scappando dallo stesso numero da un giorno. Quindi è un modo solo per gestirlo nel caricamento della pagina solo piuttosto nell'evento click sul pulsante sul codice?Poiché ho quasi 50 campi insieme ai campi obbligatori per Stripe per il processo di registrazione degli utenti interni. Sembra fattibile solo sul clic del pulsante. Altre saggi ogni volta che si verificano postback eseguirà il processo di striping. Il rimedio potrebbe essere quello di impostare il flag sul clic del pulsante e gestirlo sul caricamento della pagina nel controllo ispostback insieme al flag cliccato sul pulsante. –