2013-08-04 45 views
5

Tôi biết một câu hỏi sơ bộ, nhưng tôi không thực hành trên các biểu mẫu web. Tôi đang sử dụng Stripe.js lần đầu tiên và muốn sử dụng nó cùng với stripe.net để xử lý phía máy khách. Đây là mã khách hàng:làm thế nào để có được js POST trong 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> 

Cuộc gọi cuối cùng trong JS tạo ra một đối tượng JSON mà tôi muốn biết làm thế nào để có được trên trang C# vào nút bấm:

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

Tôi muốn để thực hiện javascript để tránh phải tuân thủ PCI. Tôi có đang tiếp cận điều này không chính xác? Có nên tất cả Stripe.net đều xử lý mọi thứ và bỏ qua toàn bộ js không? Hoặc nếu điều này đúng, làm thế nào tôi có thể lấy dữ liệu bài đăng biểu mẫu trong sự kiện nhấp vào nút?

+1

Đó là cách tiếp cận mà chúng tôi đề xuất. Biểu mẫu của bạn sẽ được gửi bởi JavaScript như một biểu mẫu bình thường, như thể người dùng của bạn đã nhấp vào "gửi" mà không có JS nào cả. Vì vậy, bạn có thể xử lý nó theo cách tương tự như một hình thức nộp bình thường. – brian

+0

Nếu biểu mẫu web ASP.NET của nó, bạn có thể muốn thêm một trường văn bản ẩn trong tải ban đầu của bạn và mã cứng ClientID của nó. Sau đó, trong callback sọc của bạn sử dụng JQuery để thiết lập giá trị conrols để mã thông báo của bạn và kích hoạt sự kiện POSTBACK của bạn để ASP.NET có thể rebind và tìm thấy nó phía máy chủ. – Matt

Trả lời

6

Cảm ơn các mẹo trong nhận xét. Sau nhiều sự chăm chú của internet và kéo tóc, tôi bước đi một chút và quay trở lại với giải pháp này.

  1. Made nút chỉ là một html đầu vào tiêu chuẩn (không phải là asp: Button)
  2. Got thông tin đăng lại rằng đã được gửi thông qua JavaScript trong sự kiện Page_Load như vậy

Mã Đằng sau :

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

Có vẻ như sử dụng NameValueCollection (trong không gian tên System.Collections.Specialized) đã cho tôi khả năng lấy những gì tôi cần từ Yêu cầu .Form bằng cách kéo nó ra thông qua tên biến. Kể từ khi tôi mới tên biến, nó chỉ đơn giản là một vấn đề lấy chúng và sau đó theo tài liệu thư viện Stripe .NET để có được mã thông báo và xử lý thanh toán.

4

Tôi chỉ muốn đăng nhận xét cho câu trả lời nhưng tôi chưa được phép. Vì vậy, điều này không thực sự là một câu trả lời, nhiều hơn một phản ứng với những phát hiện của OP.

Tôi đang làm điều tương tự, sử dụng Stripe.js. Tôi có thể chỉ cần lấy sọcToken bằng cách sử dụng Request.Form và nhận tất cả các trường liên quan khác không phải c/c theo cách thông thường trong mã-đằng sau (ví dụ: int Total = PaymentTotal.Value;); nhưng điều tôi lưu ý không quá nhiều về việc lấy dữ liệu, đó là bạn để xử lý nó trên Page_Load (hoặc trong một số thời điểm sau đó trong chu kỳ trang), vì sự kiện onclick của nút Gửi không bao giờ thực sự bị sa thải , vì biểu mẫu thực sự được gửi bằng cách sử dụng js chứ không phải nút.

Vì vậy, tất cả là chữ và kinda đều trả lời câu hỏi ban đầu, bạn không thể thực sự lấy dữ liệu trong sự kiện nhấp nút, hãy kích hoạt sự kiện đó theo cách thủ công trên postback (tôi phỏng đoán).

Hy vọng sẽ tiết kiệm cho người khác một thời gian để tìm hiểu xem liệu họ có đến đây để làm cho Stripe và .NET hoạt động cùng nhau hay không.

+0

Đồng ý. Trên thực tế tôi đang chạy từ cùng một vấn đề kể từ một ngày. Vì vậy, đó là một cách chỉ để xử lý này trên Page Load chỉ thay vì bấm vào nút sự kiện trên mã phía sau?Vì tôi có gần 50 trường cùng với các trường bắt buộc cho Stripe cho quá trình đăng ký người dùng nội bộ. Có vẻ như chỉ khả thi khi nhấp vào nút. Khác khôn ngoan mỗi khi đăng lại xảy ra nó sẽ thực hiện quá trình sọc. Biện pháp khắc phục có thể là đặt cờ khi nhấp vào nút và xử lý nó khi tải trang trong kiểm tra ispostback cùng với cờ được nhấp vào nút. –