【问题标题】:PayPal IPN and PDT mixingPayPal IPN 和 PDT 混合
【发布时间】:2011-11-20 21:25:21
【问题描述】:

我已经在我的网站上实施了 PayPal。当用户选择支付服务时,他将被重定向到他提交付款的支付伙伴,最后他被重定向回我的网站。
在这里,我混合了 IPN 和 PDT。付款后,我收到 IPN 消息并将所有变量保存在数据库中。
当用户回到这里的站点时,我得到他的 TXN_ID 和 UserID(来自会话)并将其存储在数据库中。
我在某处读到混合 pdt 和 ipn 是不好的。有没有更好的方法来使用 UserID 保存 IPN 变量?我可以以某种方式将 UserId 发送给 pay pal,然后在用户完成付款后通过 IPN 消息获取它吗?

很抱歉,我必须重新提出问题。我添加了“发票”字段以将用户 ID 发送给支付宝。但是,当我下次尝试使用相同的用户 ID 付款时,我被重定向到 pay pal 页面并收到此错误消息:

此帐单已支付。如需更多信息,请 联系商家。

这表明发票不是将用户 ID 发送给 pay pal 的好选择。

我尝试将用户 ID 放在“自定义”字段中。

<input name="custom" type="hidden" id="custom" value="<%= UserInfo.UserID%>">

但我在 IPN 消息中得到的只是:

自定义=%3C%25%3D+UserInfo.UserID%25%3E

【问题讨论】:

    标签: asp.net paypal paypal-ipn


    【解决方案1】:

    我这样做的方式是使用发票字段。这是一个您可以发送 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 多次付款 - 不限制数量 收到的发票付款。选择此选项可能会导致 需要退款的重复付款。

    滚动到页面底部并点击保存按钮。

    另一种选择是使用用户 ID + 一个随机数创建您的发票 ID。这将使它独一无二。

    请参阅下面的示例代码以获取唯一的发票编号。

    var r = Math.floor(Math.random()*100000);
    var invoice = userid + "-" + r;
    

    您也可以使用日期和时间来代替随机数。

    var d = new Date();
    var invoice = userid + "-" + d;
    

    在 PayPal 的回复中,您只需丢弃破折号之后的内容。

    我希望这会有所帮助。

    【讨论】:

    • 所以通过“InvoiceField”将我的“UserID”发送到 payPal 是完全安全的吗?你能提供一些代码示例如何发送吗?
    • 对不起,我不想无聊,但我又错过了一件事情。我有 PayPal 生成的“PayOnceButton”代码。我现在添加了发票字段。但是如何为它设定价值呢?
    • 在开始执行此操作之前,请确保在您的 PayPal 帐户的“付款接收首选项”或“网站付款首选项”中取消选中“阻止重复付款”。否则,它将阻止同一用户 ID 的后续付款。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2013-02-17
    • 2011-02-19
    • 2018-02-10
    • 2017-08-09
    • 2013-10-03
    相关资源
    最近更新 更多