2013-08-04 7 views
5

Ich weiß es ist eine rudimentäre Fragen, aber ich bin auf Webforms aus der Praxis. Ich verwende Stripe.js zum ersten Mal und möchte es in Verbindung mit stripe.net verwenden, um die Client-Seite zu verarbeiten. Hier ist der Client-Code:Wie bekomme ich 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> 

Der letzte Aufruf in JS erstellt ein JSON-Objekt, das ich möchte wissen, wie man auf der C# Seite auf den Button klicken zu erhalten:

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

Ich wollte mich die JavaScript-Implementierung zu machen, um die PCI-Konformität zu vermeiden. Komme ich das falsch? Sollte es alles Stripe.net sein, alles zu verarbeiten und die js komplett zu überspringen? Oder wenn das richtig ist, wie bekomme ich die Formular-Post-Daten im Button-Klick-Event?

+1

Das ist der Ansatz, den wir empfehlen. Ihr Formular wird vom JavaScript wie ein normales Formular gesendet, so als ob Ihr Benutzer auf "Senden" ohne JS geklickt hätte. Sie können damit genauso verfahren wie eine normale Formularübergabe. – brian

+0

Wenn Sie ASP.NET-Webformulare verwenden, möchten Sie wahrscheinlich ein ausgeblendetes Textfeld bei der anfänglichen Ladeoperation hinzufügen und die ClientID fest codieren. Verwenden Sie dann in Ihrem Stripe-Callback JQuery, um diesen conrols-Wert für Ihr Token festzulegen und Ihr POSTBACK-Ereignis auszulösen, damit ASP.NET es neu binden und auf der Serverseite finden kann. – Matt

Antwort

6

Danke für die Tipps in den Kommentaren. Nach viel Durchsicht des Internets und Haare ziehen, ging ich für eine Weile weg und kam mit dieser Lösung zurück.

  1. die Taste nur ein Standard-HTML-Eingabe gemacht (nicht die asp: Button)
  2. erhielt die gepostete zurück Informationen, die

-Code Behind wie so in dem Ereignis Page Load über das JavaScript gesendet wurde :

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

scheint, wie die Namevaluecollection mit (die in System.Collections.Specialized Namespace lebt) gab mir die Möglichkeit, von der Anfrage zu packen, was ich brauchte .Form, indem Sie es über Variablennamen herausziehen. Da ich die Variablennamen neu erfand, ging es einfach darum, sie zu erfassen und dann der Stripe .NET-Bibliotheksdokumentation zu folgen, um das Token zu erhalten und die Zahlung zu verarbeiten.

4

Ich möchte nur einen Kommentar auf die Antwort posten, aber ich darf noch nicht. Dies ist also keine wirkliche Antwort, sondern eher eine Antwort auf die eigenen Ergebnisse des OP.

Ich mache genau die gleiche Sache, mit Stripe.js. Ich kann stripeToken einfach mit Request.Form greifen und alle anderen nicht-c/c-bezogenen Felder auf die übliche Weise im Code-Behind holen (z. B. int Total = PaymentTotal.Value;); aber was ich notiere ist nicht so sehr die Daten zu greifen, es ist, dass Sie haben, um es auf Page_Load zu behandeln (oder während eines späteren Punktes im Seitenlebenszyklus), weil das Onclick-Ereignis der Submit-Taste nie tatsächlich ausgelöst wird , da das Formular tatsächlich über js und nicht über die Schaltfläche gesendet wird.

Also, alle buchstäblich und irgendwie die ursprüngliche Frage zu beantworten, können Sie nicht tatsächlich die Daten in der Schaltfläche klicken Ereignis, ohne dieses Ereignis manuell auf Postback feuern (ich vermute).

Hoffentlich speichern Sie jemand anderes einige Zeit herauszufinden, ob sie hierher kommen, um Stripe und .NET zusammenarbeiten zu machen.

+0

Einverstanden. Eigentlich laufe ich seit einem Tag aus demselben Thema. Ist das also ein Weg nur um dies beim Page Load nur eher in Button-Click-Ereignis auf Code dahinter zu behandeln?Da ich fast 50 Felder zusammen mit erforderlichen Feldern für Stripe für den internen Benutzerregistrierungsprozess habe. Es erscheint nur auf Knopfdruck machbar. Ansonsten wird jedes Mal, wenn Post-Back passiert, ein Stripe-Prozess ausgeführt. Abhilfe könnte sein, das Flag beim Klick auf die Schaltfläche zu setzen und beim Laden der Seite in der Rückverfolgung zusammen mit dem angeklickten Flag zu verwenden. –