diff --git a/.gitignore b/.gitignore index eac2520..420c0be 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ auth.txt blib perltidy.LOG pm_to_blib +subscription-payment.html diff --git a/auth.sample.3token b/auth.sample.3token index 2c21d05..509bf27 100644 --- a/auth.sample.3token +++ b/auth.sample.3token @@ -1,3 +1,4 @@ Username = test1_api.mydomain.tld Password = XXXXXXXXXXXXXXXX Signature = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +SellerEmail = email-of-business-test-account@mydomain.tld diff --git a/auth.sample.cert b/auth.sample.cert index 9af9d49..d97ae78 100644 --- a/auth.sample.cert +++ b/auth.sample.cert @@ -2,3 +2,4 @@ Username = test1_api.mydomain.tld Password = myapipassword CertFile = /www/var/cert_key_pem.txt KeyFile = /www/var/cert_key_pem.txt +SellerEmail = email-of-business-test-account@mydomain.tld diff --git a/lib/Business/PayPal/API/TransactionSearch.pm b/lib/Business/PayPal/API/TransactionSearch.pm index 0e8971f..b93bca7 100644 --- a/lib/Business/PayPal/API/TransactionSearch.pm +++ b/lib/Business/PayPal/API/TransactionSearch.pm @@ -20,6 +20,7 @@ sub TransactionSearch { Payer => 'ebl:EmailAddressType', Receiver => 'ebl:EmailAddressType', ReceiptID => 'xs:string', + ProfileID => 'xs:string', TransactionID => 'xs:string', InvoiceID => 'xs:string', PayerName => 'xs:string', diff --git a/t/API.pl b/t/API.pl index 8c2f84d..121be44 100644 --- a/t/API.pl +++ b/t/API.pl @@ -26,7 +26,7 @@ sub do_args { my @variables = qw( Username Password Signature Subject timeout CertFile KeyFile PKCS12File PKCS12Password - BuyerEmail + BuyerEmail SellerEmail ); my %patterns = (); diff --git a/t/SubscriptionPayments.t b/t/SubscriptionPayments.t new file mode 100644 index 0000000..82876b7 --- /dev/null +++ b/t/SubscriptionPayments.t @@ -0,0 +1,108 @@ +# -*- mode: cperl -*- +use Test::More; +use strict; +use autodie qw(:all); +use Cwd; + +if ( !$ENV{WPP_TEST} || !-f $ENV{WPP_TEST} ) { + plan skip_all => + 'No WPP_TEST env var set. Please see README to run tests'; +} +else { + plan tests => 5; +} + +use_ok( 'Business::PayPal::API::TransactionSearch' ); +######################### + +require 't/API.pl'; + +my %args = do_args(); + +=pod + +The following four tests shows the methodology to use TransactionSearch to +find transactions that are part of the same ProfileID. This method was +discovered by trial-and-error. Specifically, it's somewhat odd that +TransactionSearch is used with the parameter of 'ProfileID' with the value +set to a specific TransactionID to find the ProfileID via the "Created" +transaction. Then, in turn, that ProfileID can find the subscription payments +related to the original transaction. + +This works, and seems to be correct, albeit odd. + +=cut + +open(SUBSCRIPTION_PAY_HTML, ">", "subscription-payment.html"); + +print SUBSCRIPTION_PAY_HTML <<_SUBSCRIPTION_PAYMENT_DATA_ + + +
+ + + + + + + + + + + + + + +
+ + +_SUBSCRIPTION_PAYMENT_DATA_ + ; +close(SUBSCRIPTION_PAY_HTML); + +my $cwd = getcwd; + +print STDERR <<"_PROFILEID_"; +Please note the next series of tests will not succeeed unless there is at +least one transaction that is part of a subscription payments in your business +account. + +if you haven't made one yet, you can visit: + file:///$cwd/subscription-payment.html + +and use the sandbox buyer account to make the payment. +_PROFILEID_ + +my $startdate = '1998-01-01T01:45:10.00Z'; + +my $ts = new Business::PayPal::API::TransactionSearch( %args ); + +my $resp = $ts->TransactionSearch(StartDate => $startdate); + +ok(scalar @{$resp} > 0, "Some transactions found"); + +my($profileID, %possibleTransactionIDs); +foreach my $record (@{$resp}) { + if ($record->{Type} =~ /Recurring/) { + if ($record->{Status} =~ /Completed/) { + $possibleTransactionIDs{$record->{TransactionID}} = $record; + } elsif ($record->{Status} =~ /Created/) { + $profileID = $record->{TransactionID}; + } + } +} +ok(defined $profileID, "Subscription Payment Creation Record and ProfileID Found"); +ok(scalar(keys %possibleTransactionIDs) > 0, "Subscription Payment Transactions Found"); + +$resp = $ts->TransactionSearch(StartDate => $startdate, + ProfileID => $profileID); + +my $foundAtLeastOne = 0; +foreach my $record (@{$resp}) { + # One of these will need to be in the possibleTransactionID list (i.e., + # we're assuming that at least one payment has occured in this repeating). + if (defined $possibleTransactionIDs{$record->{TransactionID}}) { + $foundAtLeastOne = 1; last; + } +} +ok($foundAtLeastOne, "Found one payment transaction under the given Profile ID");