NAME Net::API::Stripe::WebHook::Apache - An Apache handler for Stripe Web Hook SYNOPSIS package My::Module::WebHook; BEGIN { use strict; use curry; use parent qw( Net::API::Stripe::WebHook::Apache ); }; sub init { my $self = shift( @_ ); $self->{event_handlers} = { account => { updated => $self->curry::account_updated, # etc.. # See here for a list of Stripe events: # https://stripe.com/docs/api/events/types }; } VERSION v0.100.1 DESCRIPTION This is the module to handle Stripe Web Hooks using Apache/mod_perl configuration The way this works is you create your own module which inherits from this one. You override the init method in which you create the object property *event_handler* with an hash value with keys corresponding to the types of Stripe events. A dot in the Stripe event type corresponds to a sub hash in our *event_handler* definition. When an http query is made by Stripe on your webhook, Apache will trigger the method handler, which will check and create the object environment, and call the method event_handler provided by this package to find out the sub in charge of this Stripe event type, as defined in your map *event_handlers*. You own method is then called and you can do whatever you want with Stripe data. It is also worth mentioning that Stripe requires ssl to be enabled to perform webhook queries. CONFIGURATION Your Apache VirtualHost configuration would look something like this, assuming your module package is "My::Module::WebHook" ServerName example.com:443 ServerAdmin www@example.com DocumentRoot /home/john/example.com DirectoryIndex "index.html" "index.php" CustomLog "${APACHE_LOG_DIR}/example.com-access.log" combined ErrorLog "${APACHE_LOG_DIR}/example.com-error.log" LogLevel warn Options All +MultiViews -ExecCGI -Indexes +Includes +FollowSymLinks AllowOverride All ScriptAlias "/cgi-bin/" "/home/john/example.com/cgi-bin/" Options All +Includes +ExecCGI -Indexes -MultiViews AllowOverride All SetHandler cgi-script AcceptPathInfo On Require all granted PerlOptions +GlobalRequest PerlPassEnv MOD_PERL PerlPassEnv PATH_INFO PerlModule Apache2::Request unshift( @INC, "/home/john/lib" ); SetHandler perl-script ## Switch it back to modperl once the soft is stable # SetHandler modperl PerlSendHeader On PerlSetupEnv On PerlOptions +GlobalRequest # PerlResponseHandler Net::API::Stripe::WebHook::Apache PerlResponseHandler My::Module::WebHook Options +ExecCGI Order allow,deny Allow from all SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem The key part is the line with "PerlResponseHandler" and value Net::API::Stripe::WebHook::Apache. This will tell Apache/mod_perl that our module will handle all http request for this particular location. So, if we get an incoming event from Stripe at https://example.com/hook/d18bbab7-e537-4dba-9a1f-dd6cc70ea6c1, we receive "d18bbab7-e537-4dba-9a1f-dd6cc70ea6c1" as part of the path info, and we call validate_webhook() to validate it before processing the event incoming packet. Apache will call our special method handler(), which will invoque validate_webhook() that should be overriden by your module, and which must return either true or false. Upon successful return from validate_webhook(), handler will create a new constructor such as $class->new() What you want to do is inherit Net::API::Stripe::WebHook::Apache and set your own module in Apache configuration, like so: PerlResponseHandler My::WebHookHandler The inherited handler will be called by Apache with the class My::WebHookHandler and the apache Apache2::RequestRec object. As we wrote above, once validated, handler will initiate an object from your module by calling "My::WebHookHandler-"new( object => Net::API::Stripe::Event, request => Net::API::REST::Request, response => Net::API::REST::Response )> where each package name are an object. "object" represents the event packet received from Stripe. "request" is an object to access great number of method to access the Apache API, and "response" is an object to access Apache API to provide a reply. See the manual page for each of those package. CONSTRUCTOR new( %args ) Creates a new Net::API::Stripe::WebHook::Apache object. This should be overriden by your own package. *object* Net::API::Stripe::Event object *request* Net::API::REST::Request *request* Net::API::REST::Response handler( $class, $r ) This is called by Apache/mod_perl upon incoming http request METHODS handler( $r ) This is called by Apache with an Apache2::Request object and returns an Apache2::Constant code such as 200 event_handler( Stripe event type ) Provided with a Stripe event type, this checks for a suitable handler (set up in your init method), then return the handler code reference. ~item event_handlers Set/get an hash reference of Stripe event type to handling methods. Returns an hash reference. stripe Set/get a Net::API::Stripe object. It returns the current value. HISTORY v0.1 Initial version AUTHOR Jacques Deguest SEE ALSO Stripe API documentation: Net::API::REST, Apache2 ModPerl::Registry, ModPerl::PerlRun, COPYRIGHT & LICENSE Copyright (c) 2019-2020 DEGUEST Pte. Ltd. You can use, copy, modify and redistribute this package and associated files under the same terms as Perl itself.