【问题标题】:Verifying a Paypal transaction via POST information通过 POST 信息验证 Paypal 交易
【发布时间】:2012-02-25 11:12:40
【问题描述】:

我完全不知所措。我想我可能会被“误导”,但我会尽力解释我的情况。

想法

  • 我们有一个表格供用户购买积分。输入信用号码, 点击pp按钮。
  • 点击按钮后,会发布一个帖子来设置 事务日志信息并将其设置为待处理(工作正常)。
  • 在有效的退货后,它会继续提交贝宝表单(也可以)。
  • 用户被重定向到贝宝页面并付款(到目前为止一切顺利)。
  • 付款后,他们点击退货并被引导至“成功”页面(仍在工作)。
  • 到达此页面后,我会从 pp 获取帖子数据(哦,哦,这就是它变得粘滞的地方)
  • 验证数据是“真实”的 pp 数据并更新事务日志(如何!?)

我被告知的内容和我尝试过的内容

我最初打算使用 IPN 回发到 paypal 以验证收到的数据(确保它没有被欺骗),但是,我被告知出于成本目的并且必须设置“ipn 服务器” " 我们不能使用 IPN ....

好的,所以我打算使用 PDT,除了我在尝试中错过了一个重要步骤,或者它根本无法正常工作,因为我没有做对。这就是我迷路的地方,我尝试了十几种不同的方法,包括直接链接帖子,使用 sparks(用于 CI)来设置数据和调用 paypal 链接等等......

我已经查看了这里和其他六个论坛上的每个 paypal 问题,但似乎没有任何进展。

任何人都可以“清楚地”告诉我如何验证成功的贝宝交易的 POST 数据,甚至可以告诉我我是否被错误地告知了 IPN,因为我查看了文档但找不到什么有人告诉我,我也找不到我的解决方案。

我觉得自己很笨,请帮忙。

【问题讨论】:

  • “有人告诉我,出于成本考虑,必须设置“ipn 服务器”,我们不能使用 IPN”您不需要全新的服务器。您可以使用托管其他所有内容的普通 Web 服务器。
  • 这就是我的想法,我认为这只是让我无法编写我们的管理员不理解的代码,但他似乎也不理解常规的协议调用,因为我还没有得到任何解决方案
  • 来自 PayPal 的 IPN Listener 的示例代码,它也验证了 POST 数据。

标签: php paypal


【解决方案1】:

当您的用户单击 PayPal 按钮并转到 PayPal 时,当他们完成交易时,会向您选择的 URL 发送 IPN POST。因此,您不必拥有其他 Web 服务器。

当收到 IPN 请求时,PayPal 希望您按照确切的顺序将他们发送给您的整个 POST(包括所有字段)重新发送给他们,此时他们将返回“已验证”一词或“无效”。如果已验证,则执行您需要做的任何事情来将您的 txn 日志从待处理切换为已验证。此外,您在按钮中包含的任何信息(您的按钮实际上是 form,因此您可以包含自己的字段)包含在 POST 中。用于保留“交易 ID”或其他一些标识符以映射回您的交易。

如果 IPN 失败,它将以 n+4 分钟的增量重新发送几天(其中 n 是上次等待的时间 - 4 分钟,接下来是 8 分钟,接下来是 12 分钟,等等)。

【讨论】:

    【解决方案2】:

    感谢 IPN 信息的更新,终于让它正常工作了。 我的解决方案在我的表单中添加了以下行:

    <input type="hidden" name="notify_url" value="<?= site_url('payment/notifyTest'); ?>">
    

    然后在 notifyTest 函数中我运行了这个:

        $pDat = $this->input->post(NULL, TRUE);
        $isSandBox = array_key_exists('test_ipn', $pDat) && 1 === (int)$pDat['test_ipn'] ? TRUE : FALSE;
        $verifyURL = $isSandBox ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
        $token = random_string('unique');
    
        $request = curl_init();
        curl_setopt_array($request, array
        (
            CURLOPT_URL => $verifyURL,
            CURLOPT_POST => 0,
            CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $pDat),
            CURLOPT_RETURNTRANSFER => 0,
            CURLOPT_HEADER => 0,
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_CAINFO => 'cacert.pem',
        ));
    
        $response = curl_exec($request);
        $status   = curl_getinfo($request, CURLINFO_HTTP_CODE);
    
        curl_close($request);
    
        if($status == 200 && $response == 'VERIFIED') {
            //  SUCCESS
            $data = array (
                ... => ...
            );
            $this->db->insert('transactions', $data);
        }
        else {
            //  FAILED
            $data = array (
                ... => ...
            );
            $this->db->insert('transactions', $data);
        };
    

    我们发现的重要区别 -> 不要将您的 CURL VARS 设置为真或假 使用 0 表示正确,使用 1 表示错误,这可能听起来很愚蠢,但它很糟糕!!!

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 2014-08-05
      • 2011-01-26
      • 2023-03-17
      • 2016-01-26
      • 1970-01-01
      • 2013-01-11
      • 2013-06-14
      • 2020-08-13
      相关资源
      最近更新 更多