danmaculotte / paypal-ipn-listener
PHP的PayPal IPN(即时支付通知)监听器
Requires
- php: ^7.2.5||^8.0
- guzzlehttp/guzzle: ^7.4
- symfony/event-dispatcher: ^4.4.0|^5.0.7|^6.0
Requires (Dev)
- beberlei/assert: ^3.3
- behat/behat: ^3.10
- friendsofphp/php-cs-fixer: ^3.7
- phpspec/phpspec: dev-main
This package is auto-updated.
Last update: 2024-09-29 05:49:28 UTC
README
PHP的PayPal IPN(即时支付通知)监听器
索引
先决条件
- PHP ^7.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消息验证结果相关的事件。
MessageFactory
和Service
组件是可替换的组件。
此包提供了2个消息工厂
DansMaCulotte\PayPal\Ipn\MessageFactory\InputStreamMessageFactory
- 从php://input
流创建消息DansMaCulotte\PayPal\Ipn\MessageFactory\ArrayMessageFactory
- 从传递给setData
方法的数组创建消息
此包提供了1个服务
DansMaCulotte\PayPal\Ipn\Service\GuzzleService
- 使用Guzzle与PayPal通信
使用
您可以手动构建监听器对象,也可以使用监听器构建器。此包提供了2个监听器构建器
DansMaCulotte\PayPal\Ipn\ListenerBuilder\Guzzle\InputStreamListenerBuilder
- 使用guzzle服务和输入流消息工厂构建监听器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)