Paypal NVP与IPN确认-什么将它们联系在一起

Paypal NVP与IPN确认-什么将它们联系在一起,paypal,paypal-ipn,confirmation,nvp,Paypal,Paypal Ipn,Confirmation,Nvp,我正在使用PayPal和NVPAPI(使用PHP)进行快速结账。在将用户重定向到Paypal之前,我正在数据库中创建发票记录。如果用户在处理后没有返回我的站点,我将使用IPN确认购买,然后更新发票记录以确认付款。我仍然处于沙箱模式,并试图找出如何将使用NVP启动的事务与使用IPN获得的确认联系起来 我需要验证在NVP中发送的“PAYMENTREQUEST\u n\u INVNUM”是否会在IPN帖子中作为“发票”返回 在我上线之前,我似乎无法实际测试这一点,因为沙盒IPN在NVP启动的沙盒事务中

我正在使用PayPal和NVPAPI(使用PHP)进行快速结账。在将用户重定向到Paypal之前,我正在数据库中创建发票记录。如果用户在处理后没有返回我的站点,我将使用IPN确认购买,然后更新发票记录以确认付款。我仍然处于沙箱模式,并试图找出如何将使用NVP启动的事务与使用IPN获得的确认联系起来

我需要验证在NVP中发送的“PAYMENTREQUEST\u n\u INVNUM”是否会在IPN帖子中作为“发票”返回

在我上线之前,我似乎无法实际测试这一点,因为沙盒IPN在NVP启动的沙盒事务中似乎不处于活动状态-这是正确的吗


谢谢你的帮助

您可以在沙箱中进行测试。但是如果您使用的是“PayPal NVP”,我假设您使用的是PayPal Express Checkout并调用
SetExpressCheckout
DoExpressCheckoutPayment
API。
如果是这样的话,您实际上不需要IPN,因为只有在您调用
DoExpressCheckoutPayment
时,事务才会完成

换句话说,买家将始终被重定向到您在
SetExpressCheckout
中指定的返回URL,并且当您在此返回页面上调用
DoExpressCheckoutPayment
时,交易完成(或未完成)

要获取发票号码,可以调用
GetExpressCheckoutDetails
,并提供先前检索到的令牌(它还附加到RETURNURL的get中)


最后,检查
DoExpressCheckoutPayment
API响应中的
PAYMENTSTATUS=Completed
,查看事务是否已完成。

感谢Robert对流程的清晰介绍-尤其是useraction=commit

我终于意识到我可以在我的测试卖家的沙箱中打开IPN,并用IPN一起测试NVP。我能够验证PAYMENTREQUEST_0_INVNUM是否与IPN POST中的“INVOICE”参数匹配


我将使用自定义字段从我的系统传递客户电子邮件,以防他们使用不同的电子邮件登录paypal,因此允许我使用电子邮件/发票号码对进行确认。

您可以使用自定义字段作为传递变量。分配一个ID,并使用它链接交易。是的,自定义字段是我存储发票号的第二选择。我希望“发票”专用于此目的,如果需要,我可以使用custom处理其他一些数据。你是对的,我正在使用PayPal Express Checkout并调用SetExpressCheckout和DoExpressCheckoutPayment API。我的印象是,一旦用户点击Paypal网站上的“立即付款”按钮,它就会被支付。如果由于任何原因,用户在被重新路由之前与我的站点断开连接,我将永远无法获得销售确认。将IPN作为备份进行确认似乎更安全。不,只有在您调用
DoExpressCheckoutPayment
并在API响应中收到
PAYMENTSTATUS=Completed
后,交易才会最终完成。这就是为什么ExpressCheckout在PayPal网站的结帐窗口中不显示“立即付款”按钮的原因。相反,它允许用户授权付款,如果用户满意,他们可以单击“继续”按钮继续。“继续”按钮会自动返回到您的网站,没有延迟,没有麻烦,总是100%的时间。如果买家没有点击你的返回URL,这仅仅意味着他们不想继续进行PayPal交易。(尽管如此,IPN作为备份总是很好的,我同意。PAYMENTREQUEST\u 0\u INVNUM将匹配IPN帖子中的“invoice”参数).
useraction=commit
实际上只是将按钮上的文字从“继续”更改为“立即付款”,它仍然不会自动完成付款。是的,我是。通过useraction=commit,您可以跳过您端的订单审核页面(在返回URL上),它允许您自动调用DoExpressCheckoutPayment,但不会自动为您完成交易。