mourningdove/bin/worker/shop-creditcard-charge
2026-05-24 01:03:05 +00:00

75 lines
2.3 KiB
Perl
Executable file

#!/usr/bin/perl
#
# bin/worker/shop-creditcard-charge
#
# This Gearman worker handles attempting to charge a user for their credit card
# transaction. Goal is to be quick and useful.
#
# Authors:
# Mark Smith <mark@dreamwidth.org>
#
# Copyright (c) 2010 by Dreamwidth Studios, LLC.
#
# This program is free software; you may redistribute it and/or modify it under
# the same terms as Perl itself. For a copy of the license, please reference
# 'perldoc perlartistic' or 'perldoc perlgpl'.
#
use strict;
BEGIN {
require "$ENV{LJHOME}/cgi-bin/ljlib.pl";
}
use Gearman::Worker;
use Storable qw/ thaw /;
use LJ::Worker::Gearman;
use DW::Pay;
use DW::Shop;
gearman_decl( 'dw_creditcard_charge' => \&worker );
gearman_work();
sub worker {
my $job = $_[0];
my %in = %{ thaw( $job->arg ) || {} };
return
unless exists $in{cctransid} && $in{cctransid} > 0 &&
exists $in{cartid} && $in{cartid} > 0;
my $dbh = DW::Pay::get_db_writer()
or return undef;
# at this point, we can save the error since we have a cctransid
my $err = sub {
$dbh->do( 'UPDATE cc_trans SET jobstate = ?, joberr = ?, gctaskref = NULL WHERE cctransid = ?',
undef, 'internal_failure', sprintf( shift(), @_ ), $in{cctransid} );
return undef;
};
my $cart = DW::Shop::Cart->get_from_cartid( $in{cartid} )
or return $err->( 'Failed to get cart %d.', $in{cartid} );
return $err->( 'Cart is not in valid state PEND_PAID, is in state %d.', $cart->state )
unless $cart->state == $DW::Shop::STATE_PEND_PAID;
# now attempt to charge the user for this purchase
my ( $res, $msg ) = $cart->engine->try_capture( %in );
# update to say that this has been paid, if it has
if ( $res ) {
$cart->state( $DW::Shop::STATE_PAID );
$msg = 'charged' . ( $msg ? " [$msg]" : '' );
$dbh->do( 'UPDATE cc_trans SET jobstate = ?, joberr = ?, gctaskref = NULL WHERE cctransid = ?',
undef, 'paid', $msg, $in{cctransid} );
} else {
$cart->state( $DW::Shop::STATE_OPEN );
$msg = 'declined' . ( $msg ? " [$msg]" : '' );
$dbh->do( 'UPDATE cc_trans SET jobstate = ?, joberr = ?, gctaskref = NULL WHERE cctransid = ?',
undef, 'failed', $msg, $in{cctransid} );
}
return 1;
}