summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2013-04-25 14:45:49 -0700
committerMark Wells <mark@freeside.biz>2013-04-25 14:46:10 -0700
commita1a0800de7c69fe5ee414b79e408ceacd4a1c2c3 (patch)
tree92589a379a7bd3925139779ad0b0d5cd55df6152 /FS/FS
parentf3e0ac2b009c4edd5692cb587ff709dac2223ebe (diff)
changes to support PayPal, #22395
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/ClientAPI/Signup.pm28
-rw-r--r--FS/FS/Conf.pm6
-rw-r--r--FS/FS/Schema.pm3
-rw-r--r--FS/FS/agent.pm20
-rw-r--r--FS/FS/cust_main.pm5
-rw-r--r--FS/FS/cust_main/Billing_Realtime.pm4
-rw-r--r--FS/FS/payby.pm1
-rw-r--r--FS/FS/payinfo_Mixin.pm18
-rw-r--r--FS/FS/payment_gateway.pm15
9 files changed, 62 insertions, 38 deletions
diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm
index 1dbb20b..c3beb69 100644
--- a/FS/FS/ClientAPI/Signup.pm
+++ b/FS/FS/ClientAPI/Signup.pm
@@ -946,15 +946,27 @@ sub capture_payment {
}
my $cust_main = $cust_pay_pending->cust_main;
- my $bill_error =
- $cust_main->realtime_botpp_capture( $cust_pay_pending,
- %{$packet->{data}},
- apply => 1,
- );
+ if ( $packet->{cancel} ) {
+ # the user has chosen not to make this payment
+ # (probably should be a separate API call, but I don't want to duplicate
+ # all of the above...which should eventually go away)
+ my $error = $cust_pay_pending->delete;
+ # don't show any errors related to this; they're not meaningful
+ warn "error canceling pending payment $paypendingnum: $error\n" if $error;
+ return { 'error' => '_cancel',
+ 'session_id' => $cust_pay_pending->session_id };
+ } else {
+ # create the payment
+ my $bill_error =
+ $cust_main->realtime_botpp_capture( $cust_pay_pending,
+ %{$packet->{data}},
+ apply => 1,
+ );
- return { 'error' => ( $bill_error->{bill_error} ? '_decline' : '' ),
- %$bill_error,
- };
+ return { 'error' => ( $bill_error->{bill_error} ? '_decline' : '' ),
+ %$bill_error,
+ };
+ }
}
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 6a19ff4..8dbc070 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -2098,7 +2098,7 @@ and customer address. Include units.',
'section' => 'self-service',
'description' => 'Acceptable payment types for the signup server',
'type' => 'selectmultiple',
- 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB PREPAY BILL COMP) ],
+ 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB PREPAY PPAL BILL COMP) ],
},
{
@@ -2472,7 +2472,7 @@ and customer address. Include units.',
'section' => 'billing',
'description' => 'Available payment types.',
'type' => 'selectmultiple',
- 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD COMP) ],
+ 'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD PPAL COMP) ],
},
{
@@ -2480,7 +2480,7 @@ and customer address. Include units.',
'section' => 'UI',
'description' => 'Default payment type. HIDE disables display of billing information and sets customers to BILL.',
'type' => 'select',
- 'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD COMP HIDE) ],
+ 'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST MCRD PPAL COMP HIDE) ],
},
{
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm
index eb73ccb..4f395f2 100644
--- a/FS/FS/Schema.pm
+++ b/FS/FS/Schema.pm
@@ -3267,7 +3267,8 @@ sub tables_hashref {
'gateway_username', 'varchar', 'NULL', $char_d, '', '',
'gateway_password', 'varchar', 'NULL', $char_d, '', '',
'gateway_action', 'varchar', 'NULL', $char_d, '', '',
- 'gateway_callback_url', 'varchar', 'NULL', $char_d, '', '',
+ 'gateway_callback_url', 'varchar', 'NULL', 255, '', '',
+ 'gateway_cancel_url', 'varchar', 'NULL', 255, '', '',
'disabled', 'char', 'NULL', 1, '', '',
],
'primary_key' => 'gatewaynum',
diff --git a/FS/FS/agent.pm b/FS/FS/agent.pm
index 3794d3f..9b32209 100644
--- a/FS/FS/agent.pm
+++ b/FS/FS/agent.pm
@@ -216,7 +216,7 @@ an attempt will be made to select a gateway suited for the taxes paid on
the invoice.
The I<method> and I<payinfo> options can be used to influence the choice
-as well. Presently only 'CC' and 'ECHECK' methods are meaningful.
+as well. Presently only 'CC', 'ECHECK', and 'PAYPAL' methods are meaningful.
When the I<method> is 'CC' then the card number in I<payinfo> can direct
this routine to route to a gateway suited for that type of card.
@@ -246,13 +246,17 @@ sub payment_gateway {
}
#look for an agent gateway override first
- my $cardtype;
- if ( $options{method} && $options{method} eq 'CC' && $options{payinfo} ) {
- $cardtype = cardtype($options{payinfo});
- } elsif ( $options{method} && $options{method} eq 'ECHECK' ) {
- $cardtype = 'ACH';
- } else {
- $cardtype = $options{method} || '';
+ my $cardtype = '';
+ if ( $options{method} ) {
+ if ( $options{method} eq 'CC' && $options{payinfo} ) {
+ $cardtype = cardtype($options{payinfo});
+ } elsif ( $options{method} eq 'ECHECK' ) {
+ $cardtype = 'ACH';
+ } elsif ( $options{method} eq 'PAYPAL' ) {
+ $cardtype = 'PayPal';
+ } else {
+ $cardtype = $options{method}
+ }
}
my $override =
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index 2a4602e..1cf0365 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -390,7 +390,7 @@ sub insert {
$payby = 'PREP' if $amount;
- } elsif ( $self->payby =~ /^(CASH|WEST|MCRD)$/ ) {
+ } elsif ( $self->payby =~ /^(CASH|WEST|MCRD|PPAL)$/ ) {
$payby = $1;
$self->payby('BILL');
@@ -2021,7 +2021,8 @@ sub check {
if ( $self->paydate eq '' || $self->paydate eq '-' ) {
return "Expiration date required"
- unless $self->payby =~ /^(BILL|PREPAY|CHEK|DCHK|LECB|CASH|WEST|MCRD)$/;
+ # shouldn't payinfo_check do this?
+ unless $self->payby =~ /^(BILL|PREPAY|CHEK|DCHK|LECB|CASH|WEST|MCRD|PPAL)$/;
$self->paydate('');
} else {
my( $m, $y );
diff --git a/FS/FS/cust_main/Billing_Realtime.pm b/FS/FS/cust_main/Billing_Realtime.pm
index 804969b..1caa3e5 100644
--- a/FS/FS/cust_main/Billing_Realtime.pm
+++ b/FS/FS/cust_main/Billing_Realtime.pm
@@ -111,7 +111,7 @@ L<http://420.am/business-onlinepayment> for supported gateways.
Required arguments in the hashref are I<method>, and I<amount>
-Available methods are: I<CC>, I<ECHECK> and I<LEC>
+Available methods are: I<CC>, I<ECHECK>, I<LEC>, and I<PAYPAL>
Available optional arguments are: I<description>, I<invnum>, I<apply>, I<quiet>, I<paynum_ref>, I<payunique>, I<session_id>
@@ -317,6 +317,7 @@ my %bop_method2payby = (
'CC' => 'CARD',
'ECHECK' => 'CHEK',
'LEC' => 'LECB',
+ 'PAYPAL' => 'PPAL',
);
sub realtime_bop {
@@ -612,6 +613,7 @@ sub realtime_bop {
%$bop_content,
'reference' => $cust_pay_pending->paypendingnum, #for now
'callback_url' => $payment_gateway->gateway_callback_url,
+ 'cancel_url' => $payment_gateway->gateway_cancel_url,
'email' => $email,
%content, #after
);
diff --git a/FS/FS/payby.pm b/FS/FS/payby.pm
index d1961a5..e223a05 100644
--- a/FS/FS/payby.pm
+++ b/FS/FS/payby.pm
@@ -208,6 +208,7 @@ sub longname {
'CARD' => 'CC',
'CHEK' => 'ECHECK',
'MCRD' => 'CC',
+ 'PPAL' => 'PAYPAL',
);
sub payby2bop {
diff --git a/FS/FS/payinfo_Mixin.pm b/FS/FS/payinfo_Mixin.pm
index 9879a3a..8263252 100644
--- a/FS/FS/payinfo_Mixin.pm
+++ b/FS/FS/payinfo_Mixin.pm
@@ -44,26 +44,18 @@ For Refunds (cust_refund):
For Payments (cust_pay):
'CARD' (credit cards), 'CHEK' (electronic check/ACH),
'LECB' (phone bill billing), 'BILL' (billing), 'PREP' (prepaid card),
-'CASH' (cash), 'WEST' (Western Union), or 'MCRD' (Manual credit card)
+'CASH' (cash), 'WEST' (Western Union), 'MCRD' (Manual credit card),
+'PPAL' (PayPal)
'COMP' (free) is depricated as a payment type in cust_pay
=cut
-# was this supposed to do something?
-
-#sub payby {
-# my($self,$payby) = @_;
-# if ( defined($payby) ) {
-# $self->setfield('payby', $payby);
-# }
-# return $self->getfield('payby')
-#}
-
=item payinfo
Payment information (payinfo) can be one of the following types:
-Card Number, P.O., comp issuer (4-8 lowercase alphanumerics; think username) or prepayment identifier (see L<FS::prepay_credit>)
+Card Number, P.O., comp issuer (4-8 lowercase alphanumerics; think username)
+prepayment identifier (see L<FS::prepay_credit>), PayPal transaction ID
=cut
@@ -267,6 +259,8 @@ sub payby_payinfo_pretty {
'Western Union'; #. $self->payinfo;
} elsif ( $self->payby eq 'MCRD' ) {
'Manual credit card'; #. $self->payinfo;
+ } elsif ( $self->payby eq 'PPAL' ) {
+ 'PayPal transaction#' . $self->order_number;
} else {
$self->payby. ' '. $self->payinfo;
}
diff --git a/FS/FS/payment_gateway.pm b/FS/FS/payment_gateway.pm
index 4a7585e..e94a62c 100644
--- a/FS/FS/payment_gateway.pm
+++ b/FS/FS/payment_gateway.pm
@@ -41,7 +41,7 @@ currently supported:
=item gateway_namespace - Business::OnlinePayment, Business::OnlineThirdPartyPayment, or Business::BatchPayment
-=item gateway_module - Business::OnlinePayment:: module name
+=item gateway_module - Business::OnlinePayment:: (or other) module name
=item gateway_username - payment gateway username
@@ -51,6 +51,14 @@ currently supported:
=item disabled - Disabled flag, empty or 'Y'
+=item gateway_callback_url - For ThirdPartyPayment only, set to the URL that
+the user should be redirected to on a successful payment. This will be sent
+as a transaction parameter (named "callback_url").
+
+=item gateway_cancel_url - For ThirdPartyPayment only, set to the URL that
+the user should be redirected to if they cancel the transaction. PayPal
+requires this; other gateways ignore it.
+
=item auto_resolve_status - For BatchPayment only, set to 'approve' to
auto-approve unresolved payments after some number of days, 'reject' to
auto-decline them, or null to do nothing.
@@ -128,6 +136,7 @@ sub check {
|| $self->ut_textn('gateway_username')
|| $self->ut_anything('gateway_password')
|| $self->ut_textn('gateway_callback_url') # a bit too permissive
+ || $self->ut_textn('gateway_cancel_url')
|| $self->ut_enum('disabled', [ '', 'Y' ] )
|| $self->ut_enum('auto_resolve_status', [ '', 'approve', 'reject' ])
|| $self->ut_numbern('auto_resolve_days')
@@ -152,8 +161,8 @@ sub check {
}
# this little kludge mimics FS::CGI::popurl
- $self->gateway_callback_url($self->gateway_callback_url. '/')
- if ( $self->gateway_callback_url && $self->gateway_callback_url !~ /\/$/ );
+ #$self->gateway_callback_url($self->gateway_callback_url. '/')
+ # if ( $self->gateway_callback_url && $self->gateway_callback_url !~ /\/$/ );
$self->SUPER::check;
}