什么是即时付款通知IPN
当您收到新的付款交易或者已发生的付款交易的状态发生变化时,PayPal都将异步(即不作为网站付款流程的一部分) 发送付款详细数据到您所指定的URL,以便您了解买家付款的具体情况并做出相应的响应。这个过程我们称作即时付款通知(简称 IPN)。示意图如下:
图 1 IPN通知示意图
• 客户点击“付款”按钮向您的账户付款;
• PayPal接受到客户的付款后,向您的服务器指定的URL通过POST方式发送IPN;
• 在您的服务器收到IPN之后,您必须将收到的POST信息对原样返回给PayPal进行验证,PayPal通过此方法帮您防范欺骗或“中间人”攻击;(对IPN信息的验证过程我们称之为通知确认);
• PayPal返回验证信息,通过验证为VERIFIED,不通过则为INVALD;
• 根据验证信息处理付款明细;
注:每次付款您可能收到多个IPN信息,一般来说直到收到IPN信息中的付款状态为Completed为止。
IPN数据包含了整个付款过程的详细信息,通过获取并分析它您可以:
• 自定义网站对客户购物进行实时回复:您可以以email或其他方式通知客户付款的状态;
• 自动履行相关操作:当收到IPN数据并确认付款状态已经完成后,您就可以立刻启动向买家发货的流程,也可以为买家进行虚拟货币的充值或者以某种方式将虚拟商品的卡号和密码发送给买家;
• 记录交易信息到您的数据库中;
如何启用IPN?
启用IPN有两种方法:
一种是在您的PayPal账户里进行全局设置,设置方法如下:
• 登录到您的PayPal帐户,点击“Profile”;
• 点击右边列表栏中“Instant payment Notification Preferences”打开即时付款通知习惯设定页面;
• 按“编辑”按钮后打开如6-1所示页面;
• 输入用于接收IPN的通告URL并在选中图中所示的勾选框;
图 6-1 即时付款通知习惯设定
另一种是在每笔交易的付款按钮中通过定义变量notify_url来进行设定,示例如下:
注:
• 上面的通告URL和notify_url就是PayPal向您发送IPN数据的URL;这个URL是您的后台处理程序,只用于处理从 PayPal处接受到的IPN信息,您可以将这些信息写入数据库,也可以写文件,但是不能通过浏览器方式显示给您的客户看;
• 如果您希望在不同的URL接收IPN(例如:在您需要区分对您各个不同网站的付款时),请使用变量notify_url 。对于每笔付款,PayPal会保存特定付款的notify_url的值,对该笔付款的任何后续更新都将发送到此notify_url;
• 如果您在付款按钮中没有设定变量notify_url,则将使用您用户信息中设置的URL;否则它将覆盖您用户信息中设置的URL而采用变量notify_url中设置的值;
变量列表
完整的IPN变量列表,请访问IPN&PDT变量列表。
代码生成器
PayPal-tech.com提供了一个IPN的代码生成器,你可以根据你的编程语言选择。
其他资源
订单管理集成指南(PDF,2.7MB)
PayPal开发者论坛中IPN部分。
关于验证
bool VerifyIPN()
{
string strFormValues = Request.Form.ToString();
string strNewValue;
string strResponse;
string serverURL = "https://www.sandbox.paypal.com/cgi-bin/webscr";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serverURL);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
strNewValue = strFormValues + "&cmd=_notify-validate";
req.ContentLength = strNewValue.Length;
StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(strNewValue);
stOut.Close();
StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
stIn.Close();
return strResponse == "VERIFIED";
}
这段代码的作用是判断IPN信息是否来自Pyapal,如果不进行判断,那么恶意用户完全可以模拟一个信息post到你的网站上,让你认为订单已经完成支付,所以,必须首先对接受到的信息进行验证。
代码的基本原理,serverURL定义了验证地址,sandbox为:https://www.sandbox.paypal.com/cgi-bin/webscr,Paypal.com就是https://www.paypal.com/cgi-bin/webscr。
将paypal发送过来的所有信息加上一个&cmd=_notify-validate参数,表示对这个信息进行验证,全部发送回paypal验证,如果信息确实存在,则返回VERIFIED字符串。
验证成功后,就可以用如下形式获得交易信息:
string ppTx = Request.Form["txn_id"].ToString();
string ppStatus = Request.Form["payment_status"].ToString();
string ppDate = Request.Form["payment_date"].ToString();
string ppItem = Request.Form["item_name"].ToString();
string ppPrice = Request.Form["mc_gross"].ToString();