danmaculotte / paypal-ipn-listener

PHP的PayPal IPN(即时支付通知)监听器

1.1.0 2022-03-10 09:41 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:28 UTC


README

Packagist Status Total Downloads License

PHP的PayPal IPN(即时支付通知)监听器

索引

先决条件

  1. PHP ^7.2
  2. 理解PayPal即时支付通知系统的工作原理。请参阅https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/

安装

composer require dansmaculotte/paypal-ipn-listener

架构

此包由几个相互协作的组件组成

  • Listener - 监听并处理IPN消息
  • Verifier - 使用PayPal验证IPN消息
  • Service - 与PayPal通信
  • Message - IPN消息的包装器
  • MessageFactory - 从数据源创建新的消息实例
  • EventDispatcher - 分派事件

监听器使用MessageFactory创建一个Message。将Message传递给Verifier,该Verifier使用Service与PayPal通信。监听器使用EventDispatcher分派与IPN消息验证结果相关的事件。

MessageFactoryService组件是可替换的组件。

此包提供了2个消息工厂

  1. DansMaCulotte\PayPal\Ipn\MessageFactory\InputStreamMessageFactory - 从php://input流创建消息
  2. DansMaCulotte\PayPal\Ipn\MessageFactory\ArrayMessageFactory - 从传递给setData方法的数组创建消息

此包提供了1个服务

  1. DansMaCulotte\PayPal\Ipn\Service\GuzzleService - 使用Guzzle与PayPal通信

使用

您可以手动构建监听器对象,也可以使用监听器构建器。此包提供了2个监听器构建器

  1. DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\InputStreamListenerBuilder - 使用guzzle服务和输入流消息工厂构建监听器
  2. DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\ArrayListenerBuilder - 使用guzzle服务和数组消息工厂构建监听器

使用监听器构建器是构建监听器对象的首选方法。

使用监听器构建器

use DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\InputStreamListenerBuilder as ListenerBuilder;

$listener = (new ListenerBuilder)->build();

手动构建监听器

use GuzzleHttp\Client;
use DansMaCulotte\PayPal\Ipn\InputStream;
use DansMaCulotte\PayPal\Ipn\Listener;
use DansMaCulotte\PayPal\Ipn\MessageFactory\InputStreamMessageFactory;
use DansMaCulotte\PayPal\Ipn\Service\GuzzleService;
use DansMaCulotte\PayPal\Ipn\Verifier;
use Symfony\Component\EventDispatcher\EventDispatcher;

$service = new GuzzleService(
    new Client(),
    'https://www.sandbox.paypal.com/cgi-bin/webscr'
);

$verifier = new Verifier($service);

$messageFactory = new InputStreamMessageFactory(new InputStream());

$listener = new Listener(
    $messageFactory,
    $verifier,
    new EventDispatcher()
);

手动创建监听器需要大量的逻辑。监听器构建器的任务是抽象化这些逻辑。

订阅事件

创建监听器对象后,您可以订阅它将分派的事件

use DansMaCulotte\PayPal\Ipn\Event\MessageVerifiedEvent;
use DansMaCulotte\PayPal\Ipn\Event\MessageInvalidEvent;
use DansMaCulotte\PayPal\Ipn\Event\MessageVerificationFailureEvent;

$listener->onVerified(function (MessageVerifiedEvent $event) {
   $ipnMessage = $event->getMessage();
   
   // IPN message was verified, everything is ok! Do your processing logic here...
});

$listener->onInvalid(function (MessageInvalidEvent $event) {
   $ipnMessage = $event->getMessage();
   
   // IPN message was was invalid, something is not right! Do your logging here...
});

$listener->onVerificationFailure(function (MessageVerificationFailureEvent $event) {
    $error = $event->getError();
    
    // Something bad happend when trying to communicate with PayPal! Do your logging here...
});

在订阅事件时,您可以使用任何callable

use DansMaCulotte\PayPal\Ipn\Event\MessageVerifiedEvent;

class IpnProcessor
{
    public function onVerified(MessageVerifiedEvent $event)
    {
        $message = $event->getMessage();
        
        // ...
    }
}

$listener->onVerified([new Processor, 'onVerified']);
use DansMaCulotte\PayPal\Ipn\Event\MessageVerifiedEvent;

class IpnProcessor
{
    public static function onVerified(MessageVerifiedEvent $event)
    {
        $message = $event->getMessage();
        
        // ...
    }
}

$listener->onVerified(['IpnProcessor', 'onVerified']);

监听IPN消息

启动流程的最后一步是监听IPN消息

$listener->listen();

完整示例

use DansMaCulotte\PayPal\Ipn\Event\MessageVerifiedEvent;
use DansMaCulotte\PayPal\Ipn\Event\MessageInvalidEvent;
use DansMaCulotte\PayPal\Ipn\Event\MessageVerificationFailureEvent;
use DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\InputStreamListenerBuilder as ListenerBuilder;

$listener = (new ListenerBuilder)->build();

$listener->onVerified(function (MessageVerifiedEvent $event) {
   $ipnMessage = $event->getMessage();
   
   // IPN message was verified, everything is ok! Do your processing logic here...
});

$listener->onInvalid(function (MessageInvalidEvent $event) {
   $ipnMessage = $event->getMessage();
   
   // IPN message was was invalid, something is not right! Do your logging here...
});

$listener->onVerificationFailure(function (MessageVerificationFailureEvent $event) {
    $error = $event->getError();
    
    // Something bad happend when trying to communicate with PayPal! Do your logging here...
});

$listener->listen();

沙盒模式

使用提供的监听器构建器之一时,您可以设置监听器使用PayPal的沙盒进行测试

use DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\InputStreamListenerBuilder as ListenerBuilder;

$listenerBuilder = new ListenerBuilder();

$listenerBuilder->useSandbox(); // use PayPal sandbox

$listener = $listenerBuilder->build();

您可以在示例目录中找到一些完整的用法示例。

扩展

要创建自己的服务,您必须实现DansMaCulotte\PayPal\Ipn\Service

要创建自己的消息工厂,您必须实现DansMaCulotte\PayPal\Ipn\MessageFactory

要创建自己的监听器构建器,最好扩展DansMaCulotte\PayPal\Ipn\ListenerBuilder,因为这提供了创建监听器构建器所需的大部分样板代码。

您会注意到,在使用提供的任何guzzle监听器构建器时,都有一个暴露的useSandbox方法。您可以通过使用DansMaCulotte\PayPal\Ipn\ListenerBuilder\ModeDependentServiceEndpoint特性(请参阅DansMaCulotte\PayPal\Ipn\ListenerBuilder\GuzzleListenerBuilder的用法示例)将此功能添加到您的监听器构建器中。

说明

测试

PayPal在此提供了IPN模拟器:[https://developer.paypal.com/webapps/developer/applications/ipn_simulator](https://developer.paypal.com/webapps/developer/applications/ipn_simulator)