【问题标题】:Paypal - How to post additional data from paypal back to return_url?贝宝 - 如何将额外数据从贝宝发布回 return_url?
【发布时间】:2014-03-24 13:07:57
【问题描述】:

我一直在尝试将 paypal 集成到我的网站中,但遇到了问题。在我的网站上,我无需注册即可向客户销售产品。基本上,客户选择了他想要的产品,我从贝宝获得了我需要的所有运输信息。因此,当我的 IPN 返回VERIFIED 状态时,我为客户创建了一个订单并将其保存到数据库中。但是现在我想在他们完成交易时给他们一个礼品码。我知道,我可以在保存订单后通过电子邮件发送代码,但我想在他们从贝宝重定向回return_url 时向他们展示。由于在他们开始贝宝交易之前订单不存在,并且礼品代码在他们被重定向回来时创建,我不知道如何将礼品代码连接到他们的订单。我想我也许可以做到,如果贝宝向我的return_url 发送额外的数据,很可能是transaction_id。有没有什么方法可以实现这样的功能,而不必在我的表单中添加另一个隐藏的输入?我不希望人们继续愚弄 FireBug 并将变量更改为他们想要的。

我基于this article实现了IPN,并将订单保存在VERIFIED部分,如下所示:

if (strcmp($res, "VERIFIED") == 0) {
  $data['Order']['first_name']=$_POST["first_name"];
  $data['Order']['last_name']=$_POST["last_name"];
  $data['Order']['email']=$_POST["payer_email"];
  $data['Order']['res'] = $res;
  $this->Order->create();
  if ($this->Order->save($data)) {

  }
} else if (strcmp ($res, "INVALID") == 0) {            
  }
}

所以我从 paypal 获得了一些信息(first_name、last_name 和 payer_email)。但是,这发生在贝宝和网站之间的会话中,而不是用户和网站之间的会话中,所以我无法在 IPN 中声明一个变量,然后在用户从贝宝重定向到 return_url 时读取它。

【问题讨论】:

  • 抱歉,我可能不完全理解,但是“礼品码”是您的发明还是贝宝的功能?
  • 贝宝 IPN 应该有一个“txn_id”变量。 商家用于买家付款的原始交易识别号,案件依据该号码进行登记。
  • 问题是,paypal 不会将任何数据返回到 return_url,只会将所有信息传递给 IPN,而 IPN 并没有以任何方式连接(或者在我看来是这样)。我在某处读过,您可以在开始购买之前创建另一个输入并将一些数据传递给它,当用户被重定向回来时,这些数据将被返回,但我不想传递任何可以通过编辑更改的数据DOM。
  • 礼品码只是一个奖励,用户在完成购买时获得。然后他可以玩一个小游戏并赢得奖品,但他必须输入密码才能玩。
  • 我知道txn_id,但是当用户返回网站时,无法知道他刚刚完成的交易的id是什么。

标签: php paypal


【解决方案1】:

我想通了,我的 Paypal 帐户上没有打开 PDT,打开它后,transaction_id 使用 GET 发送到我的 return_url。我想我应该阅读更多。

有关如何打开 PDT 及其工作原理的更多信息: https://developer.paypal.com/webapps/developer/docs/classic/paypal-payments-standard/integration-guide/paymentdatatransfer/

return_url 的样子:

http://***/complete?tx=***&st=Pending&amt=***&cc=GBP&cm=&item_number=

【讨论】:

    【解决方案2】:

    所以我无法在 IPN 中声明一个变量,然后在用户从 paypal 重定向到 return_url 时读取它。

    是的,有,您使用custom 字段,该字段通常使用数据库中的 user_id 填充。您以如下形式(POST)将其传递给贝宝: <input type="hidden" name="custom" value="user_ID">

    Paypal 将始终在与您的任何后续通信中包含此数据。

    PDT 本身并不可靠!无法保证用户在付款后会回到您的网站(如果他点击“付款”按钮,得到“等待 10 秒前将您重定向回网站”,然后电源就停了?你会永远不要在 HTTP GET 中获取 PDT 数据)。

    因此,Paypal 建议您同时实施 IPN 和 PDT: https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNPDTAnAlternativetoIPN/

    使用 IPN,您一定会收到通知,因为它会发送多次,直到您回复“好的,我知道了”。相比之下,PDT 仅在用户返回您的网站时才发送一次。

    【讨论】:

    • 谢谢,但正如我在问题中所说,我不想发布任何可能由用户在浏览器中编辑的数据。我在 paypal 通知服务器付款时创建订单,如果用户被重定向回网站(带有交易 ID),我检查数据库并打印他的优惠券。
    • @Dygestor,希望我能正确理解您的意思,如果您担心您的计算机和 Paypal 之间传递的数据的安全性,因为数据是通过 POST 发送的,用户无法对其进行编辑在浏览器中。您当然也可以使用 https。如果我确实误解了,请进一步解释。
    • 也不确定您评论的最后一部分,因为您没有指定是否实施了 IPN、PDT 或两者,但用户不需要被重定向回网站进行交易成功的。在 Paypal 网站上交易完成后,用户计算机会立即爆炸,Paypal IPN 仍会通知您交易成功。重定向到您的网站只是一个很好的选择,而不是交易成功的强制性要求!如果你以这种方式实现你的逻辑,那是不正确的。希望有帮助
    • 如果我像您建议的那样使用隐藏输入,则输入的值可能会在提交之前进行编辑。我实现了 IPN 和 PDT(正如我在问题中所述)。由于用户没有登录,我只能在他从 PayPal 重定向回来时显示礼物代码,否则他的会话可能会过期/cookie 被删除......如果在他访问时有不同的方式来检查他的交易付款后的网站,那将是完美的。
    • 我们或许应该开个聊天室来讨论。添加隐藏的“自定义”字段是正确的方法,就像 IPN 和 PDT 一样,您可以通过将交易 ID 发送回 Paypal 来验证数据确实来自 Paypal,Paypal 再次响应数据(对于 PDT)。因此,任何人都无法按照您的建议篡改数据。
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2011-07-25
    • 2014-10-12
    • 2015-02-14
    • 2013-05-07
    • 2013-05-23
    • 2014-08-08
    • 2011-09-10
    相关资源
    最近更新 更多