stevethomas/paypal-ipn

此包已被弃用,不再维护。未建议替代包。
此包的最新版本(v1.0.2)没有可用的许可证信息。

PHP >=5.3.0 兼容的 composer PayPal IPN 监听器。

v1.0.2 2014-10-16 01:26 UTC

This package is not auto-updated.

Last update: 2020-01-24 15:22:46 UTC


README

#PayPal IPN Listener 构建状态

PHP >=5.3.0 的 PayPal IPN(即时支付通知)监听器。如果您正在寻找 < 5.3.0 兼容的 PayPal IPN 监听器,我强烈推荐 - https://github.com/Quixotix/PHP-PayPal-IPN(此包基于此包构建)。

###特性

  • 灵活、可扩展、基于组件的架构
  • 轻松切换沙箱和生产模式
  • 生成有用的报告(请求 & 响应)

###先决条件

  1. PHP >=5.3.0
  2. 熟悉 PayPal 即时支付通知系统的工作方式。见 https://cms.paypal.com/cms_content/US/en_US/files/developer/IPNGuide.pdf
  3. 此包可以使用 composer 安装,也可以手动集成。如果您不使用自动加载器,请确保将 src 目录中的所有 php 文件包含在内。

注意: 此文档中所有代码示例均假设您已手动包含所需的文件或已自动加载。

###架构

此包由一些组件构建而成,这些组件协同工作

  1. Listener - 监听并处理 IPN
  2. Request - 与 PayPal 通信
  3. Response - 处理 PayPal 的响应

请求和响应组件可以互换。如果您需要以某种特定方式实现请求或处理响应,可以通过扩展基本类(PayPal\Ipn\RequestPayPal\Ipn\Response)来实现。

PayPal\Ipn\Request 是抽象的,必须进行扩展。

默认提供 2 个请求组件

  1. PayPal\Ipn\Request\Curl - 通过 Curl 将请求发送到 PayPal
  2. PayPal\Ipn\Request\Socket - 通过套接字(fsock)将请求发送到 PayPal

提供 1 个响应组件

  1. PayPal\Ipn\Response - 保存 PayPal 响应的 HTTP 状态和主体

###工作流程

  1. 创建一个您想要用于与 PayPal 通信的请求组件的实例。如果您想要使用自定义的 响应 组件,首先实例化此组件,并将其传递给请求组件的构造函数。
  2. 配置请求组件所需的任何属性(设置自定义请求属性等)
  3. 创建一个监听组件的实例,并将其传递给请求组件的构造函数。
  4. 配置监听组件所需的任何属性(设置模式等)
  5. 通过调用 verifyIpn() 方法让监听组件验证 IPN。如果 IPN 被验证,此方法将返回 true,否则返回 false。这应该在 try catch 块中完成,因为监听器或请求组件可能会抛出异常。
  6. 您可以使用 getReport() 方法获取请求和响应的详细信息。
$request = new PayPal\Ipn\Request\Curl();

$request->secure(true); //dont need to do this as its done by default, just demonstrating configuring the request component

$listener = new PayPal\Ipn\Listener($request);

$listener->setMode('sandbox');

try {
	$status = $listener->verifyIpn();
}
catch (Exception $e) {
    $error = $e->getMessage();
    $status = false;
}

if ($status) {
	// verified...
}
else {
	// invalid...
	$report = $listener->getReport();
}

报告将如下所示

--------------------------------------------------------------------------------
[29/03/2013 11:30:55] - https://www.sandbox.paypal.com/cgi-bin/webscr
--------------------------------------------------------------------------------

RESPONSE STATUS:
----------------

200

RESPONSE BODY:
--------------

HTTP/1.1 200 OK
Date: Fri, 29 Mar 2013 18:30:54 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Set-Cookie: c9MWDuvPtT9GIMyPc3jwol1VSlO=KbVIUQRbqU9DF1_YFipOUOd5a832twJ54x4IHGQtD2cTQowuLRbR5rESIUNaFUiBLihRwW93-qALGl4neGpS9168qgX-Zsluj6TdeSEzLcxr9ovZ-RqlQ4rZDoe8xHVrPpSkF0%7c22hdUyjFPlSIxGOw4iFkWRKD1jIzUgoyTxXvFE1ZA7oUi8K-HNJ9-YYP99TXZxo_6l-xmm%7c3CJlR-97Ev4_99B9-k1RQeLIlne0QDovW2u5r0Oy2H08QUsZR5LOhVQ6Zgf6c0Wtzk7T5m%7c1364581855; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: cookie_check=yes; expires=Mon, 27-Mar-2023 18:30:55 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: navlns=0.0; expires=Thu, 24-Mar-2033 18:30:55 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: Apache=10.72.109.11.1364581854884362; path=/; expires=Sun, 22-Mar-43 18:30:54 GMT
X-Cnection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

VERIFIED

RAW POST:
---------

