【发布时间】:2014-12-26 23:47:20
【问题描述】:
我正在尝试实施 Paypal 即时付款通知 (IPN)
protocol 是
- PayPal HTTP 向您的听众发送一条 IPN 消息,通知您发生了事件。
- 您的侦听器向 PayPal 返回一个空的 HTTP 200 响应。
- 您的侦听器 HTTP 将完整的、未更改的消息发送回 贝宝;消息必须包含相同的字段(以相同的顺序) 作为原始消息并以与原始消息相同的方式进行编码 原始消息。
- PayPal 发回一个单词 - 已验证(如果消息 匹配原件)或无效(如果消息与原件不匹配) 原创)。
到现在为止
[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,但我不能保证顺序。
有什么方法可以实现吗?
谢谢
【问题讨论】:
-
是不是不能从 PayPal 接收它作为字符串,然后你可以自己反序列化它,做任何你需要做的事情来验证它,然后 POST 他们发回的字符串?
-
谢谢,是的,我想,但我认为使用 asp.net 的绑定模型会更优雅,但如果没有其他方法,我会自己反序列化。
标签: c# asp.net asp.net-web-api paypal