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.