2014-10-30 10 views
9

Tôi đang cố gắng để thực hiện một Paypal tức thì thông báo thanh toán (IPN)Nhận bài yêu cầu nguyên liệu trong một ApiController

Các protocol

  1. PayPal HTTP POST nghe bạn một thông báo IPN thông báo cho bạn về một biến cố.
  2. Trình nghe của bạn trả về phản hồi HTTP 200 trống cho PayPal.
  3. Trình nghe HTTP của bạn ĐĂNG lại thông báo hoàn chỉnh, chưa được sửa đổi trở lại PayPal; tin nhắn phải chứa cùng các trường (theo cùng thứ tự) làm tin nhắn gốc và được mã hóa theo cùng cách với thông báo gốc .
  4. PayPal sẽ gửi lại một từ duy nhất - hoặc XÁC MINH (nếu thư khớp với thư gốc) hoặc INVALID (nếu thư không khớp với số bản gốc).

Cho đến nay tôi có

 [Route("IPN")] 
     [HttpPost] 
     public void IPN(PaypalIPNBindingModel model) 
     { 
      if (!ModelState.IsValid) 
      { 
       // if you want to use the PayPal sandbox change this from false to true 
       string response = GetPayPalResponse(model, true); 

       if (response == "VERIFIED") 
       { 

       } 
      } 
     } 

     string GetPayPalResponse(PaypalIPNBindingModel model, bool useSandbox) 
     { 
      string responseState = "INVALID"; 
      // Parse the variables 
      // Choose whether to use sandbox or live environment 
      string paypalUrl = useSandbox ? "https://www.sandbox.paypal.com/" 
      : "https://www.paypal.com/cgi-bin/webscr"; 

      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri(paypalUrl); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); 

       //STEP 2 in the paypal protocol 
       //Send HTTP CODE 200 
       HttpResponseMessage response = client.PostAsync("cgi-bin/webscr", "").Result; 

       if (response.IsSuccessStatusCode) 
       { 
        //STEP 3 
        //Send the paypal request back with _notify-validate 
        model.cmd = "_notify-validate"; 
        response = client.PostAsync("cgi-bin/webscr", THE RAW PAYPAL REQUEST in THE SAME ORDER).Result; 

        if(response.IsSuccessStatusCode) 
        { 
         responseState = response.Content.ReadAsStringAsync().Result; 
        } 
       } 
      } 

      return responseState; 
     } 

Vấn đề của tôi là tôi không thể tìm ra cách để gửi yêu cầu ban đầu để Paypal với các thông số theo thứ tự. Tôi có thể tạo một HttpContent với số PaypalIPNBindingModel của mình nhưng tôi không thể đảm bảo đơn đặt hàng.

Có cách nào tôi có thể đạt được điều này không?

Cảm ơn bạn

+0

Bạn không thể nhận nó như một chuỗi từ PayPal, bạn có thể tự mình thực hiện, làm bất cứ điều gì bạn cần làm để xác thực, sau đó POST chuỗi họ gửi lại? –

+0

Cảm ơn bạn, vâng tôi nghĩ nhưng tôi nghĩ rằng nó sẽ là thanh lịch hơn để sử dụng mô hình ràng buộc từ asp.net nhưng nếu không có cách nào khác, tôi sẽ làm deserialize bản thân mình. – Marc

Trả lời

12

Tôi tin rằng bạn không nên sử dụng ràng buộc tham số và chỉ đọc yêu cầu thô. Sau đó, bạn có thể deserialize vào mô hình chính mình. Ngoài ra, nếu bạn muốn sử dụng ràng buộc mô hình của API Web và đồng thời, hãy truy cập vào phần thân yêu cầu thô, đây là một cách tôi có thể nghĩ đến.

Khi Web API liên kết với cơ thể yêu cầu vào tham số, dòng yêu cầu cơ thể được làm trống. Sau đó, bạn không thể đọc lại.

[HttpPost] 
public async Task IPN(PaypalIPNBindingModel model) 
{ 
    var body = await Request.Content.ReadAsStringAsync(); // body will be "". 
} 

Vì vậy, bạn phải đọc phần thân trước khi mô hình ràng buộc chạy trong đường dẫn API Web. Nếu bạn tạo một trình xử lý tin nhắn, bạn có thể sẵn sàng cho cơ thể ở đó và lưu nó trong từ điển thuộc tính của đối tượng yêu cầu.

public class MyHandler : DelegatingHandler 
{ 
    protected async override Task<HttpResponseMessage> SendAsync(
              HttpRequestMessage request, 
              CancellationToken cancellationToken) 
    { 
     if (request.Content != null) 
     { 
      string body = await request.Content.ReadAsStringAsync(); 
      request.Properties["body"] = body; 
     } 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 

Sau đó, từ bộ điều khiển, bạn có thể truy xuất chuỗi nội dung, như thế này. Tại thời điểm này, bạn có phần thân yêu cầu thô cũng như mô hình ràng buộc tham số.

+0

Cảm ơn bạn, cuối cùng tôi đã không sử dụng mô hình ràng buộc. – Marc

+0

Tôi đoán không có cách nào để liên kết yêu cầu thô đó với mô hình theo cách thủ công? – Marc

+0

Bạn có ý gì khi liên kết yêu cầu thô với mô hình theo cách thủ công? Nếu bạn có nghĩa là tạo một thể hiện của đối tượng mô hình của bạn dựa trên yêu cầu thô, bạn phải tự làm điều đó. Tôi không quen thuộc với IPN nhưng dựa trên loại nội dung, bạn phải làm điều đó. Nếu có một trình định dạng kiểu phương tiện có sẵn, API Web sẽ làm điều đó cho bạn thông qua việc ràng buộc. – Badri

Các vấn đề liên quan