我这样做的方式是使用发票字段。这是一个您可以发送 PayPal 的字段,他们会在回复中将其发回。这就是我识别从 PayPal 返回的交易的方式。
就我而言,我不会同时处理 PDT 和 IPN 消息。我只处理最先击中我的那个。当第二条消息(PDT 或 IPN)到达时,我会检查我是否已经处理了该事务,然后将其丢弃。
另外,请不要忘记您需要验证邮件是否来自 PayPal。收到 PDT 或 IPN 消息后,您需要使用您的唯一 Auth_id 和他们在原始消息中发送的 tx 令牌发回 PayPal。您不应依赖原始消息中的任何字段。
一旦 PayPal 收到您的确认请求,它将向您发送第二条包含交易详情的消息。这是您应该依赖的。
我认为处理同一事务的 PDT 和 IPN 消息没有任何好处。话虽如此,我确实鼓励您同时实施这两种方法,因为它们都不能保证能到达您的手中。
编辑以包括如何将发票传递给 PayPal
要将发票传递给 PayPal,只需创建如下字段:
<input type="hidden" name="invoice" value=$uniquevaluecreatedbyyourapplication>
唯一 id 可以是您的用户 id。
发到 PayPal 的帖子类似于
paypal/or/sandbox/address?all the other fields&invoice=123456
Paypal 将在 PDT 和 IPN 消息中发回发票。
编辑 - 非唯一发票 ID 号
我做了进一步的研究,您可以将 PayPal 配置为接受同一发票 ID 的多笔交易,或者每个发票 ID 只接受一笔交易。请参阅以下直接来自 PayPal 网站的信息:
阻止意外付款
您可以选择是否接受具有相同发票 ID 的付款或
在发票 ID 已被使用时阻止付款。
当您收到买家的付款时,您可以添加一个可选的
跟踪付款的发票 ID 字段;买家不会看到此 ID。一种
每笔交易的买方发票 ID 必须是唯一的。如果支付宝
收到带有发票 ID 的付款,该发票 ID 用于另一个
付款,PayPal 将不接受交易。
要设置阻止此类付款的选项:
通过https://www.paypal.com 登录您的 PayPal 帐户。
“我的帐户概览”页面打开。
单击配置文件子选项卡。
“个人资料摘要”页面打开。
在“销售偏好”列中,点击“收款”
首选项链接。
付款接收首选项页面打开。
向下滚动页面至阻止意外付款部分,如图所示
下面。
选择以下选项之一:
滚动到页面底部并点击保存按钮。
另一种选择是使用用户 ID + 一个随机数创建您的发票 ID。这将使它独一无二。
请参阅下面的示例代码以获取唯一的发票编号。
var r = Math.floor(Math.random()*100000);
var invoice = userid + "-" + r;
您也可以使用日期和时间来代替随机数。
var d = new Date();
var invoice = userid + "-" + d;
在 PayPal 的回复中,您只需丢弃破折号之后的内容。
我希望这会有所帮助。