【问题标题】:Paypal IPN - How does it work?Paypal IPN - 它是如何工作的?
【发布时间】:2012-09-01 01:36:20
【问题描述】:

我需要简要说明 Paypal IPN 的工作原理。没有任何细节,只是基本的东西。

我应该如何设置我的 HTML 变量以及如何获取数据以验证来自 Paypal 的付款?这就是我需要知道的全部,我无法在某个地方找到关于这个的快速解释。

如果可能的话,也给我看一些代码行,肯定会有所帮助。

谢谢。

【问题讨论】:

  • 我发现这个 PHP 类非常有用(并且易于使用):github.com/Quixotix/PHP-PayPal-IPN
  • 这就是我要找的。感谢您的评论 - 如果这是一个答案,我肯定会接受它:D
  • 作为答案发布!很高兴它有帮助:)

标签: php html paypal payment


【解决方案1】:

IPN 是一种消息服务,PayPal 使用它来发送有关特定事件的通知,例如:

  • 即时付款,包括快速结帐、直接信用卡 付款和授权(授权的交易付款 但尚未收集)
  • 电子支票付款和相关状态,例如待处理、已完成或 被拒绝,以及因其他原因而未决的付款,例如 审查潜在欺诈行为
  • 定期付款和订阅操作
  • 与 交易

在许多情况下,触发 IPN 事件的操作是您网站上的用户操作。但是,其他操作可能会触发 IPN。例如,您网站的后台流程可能会调用 PayPal API 来退还付款,或者客户可能会通知 PayPal 有争议的费用。

您使用侦听器(有时称为处理程序)接收和处理 IPN 消息。此侦听器基本上是您在服务器上创建的网页或 Web 应用程序,它始终处于活动状态,并且具有允许它接受和验证从 PayPal 发送的 IPN 消息的代码,然后根据来自的信息在您的服务器上调用后端服务IPN 消息。 Web 应用程序等待 IPN 并(通常)将它们传递给适当响应的管理进程。 PayPal 提供了示例代码,可对其进行修改以实现一个侦听器,该侦听器处理从 PayPal 消息发送的 IPN。有关详细信息,请参阅实现IPN listener

有关详细信息和帮助,请访问:PayPal Instant Payment Notification Guide

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    代码

    我已经多次使用与此等效的 c#(和 PHP 版本看起来非常相似)。

    https://www.x.com/developers/PayPal/documentation-tools/code-sample/216623

    <?php
      //reading raw POST data from input stream. reading pot data from $_POST may cause serialization issues since POST data may contain arrays
      $raw_post_data = file_get_contents('php://input');
      $raw_post_array = explode('&', $raw_post_data);
      $myPost = array();
      foreach ($raw_post_array as $keyval)
      {
          $keyval = explode ('=', $keyval);
          if (count($keyval) == 2)
             $myPost[$keyval[0]] = urldecode($keyval[1]);
      }
      // read the post from PayPal system and add 'cmd'
      $req = 'cmd=_notify-validate';
      if(function_exists('get_magic_quotes_gpc'))
      {
           $get_magic_quotes_exits = true;
      } 
      foreach ($myPost as $key => $value)
      {        
           if($get_magic_quotes_exits == true && get_magic_quotes_gpc() == 1)
           { 
                $value = urlencode(stripslashes($value)); 
           }
           else
           {
                $value = urlencode($value);
           }
           $req .= "&$key=$value";
      }
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://www.paypal.com/cgi-bin/webscr');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.paypal.com'));
    // In wamp like environment where the root authority certificate doesn't comes in the bundle, you need
    // to download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
    // of the certificate as shown below.
    // curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
    $res = curl_exec($ch);
    curl_close($ch);
    
    // assign posted variables to local variables
    $item_name = $_POST['item_name'];
    $item_number = $_POST['item_number'];
    $payment_status = $_POST['payment_status'];
    $payment_amount = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
    
    
    if (strcmp ($res, "VERIFIED") == 0) {
        // check the payment_status is Completed
        // check that txn_id has not been previously processed
        // check that receiver_email is your Primary PayPal email
        // check that payment_amount/payment_currency are correct
        // process payment
    }
    else if (strcmp ($res, "INVALID") == 0) {
        // log for manual investigation
    }
    ?>
    

    概述

    基本上,PayPal 会与您联系,您会做出回应;这允许您验证是 PayPal 调用了您的 IPN 处理程序,而不是恶意方。在该验证步骤之后,您可以继续处理结果。我相信您知道,IPN 调用是在付款发生后进行的(也可以为付款生命周期中的其他事件进行配置)。您可以使用 IPN 更新系统状态(例如解锁购买的产品)。

    其他东西

    • 我用于 PayPal 的最后一个开发 URL 是 https://www.sandbox.paypal.com/cgi-bin/webscr(可能仍然有效)
    • IPN 页面/处理程序需要公开供 PayPal 调用。
    • 您需要在 PayPal 开发人员 UI 中配置 IPN 通知(这主要涉及向他们提供您的 IPN 页面的 URL)
    • 您可以将自定义信息与 PayPal 将发送回 IPN 处理程序的原始交易一起发送到 PayPal。我相信它是在一个名为“custom”的字段中传递的。

    【讨论】:

    • 谢谢。我认为 Paypal IPN 需要一些设置,但我从未想过我可以像这样直接使用它。我正在使用 Paypal 沙箱测试我的代码,这是否意味着我必须将此代码中的 www. 更改为 sandbox.
    • 您可能需要更改 URL...您还需要在开发人员区域设置测试 IPN 通知。 PayPal 配置 UI 令人困惑,但实际的 IPN 过程很简单。
    • 您还需要确保 PayPal 可以访问您的 IPN 处理程序,即它必须是公共 URL。
    • 它是公开的,它是一个简单的 url,看起来像这样 http://localhost/phpsite/donations/donate/index.php?mode=success,但是当我从贝宝返回到这个页面时,?mode=success 被一些 merchant 替换东西。 :\
    • @AlphaMale 链接的文档也有很好的流程信息:cms.paypal.com/cms_content/US/en_US/files/developer/…
    【解决方案3】:

    我发现非常有用(并且易于使用)this PHP class

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 2014-02-12
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2011-02-01
      • 2011-06-28
      • 2013-07-06
      相关资源
      最近更新 更多