我有一个 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;
}
但在第三步中,我试图将我的模型作为json发布,但Paypal返回的是HTML页面而不是VALIDATED或INVALID。我发现我必须使用 application/x-www-form-urlencoded
并且参数必须按相同的顺序排列。
我该如何获取请求URL?
我会使用查询URL,并添加&cmd=_notify-validate
。
cmd=_notify-validate
在其他URL参数之前以完全相同的顺序包括您收到的所有URL参数。 - Jason Z