C# paypal IPN communication
本文关键字:communication IPN paypal | 更新日期: 2023-09-27 18:15:43
我已经设置了IPN,以便在Paypal内与我的网站通信,但由于某种原因Paypal似乎没有调用它。下面是正在监听的方法,但它似乎没有得到任何东西。
谁能告诉我写字的方向?感谢[HttpPost]
public void paypalipn(string receiver_email, string receiver_id, string test_ipn, string txn_id, string payer_id, string payer_status, string payment_date, string payment_status, string payment_type)
{
string subject = "Audit - Paypal IPN ";
string buildemail = "receiver_email: " + receiver_email;
buildemail += "receiver_id: "+receiver_id;
buildemail += "<br>test_ipn: "+test_ipn;
buildemail += "<br>txn_id: " + txn_id;
buildemail += "<br>payer_id: " + payer_id;
buildemail += "<br>payer_status: " + payer_status;
buildemail += "<br>payment_date: " + payment_date;
buildemail += "<br>payment_status: " + payment_status;
buildemail += "<br>payment_type: " + payment_type;
Libraries.Email.Product.SendAudit(subject, buildemail);
}
如果您在PayPal账户中设置IPN,请确保它是启用的并且URL是正确的。此外,如果您在帐户中设置了IPN,您可以检查您的IPN历史记录,看看是否正在发送IPN帖子。它们将被标记为已发送、重试或失败。如果它们处于失败或重试状态,您可以单击该消息,如果您的服务器正在发回任何错误代码,则应在此处列出。此外,检查服务器上的错误日志,以确保脚本没有出错。
我这样做了:
public class IPNData
{
public string Response { get; set; }
public NameValueCollection Args { get; set; }
}
然后从请求中收集数据的方法,并将数据发送给Paypal进行验证。
IPNData GetIPNData()
{
var ipnData = new IPNData();
var param = Request.BinaryRead(HttpContext.Request.ContentLength);
var ipnStr = Encoding.ASCII.GetString(param);
ipnData.Args = HttpUtility.ParseQueryString(ipnStr);
// Return the ipn string to paypal for validation
ipnStr += "&cmd=_notify-validate";
var request = (HttpWebRequest)WebRequest.Create("https://www.paypal.com/cgi-bin/webscr");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = strRequest.Length;
using (var sw = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
sw.Write(ipnStr);
}
using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
{
// Response should be "VERIFIED"
ipnData.Response = sr.ReadToEnd();
}
return ipnData;
}
PaymentController.cs的订阅支付的例子,或者如果用户取消订阅。
public ActionResult PaypalIPNExample()
{
var ipn = GetIPNData();
if (ipn.Response != "VERIFIED")
{
// Do some logging
return null;
}
var type = ipn.Args["txn_type"];
var email = ipn.Args["payer_email"];
var transactionId = ipn.Args["txn_id"];
switch (type)
{
case "subscr_cancel":
UserService.CancelSubscription(email);
break;
case "subscr_payment":
if (ipn.Args["payment_status"].Equals("Completed"))
{
LogPayment(email, transactionId);
UserService.ExtendMembership(email);
}
break;
default:
// Do some logging?
break;
}
return Json("ok");
}
当我调试PayPal IPN响应时,我做了这样的事情:
string keysReceived = "";
foreach (string key in Request.Params.AllKeys)
keysReceived += "'r'nKey: " + key + ", Val: " + Request.Params[key];
string debugLogPath = HttpContext.Server.MapPath("/") + "debug_PayPalNotify.log";
System.IO.File.AppendAllText(debugLogPath, keysReceived);
注意全局对象Request的使用。您可以使用它做很多调试工作。