通过POST信息验证Paypal交易

时间:2012-02-02 19:10:54

标签: php paypal

我完全失去了。我想我可能会“误解”,但我会尽力解释我的情况。

  

理念

  • 我们有一张表格供用户购买积分。输入信用卡号, 点击pp按钮。
  • 点击按钮后,会设置一个帖子来设置 事务日志信息并将其设置为挂起(工作正常)。
  • 在有效回复后,它会继续提交paypal表格(也可以)。
  • 用户被重定向到paypal页面并付款(到目前为止一直很好)。
  • 付款后,他们点击退货并转到“成功”页面(仍在工作)。
  • 到达此页面后,我会从pp中收集帖子数据(呃哦,这里有粘性的地方)
  • 验证数据是否为“true”pp数据并更新事务日志(HOW!?)
  

我被告知的事情&我试过的是什么

我最初会使用IPN回到PayPal来验证收到的数据(确保它没有被欺骗),但是,我被告知为了成本目的并且必须设置“ipn服务器” “我们不能使用IPN ....

好的,所以我会使用PDT,除非我错过了我尝试的重要一步,或者ISNT正在工作,因为我没有做正确的事情。这是我迷失的地方,我尝试了十几种不同的东西,包括直接链接帖子,使用sparks(用于CI)来设置数据并调用paypal链接等...

我已经查看了这里和其他六个论坛上的每个paypal问题,似乎无法做任何事情。

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

我觉得很蠢,请帮帮忙。

2 个答案:

答案 0 :(得分:2)

当您的用户点击PayPal按钮并转到PayPal时,当他们完成交易时,会对您选择的网址进行IPN POST。因此,您不必拥有其他Web服务器。

当IPN请求进入时,PayPal希望您按照确切的顺序将他们向您发送的整个POST重新发送给他们,包括所有字段,此时他们将返回“已验证”字样或'无效'。如果已经过验证,那么请执行您需要执行的任何操作,将txn日志从待处理状态切换为已验证状态。此外,您在按钮中包含的任何信息(您的按钮实际上是form,因此您可以包含自己的字段)包含在POST中。用于保留“交易ID”或其他标识符以便映射回您的交易。

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

答案 1 :(得分:0)

由于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);
    };

我们发现的重要差异 - &gt; 不要将您的CURL VARS设置为TRUE或FALSE 使用0表示正确,1表示错误,可能声音愚蠢,但是它已经过了!