【发布时间】:2014-12-25 15:49:39
【问题描述】:
我有一个 Asp.Net WEB API 2 项目,我想实现一个即时支付通知 (IPN) 侦听器控制器。
我找不到任何示例和 nuget 包。我只需要确认用户使用 Paypal 上的标准 html 按钮付款。这很简单。
所有 nuget 包都用于创建发票或自定义按钮。这不是我需要的
paypal 上的示例适用于经典的 asp.net,而不适用于 MVC 或 WEB API MVC
我确信已经有人这样做了,当我开始编码时,我有一种重新发明轮子的感觉。
有没有 IPN 监听控制器示例?
至少有一个 PaypalIPNBindingModel 来绑定 Paypal 查询。
[Route("IPN")]
[HttpPost]
public IHttpActionResult IPN(PaypalIPNBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
return Ok();
}
编辑
到目前为止,我有以下代码
[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/";
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.PostAsJsonAsync("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;
}
但是对于第 3 步,我尝试将我的模型发布为 json,但 paypal 返回一个 HTML 页面而不是 VALIDATED 或 INVALID。我发现我必须使用application/x-www-form-urlencoded,并且它的参数顺序相同。
如何获取请求 URL?
我会使用查询网址并将&cmd=_notify-validate 添加到其中
【问题讨论】:
-
CodeProject 上的this sample 有帮助吗?
-
另外,here's the IPN sample on GitHub 用于 asp.net。 (意味着在我之前的回复中包含这一点)。
-
谢谢。请查看我的编辑
-
查看 PayPal 开发者网站上的 Receiving an INVALID message from PayPal 页面。它准确地解释了您的响应 URL 应如何格式化。正如您所说,它必须包含您在通知中以完全相同的顺序收到的所有 URL 参数,但
cmd=_notify-validate在其他 URL 参数之前。 -
我的问题是我有一个 PaypalIPNBindingModel 对象而不是原始请求。我不能确定我使用的是相同的顺序。我正在尝试弄清楚如何获取原始帖子数据。
标签: c# asp.net-web-api paypal paypal-ipn