sub _instantiate_pp_nvp { my $self = shift; if(defined($self->{'pp_nvp'}) && $self->{'pp_nvp'}->isa('Business::PayPal::NVP')){ return; } my $pp_branch; if($self->{'cfg'}->param("paypal.pp_use_sandbox")){ $pp_branch = 'test'; } else { $pp_branch = 'live'; } $self->{'pp_nvp'} = Business::PayPal::NVP->new( Version => '57.0', test => { user => $self->{'cfg'}->param("paypal.pp_sandbox_username"), pwd => $self->{'cfg'}->param("paypal.pp_sandbox_password"), sig => $self->{'cfg'}->param("paypal.pp_sandbox_signature") }, live => { user => $self->{'cfg'}->param("paypal.pp_username"), pwd => $self->{'cfg'}->param("paypal.pp_password"), sig => $self->{'cfg'}->param("paypal.pp_signature") }, branch => $pp_branch ); return; } sub _SetExpressCheckout { my $self = shift; my $fields = shift; my $gross_sales = $self->_compute_invoice($fields); $self->_instantiate_pp_nvp(); $fields->{'AMT'} = $gross_sales; $fields->{'DESC'} = $self->{'cfg'}->param("inventory.product_name"); $fields->{'CURRENCYCODE'} = 'USD'; $fields->{'PAYMENTACTION'} = 'Sale'; $fields->{'RETURNURL'} = $self->{'cfg'}->param("paypal.pp_return_url"); $fields->{'CANCELURL'} = $self->{'cfg'}->param("paypal.pp_cancel_url"); $fields->{'VERSION'} = $self->{'cfg'}->param("paypal.pp_api_version"); $fields->{'METHOD'} = 'SetExpressCheckout'; $fields->{'REQCONFIRMSHIPPING'} = '0'; $fields->{'ADDROVERRIDE'} = '0'; $fields->{'NOSHIPPING'} = '0'; $fields->{'ALLOWNOTE'} = '0'; $fields->{'LOCALECODE'} = 'US'; $fields->{'HDRBORDERCOLOR'} = $self->{'cfg'}->param("paypal.pp_hdrbordercolor"); $fields->{'HDRBACKCOLOR'} = $self->{'cfg'}->param("paypal.pp_hdrbackcolor"); $fields->{'PAYFLOWCOLOR'} = $self->{'cfg'}->param("paypal.pp_payflowcolor"); # $fields->{'SOLUTIONTYPE'} = 'Mark'; # $fields->{'LANDINGPAGE'} = 'Login'; # $fields->{'CHANNELTYPE'} = 'Merchant'; my %response = $self->{'pp_nvp'}->SetExpressCheckout( %{$fields} ); # $self->log('DEBUG','->get_paypal_token_nvp() says API server said: ',\%response); my %details = $self->{'pp_nvp'}->GetExpressCheckoutDetails( 'Token' => $response{'TOKEN'} ); $self->{'paypal_details'} = \%details; # $self->log('DEBUG','Express Checkout Details include: ',$self->{'paypal_details'}); return %details; } sub _GetExpressCheckoutDetails { my $self = shift; my $token = shift; $self->_instantiate_pp_nvp(); my %response; $response{'TOKEN'} = $token; my %details = $self->{'pp_nvp'}->GetExpressCheckoutDetails( 'Token' => $response{'TOKEN'} ); $self->{'paypal_details'} = \%details; print STDERR '->_GetExpressCheckoutDetails() says the details are: ' . Dumper(\%details); return \%details; } sub _DoExpressCheckoutPayment { my $self = shift; # my $fields = shift; # return unless(defined($self->{'paypal_details'})); # $self->log('DEBUG','$ymd->DoExpressCheckoutPayment got these incoming arguments: ',$fields); # my $gross_sales = $self->_compute_invoice($fields); $self->_instantiate_pp_nvp(); my %args = ( token => $self->{'s'}->param('token'), TOKEN => $self->{'s'}->param('token'), PayerID => $self->{'s'}->param('payerid'), PAYERID => $self->{'s'}->param('payerid'), # AMT => '1.00', AMT => $self->{'s'}->{'AMT'}, # OrderTotal => '1.00', OrderTotal => $self->{'s'}->{'AMT'}, CURRENCYCODE => 'USD', PAYMENTACTION => 'Sale', METHOD => 'DoExpressCheckoutPayment' ); print STDERR 'DoExpressCheckoutPayment got these arguments: ' . Dumper(\%args); my %response = $self->{'pp_nvp'}->DoExpressCheckoutPayment( %args ); print STDERR 'DoExpressCheckoutPayment responds: ' . Dumper(\%response); if($response{'ACK'} eq 'Success' && defined($response{'TRANSACTIONID'})){ my $sql = $self->{'cfg'}->param("sql.insert_pp_transaction"); my $sth = $self->{'dbh'}->prepare($sql); $sth->execute( $response{'TRANSACTIONID'}, $response{'TOKEN'}, $response{'ACK'}, $response{'PAYMENTSTATUS'}, $response{'AMT'}, $response{'FEEAMT'}, $response{'TAXAMT'}, $response{'CURRENCYCODE'}, $response{'PAYMENTTYPE'}, $response{'TRANSACTIONTYPE'}, $response{'REASONCODE'}, $response{'PENDINGREASON'}, $response{'ORDERTIME'}, $response{'TIMESTAMP'}, $response{'VERSION'}, $response{'BUILD'}, $response{'CORRELATIONID'} ); } return \%response; }