cmd=_notify-validate&address_state=CA&quantity=1&txn_id=412577516&last_name=Smith&mc_currency=USD&payer_status=verified&address_status=confirmed&tax=2.02&invoice=abc1234&shipping=3.04&address_street=123%2C+any+street&payer_email=buyer%40paypalsandbox.com&mc_gross1=9.34&item_name=something&first_name=John&business=seller%40paypalsandbox.com&verify_sign=Amg6IbBhoWJKr8kse4uOHb9jn02XA-ysmE.No2VnDuMQSdHCNtd7vYj9&payer_id=TESTBUYERID01&payment_date=11%3A30%3A05+29+Mar+2013+PDT&address_country=United+States&payment_status=Completed&receiver_email=seller%40paypalsandbox.com&payment_type=instant&address_zip=95131&address_city=San+Jose&mc_gross=12.34&mc_fee=0.44&residence_country=US&address_country_code=US¬ify_version=2.1&receiver_id=seller%40paypalsandbox.com&txn_type=web_accept&custom=xyz123&item_number=AK-1234&address_name=John+Smith&test_ipn=1

POST VARIABLES:
---------------

address_state = CA
quantity = 1
txn_id = 412577516
last_name = Smith
mc_currency = USD
payer_status = verified
address_status = confirmed
tax = 2.02
invoice = abc1234
shipping = 3.04
address_street = 123, any street
payer_email = buyer@paypalsandbox.com
mc_gross1 = 9.34
item_name = something
first_name = John
business = seller@paypalsandbox.com
verify_sign = Amg6IbBhoWJKr8kse4uOHb9jn02XA-ysmE.No2VnDuMQSdHCNtd7vYj9
payer_id = TESTBUYERID01
payment_date = 11:30:05 29 Mar 2013 PDT
address_country = United States
payment_status = Completed
receiver_email = seller@paypalsandbox.com
payment_type = instant
address_zip = 95131
address_city = San Jose
mc_gross = 12.34
mc_fee = 0.44
residence_country = US
address_country_code = US
notify_version = 2.1
receiver_id = seller@paypalsandbox.com
txn_type = web_accept
custom = xyz123
item_number = AK-1234
address_name = John Smith
test_ipn = 1

您可以在沙盒模式或生产模式之间切换。您可以通过在监听组件上调用 setMode($mode) 来完成此操作。对于 $mode 有效的值是 sandboxproduction。这将设置请求发送到的位置(PayPal的沙盒服务器或生产服务器)。内部这将调用请求组件的 setHost() 方法。

默认情况下,模式设置为 production(这是在监听器/请求组件构造函数中完成的)。

### 创建自定义请求组件

要创建自定义请求组件,您必须扩展 PayPal\Ipn\Request,因为它包含监听组件所依赖的基本方法和属性。只有一个抽象方法需要实现:send()。这是向PayPal发出请求的方法。

namespace PayPal\Ipn\Request;

use PayPal\Ipn\Request as IpnRequest;

class CustomRequest extends IpnRequest
{
	public function send()
	{
		//custom communication logic
	}
}

### 创建自定义响应组件

要创建自定义响应组件,您应该扩展 PayPal\Ipn\Response,因为它包含请求组件所依赖的基本方法和属性。没有需要实现的抽象方法,但任何用于 statusCodebody 的自定义设置器都必须设置相应的受保护属性。

namespace PayPal\Ipn\Response;

use PayPal\Ipn\Response as IpnResponse;

class CustomResponse extends IpnResponse
{
	public function setBody($body)
	{
		$this->body = $body;

		//do something else
	}

	public function setStatusCode($statusCode)
	{
		$this->statusCode = $statusCode;

		//do something else
	}
}

### 使用自定义组件

##### 请求

使用您自定义的请求组件非常简单

  1. 创建组件的实例
  2. 配置组件
  3. 将其传递给监听组件的构造函数
$request = new PayPal\Ipn\Request\CustomRequest();

$request->someCustomMethod();

$listener = new PayPal\Ipn\Listener($request);

...

##### 响应

使用您自定义的响应组件非常简单

  1. 创建组件的实例
  2. 配置组件
  3. 将其传递给请求组件的构造函数
$response = new PayPal\Ipn\Response\CustomResponse();

$response->someCustomMethod();

$request = new PayPal\Ipn\Request\CustomRequest(false, $response);

$listener = new PayPal\Ipn\Listener($request);

...

注意: 请求组件构造函数接受两个参数:自定义数据集和自定义响应对象。如果请求组件只使用 $_POST 数组中的数据,则传递 false(如果传递自定义响应)。见以下说明。

### 说明

##### 数据源

默认情况下,将使用 $_POST 数组中的数据来验证IPN。在某些情况下,您可能无法访问 $_POST(某些框架取消设置此选项并使用自定义访问器)。为了解决这个问题,您可以将数据数组传递给请求组件的构造函数

$data = array(
	//...
);

$request = new PayPal\Ipn\Request\Curl($data);

...

##### 测试

PayPal提供了一个即时支付通知(IPN)模拟器,请在这里查看:https://developer.paypal.com/webapps/developer/applications/ipn_simulator

模拟器只能告诉您IPN是否成功发送。要获取有关IPN状态的更多信息(发送了什么数据,得到了什么响应等),您需要将其记录下来(使用监听组件的 getStatus() 方法并将其写入文件等)。