gpt4 book ai didi

c# - 在 ApiController 中获取原始发布请求

转载 作者:可可西里 更新时间:2023-11-01 08:42:56 24 4
gpt4 key购买 nike

我正在尝试实现 Paypal 即时付款通知 (IPN)

protocol

  1. PayPal HTTP 向您的监听器发送 IPN 消息,通知您有事件发生。
  2. 您的监听器向 PayPal 返回一个空的 HTTP 200 响应。
  3. 您的监听器 HTTP 将完整的、未更改的消息发回给 Paypal ;消息必须包含相同的字段(以相同的顺序)作为原始消息并以与原始消息。
  4. PayPal 发回一个单词 - 要么已验证(如果消息与原始匹配)或 INVALID(如果消息与原创)。

到目前为止我有

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

我的问题是我不知道如何将原始请求以相同的顺序发送到 Paypal 的参数。我可以用我的 PaypalIPNBindingModel 构建一个 HttpContent,但我不能保证顺序。

有什么办法可以实现吗?

谢谢

最佳答案

我认为您不应该使用参数绑定(bind),而应该自己阅读原始请求。随后,您可以自己反序列化到模型中。或者,如果您想利用 Web API 的模型绑定(bind),同时访问原始请求正文,这是我能想到的一种方法。

当Web API将请求体绑定(bind)到参数中时,请求体流被清空。随后,您将无法再次阅读它。

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

因此,您必须在模型绑定(bind)在 Web API 管道中运行之前阅读正文。如果您创建一个消息处理程序,您可以在那里准备主体并将其存储在请求对象的属性字典中。

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

然后,您可以从 Controller 中检索正文字符串,如下所示。此时,您拥有原始请求主体和参数绑定(bind)模型。

[HttpPost]
public void IPN(PaypalIPNBindingModel model)
{
var body = (string)(Request.Properties["body"]);
}

关于c# - 在 ApiController 中获取原始发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26661418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com