Which variables does PapPal send when subscription payments are processed periodically - paypal

I've signed for my own subscription, and I've got these messages with from paypal. I displayed txn_type and subscr_date.
| txn_type | subscr_date |
| subscr_payment | NULL |
| subscr_signup | 05:04:37 May 15, 2017 PDT |
| subscr_cancel | 05:05:57 May 15, 2017 PDT |
Messages of txn_type subsrc_payment only have subscr_id and nothing else.
I am interested in what messages will be send when recurring payment gets executed next month, next year...
I suspect there will be just
| txn_type | subscr_date | subscr_id
| subscr_payment | NULL | SOME ID HERE
Can anyone what kind of txn_type will be sent over? I am having a hard time simulating this process.

When a payment happens then the subscr_payment is the IPN type you would get. Not sure why you're saying you are only seeing minimal parameters. Here is a sample of a subscr_payment IPN:
Array
(
[mc_gross] => 5.00
[protection_eligibility] => Eligible
[address_status] => unconfirmed
[payer_id] => 8FXTJQD6PGD5N
[address_street] => 123 Test Ave.
[payment_date] => 22:30:42 Jan 04, 2017 PST
[payment_status] => Completed
[charset] => windows-1252
[address_zip] => 11000
[first_name] => Tester
[mc_fee] => 0.50
[address_country_code] => MA
[address_name] => HAMMA Omar
[notify_version] => 3.8
[subscr_id] => I-WCECH3SA87PT
[payer_status] => unverified
[business] => receiver#email.com
[address_country] => Morocco
[address_city] => Rabat
[verify_sign] => A3Y1IabViDnLM.hMAUvK-kr83JP5AaoMlP3UYuHFIfHdL4P5lBuXYBoQ
[payer_email] => payer#email.com
[txn_id] => 0RF86855U2529745U
[payment_type] => instant
[payer_business_name] => Testerson Tester
[last_name] => Testerson
[address_state] => Rabat
[receiver_email] => receiver#email.com
[payment_fee] => 0.50
[receiver_id] => G3LWKY98MHFFC
[txn_type] => subscr_payment
[item_name] => Times News
[mc_currency] => USD
[residence_country] => MA
[test_ipn] => 1
[transaction_subject] => Times News
[payment_gross] => 5.00
[ipn_track_id] => d95263f949f25
[ipn_url_name] => AE Sandbox
)

Related

Extract text from a large file using powershell

We have an application that produces many large log files, which I want to parse using PowerShell and get the output in CSV or text with delimiter '|'. I tried to use select-string, but couldn't get the expected result. Below i have posted teh log format and expected result
Log File data:
How to achieve the above result using PowerShell?
Thanks
Just as mentioned in my comment you'll need to separate records and try to match your data with a complex regular expression.
See the RegEx live on regex101
Study the explanation of each element in the upper right corner of that link.
This script:
## Q:\Test\2018\11\29\SO_53541952.ps1
$LogFile = '.\SO_53541952.log'
$CsvFile = '.\SO_53541952.csv'
$ExcelFile='.\SO_53541952.xlsx'
## see the regex live <https://regex101.com/r/1TWm7i/1>
$RE = [RegEx]"(?sm)^Submitter Id +=> (?<SubmitterID>.*?$).*?^Start Time +=> (?<StartTime>[0-9:]{8}) +Start Date +=> (?<StartDate>[0-9\/]{10}).*?^Message Text +=> (?<MessageText>.*?$).*?^Src File +=> (?<SrcFile>.*?$).*?^Dest File +=> (?<DestFile>.*?$)"
$Data = (Get-Content $LogFile -raw) -split "(?sm)(?=^Record Id)" | ForEach-Object {
If ($_ -match $RE){
[PSCustomObject]#{
'Submitter Id' = $Matches.SubmitterId
'Start Time' = $Matches.StartTime
'Start Date' = $Matches.StartDate
'Message Text' = $Matches.MessageText
'Src File' = $Matches.SrcFile
'Dest File' = $Matches.DestFile
}
}
}
$Data | Format-Table -Auto
$Data | Export-Csv $CsvFile -NoTypeInformation -Delimiter '|'
#$Data | Out-Gridview
## with the ImportExcel module you can directly generate an excel file
$Data | Export-Excel $ExcelFile -AutoSize # -Show
has this sample output on screen (I modified the samples to be distinguishable):
> .\SO_53541952.ps1
Submitter Id Start Time Start Date Message Text Src File Dest File
------------ ---------- ---------- ------------ -------- ---------
STMDA#432... 00:02:51 11/29/2018 Copy step successfu... File1... c\temp...
STMDA#432... 00:02:52 11/29/2018 Copy step successfu... File2... c\temp...
STMDA#432... 00:02:53 11/29/2018 Copy step successfu... File3... c\temp...
STMDA#432... 00:02:54 11/29/2018 Copy step successfu... File4... c\temp...
and with Doug Finke's ImportExcel module installed, you'll directly get an .xlsx file:
As LotPings suggested, you need to break up the log file content into separate blocks.
Then using regex, you can capture the required values and store them in objects which you can then export to a CSV file.
Something like this:
$log = #"
------------------------------------------------------------------------------
Record Id => STM
Process Name => STMDA Stat Log Time => 00:02:59
Process Number => 51657 Stat Log Date => 11/29/2018
Submitter Id => STMDA#4322
SNode User Id => de34fc5
Start Time => 00:02:59 Start Date => 11/29/2018
Stop Time => 00:02:59 Stop Date => 11/29/2018
SNODE => dfdvrvbsdfgg
Completion Code => 0
Message Id => ncpa
Message Text => Copy step successful.
Ckpt=> Y Lkfl=> N Rstr=> N XLat=> Y
FASP=> N
From Node => P
Src File => File2
Dest File => c\temp2
Src CCode => 0 Dest CCode => 0
Src Msgid => ncpa Dest Msgid => ncpa
Bytes Read => 4000 Bytes Written => 4010
Records Read => 5 Records Written => 5
Bytes Sent => 4010 Bytes Received => 4010
RUs Sent => 0 RUs Received => 1
------------------------------------------------------------------------------
Record Id => STM
Process Name => STMDA Stat Log Time => 00:02:59
Process Number => 51657 Stat Log Date => 11/29/2018
Submitter Id => STMDA#4321
SNode User Id => de34fc5
Start Time => 00:02:59 Start Date => 11/29/2018
Stop Time => 00:02:59 Stop Date => 11/29/2018
SNODE => dfdvrvbsdfgg
Completion Code => 0
Message Id => ncpa
Message Text => Copy step successful.
Ckpt=> Y Lkfl=> N Rstr=> N XLat=> Y
FASP=> N
From Node => P
Src File => File1
Dest File => c\temp1
Src CCode => 0 Dest CCode => 0
Src Msgid => ncpa Dest Msgid => ncpa
Bytes Read => 4000 Bytes Written => 4010
Records Read => 5 Records Written => 5
Bytes Sent => 4010 Bytes Received => 4010
RUs Sent => 0 RUs Received => 1
------------------------------------------------------------------------------
Record Id => STM
Process Name => STMDA Stat Log Time => 00:02:59
Process Number => 51657 Stat Log Date => 11/29/2018
Submitter Id => STMDA#4323
SNode User Id => de34fc5
Start Time => 00:02:59 Start Date => 11/29/2018
Stop Time => 00:02:59 Stop Date => 11/29/2018
SNODE => dfdvrvbsdfgg
Completion Code => 0
Message Id => ncpa
Message Text => Copy step successful.
Ckpt=> Y Lkfl=> N Rstr=> N XLat=> Y
FASP=> N
From Node => P
Src File => File3
Dest File => c\temp3
Src CCode => 0 Dest CCode => 0
Src Msgid => ncpa Dest Msgid => ncpa
Bytes Read => 4000 Bytes Written => 4010
Records Read => 5 Records Written => 5
Bytes Sent => 4010 Bytes Received => 4010
RUs Sent => 0 RUs Received => 1
------------------------------------------------------------------------------
Record Id => STM
Process Name => STMDA Stat Log Time => 00:02:59
Process Number => 51657 Stat Log Date => 11/29/2018
Submitter Id => STMDA#4324
SNode User Id => de34fc5
Start Time => 00:02:59 Start Date => 11/29/2018
Stop Time => 00:02:59 Stop Date => 11/29/2018
SNODE => dfdvrvbsdfgg
Completion Code => 0
Message Id => ncpa
Message Text => Copy step successful.
Ckpt=> Y Lkfl=> N Rstr=> N XLat=> Y
FASP=> N
From Node => P
Src File => File4
Dest File => c\temp4
Src CCode => 0 Dest CCode => 0
Src Msgid => ncpa Dest Msgid => ncpa
Bytes Read => 4000 Bytes Written => 4010
Records Read => 5 Records Written => 5
Bytes Sent => 4010 Bytes Received => 4010
RUs Sent => 0 RUs Received => 1
------------------------------------------------------------------------------
"#
# first break the log into 'Record Id' blocks
$blocks = #()
$regex = [regex] '(?m)(Record Id[^-]+)'
$match = $regex.Match($log)
while ($match.Success) {
$blocks += $match.Value
$match = $match.NextMatch()
}
# next, parse out the required values for each block and create objects to export
$blocks | ForEach-Object {
if ($_ -match '(?s)Submitter Id\s+=>\s+(?<submitter>[^\s]+).+Start Time\s+=>\s+(?<starttime>[^\s]+)\s+Start Date\s+=>\s+(?<startdate>[^\s]+).+Message Text\s+=>\s+(?<messagetext>[\w ,.;-_]+).+Src File\s+=>\s+(?<sourcefile>[\w ,.;-_]+).+Dest File\s+=>\s+(?<destinationfile>[\w ,.;-_]+)') {
[PSCustomObject]#{
'Submitter Id' = $matches['submitter']
'Start Time' = $matches['starttime']
'Start Date' = $matches['startdate']
'Message Text' = $matches['messagetext']
'Src File' = $matches['sourcefile']
'Dest File' = $matches['destinationfile']
}
}
} | Export-Csv -Path '<PATH_TO_YOUR_OUTPUT_CSV>' -Delimiter '|' -NoTypeInformation
This will result in a csv file with the following content:
"Submitter Id"|"Start Time"|"Start Date"|"Message Text"|"Src File"|"Dest File"
"STMDA#4322"|"00:02:59"|"11/29/2018"|"Copy step successful."|"File2"|"c\temp2"
"STMDA#4321"|"00:02:59"|"11/29/2018"|"Copy step successful."|"File1"|"c\temp1"
"STMDA#4323"|"00:02:59"|"11/29/2018"|"Copy step successful."|"File3"|"c\temp3"
"STMDA#4324"|"00:02:59"|"11/29/2018"|"Copy step successful."|"File4"|"c\temp4"

Unexpected behavior with RxJava2 PublishSubject

I have the following code which uses a PublishSubject.
val subject = PublishSubject.create<Int>()
val o1: Observable<String> =
subject.observeOn(Schedulers.newThread()).map { i: Int ->
println("${Thread.currentThread()} | ${Date()} | map => $i")
i.toString()
}
o1.subscribe {
println("${Thread.currentThread()} | ${Date()} | direct subscription (1) => $it")
}
o1.subscribe {
println("${Thread.currentThread()} | ${Date()} | direct subscription (2) => $it")
}
o1.subscribe {
println("${Thread.currentThread()} | ${Date()} | direct subscription (3) => $it")
}
println("${Thread.currentThread()} | ${Date()} | submitting 1")
subject.onNext(1)
1) I create an Observable from it and map it (for the purpose of this example I am just converting to a String) => o1.
2) I then subscribe to o1 3 times.
3) Finally I "publish" an event by calling subject.onNext(1).
To my surprise I am getting the following output:
Thread[main,5,main] | Mon Jun 19 09:46:37 PDT 2017 | submitting 1
Thread[RxNewThreadScheduler-1,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-2,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-3,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-1,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (1) => 1
Thread[RxNewThreadScheduler-2,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (2) => 1
Thread[RxNewThreadScheduler-3,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (3) => 1
map ends up being called 3 times and I don't understand why since I am subscribing to o1 which should happen after map has occurred. I must be missing something. Any help would be appreciated.
Thanks
Yan
From the comments:
You subscribe to o1 three times, each creating an independent sequence up until the PublishSubject that will dispatch the onNext to all 3 chains.
From the perspective of all 3 subscribers, PublishSubject is a multicasting source that signals events to them through independent chains established by the subscribe() calls.
Applying operators on a Subject generally don't make the whole chain hot because those operator elements only get attached to the source Subject only when they are subscribed to. Thus, multiple subscriptions will yield multiple channels to the same upstream Subject.
Use publish to get a ConnectableObservable (or another PublishSubject at the very end) to make the sequence hot from that point on.

Linq to Get distinct List of rows in descending order

Consider following record
Id F1 F2 f3 Date
-------------------------------------------------
1 1800 1990 19 2016-06-27 09:24:25.550
2 1181 1991 19 2016-06-27 09:25:15.243
3 1919 2000 19 2016-06-27 11:04:27.807
4 1920 2000 19 2016-06-27 13:04:27.807
5 1800 2001 19 2016-06-28 09:24:25.550
6 1181 2002 19 2016-06-28 09:25:15.243
7 1919 2010 19 2016-06-28 11:04:27.807
I want to Groupby f1 sorted by Date descending
Desirder Output
Id F1 F2 f3 Date
-------------------------------------------------
7 1919 2010 19 2016-06-28 11:04:27.807
6 1181 2002 19 2016-06-28 09:25:15.243
5 1800 2001 19 2016-06-28 09:24:25.550
4 1920 2000 19 2016-06-27 13:04:27.807
I have Tried with
DateTime EndDate=DateTime.Now.AddDays(-1);
var result = (from opt in db.Output
where opt.f3==19 && opt.Date > EndDate
orderby opt.Date descending
select new
{
Id= opt.Id,
F1=opt.F1,
F2=opt.F2,
F3=opt.F3,
Date=opt.Date
}).GroupBy(x => x.F1).Select(s => s.OrderBy(o => o.F2).FirstOrDefault()).OrderByDescending(x => x.Date).ToList();
Im getting Output as
Id F1 F2 f3 Date
-------------------------------------------------
1 1800 1990 19 2016-06-27 09:24:25.550
2 1181 1991 19 2016-06-27 09:25:15.243
3 1919 2000 19 2016-06-27 11:04:27.807
4 1920 2000 19 2016-06-27 13:04:27.807
What is wrong with my code.
If I understand correctly you want the most recent item of each group:
db.Output.GroupBy(opt => opt.F1).
Select(group => group.OrderByDescending(opt => opt.Date).First()).
OrderBy(opt => opt.ID);
I'm not sure the translation to SQL with be efficient though due to the inner ordering.
Now since GroupBy preserves order, you might fix this issue with:
db.Output.OrderByDescending(opt => opt.Date).
GroupBy(opt => opt.F1).
Select(group => group.First().
OrderBy(opt => opt.ID);
The problem is in s.OrderBy(o => o.F2).FirstOrDefault(). Here ordering should be on Date.
Why your code doesn't work :
//creates group
.GroupBy(x => x.F1)
//Order by F1 and take first - *Here the record with latest date is eliminated
.Select(s => s.OrderBy(o => o.F2).FirstOrDefault())
//This order by desc is of no use as we already have only 1 rec from each group
.OrderByDescending(x => x.Date).ToList();
var result = db.Output
.Where(opt => opt.f3==19 && opt.Date > EndDate)
.OrderByDescending(o => o.Date)
.GroupBy(x => x.F1)
.Select(s => s.FirstOrDefault())
.ToList();
or
var result = db.Output
.Where(opt => opt.f3==19 && opt.Date > EndDate)
.OrderBy(o1=>o1.F2)
.ThenByDescending(o => o.Date)
.GroupBy(x => x.F1)
.Select(s => s.FirstOrDefault())
.ToList();
Use Multiple column Group
DateTime EndDate=DateTime.Now.AddDays(-1);
var result = (from opt in db.Output
where opt.f3==19 && opt.Date > EndDate
orderby opt.Date descending
select new
{
Id= opt.Id,
F1=opt.F1,
F2=opt.F2,
F3=opt.F3,
Date=opt.Date
}).GroupBy(x => new{x.Date, x.F1}).Select(s => s.OrderBy(o => o.F2).FirstOrDefault()).OrderByDescending(x => x.Date).ToList();

Paypal Recurring Payments IPN

I set up an IPN inside Paypal to hit every time a Recurring Payment using Payflow Pro is set to go through. How can I make it send back the variable for the custom ID I need to make sure that I can use to extend the membership?
So far I have tried ProfileID, payer_business_name, option_name1, rp_invoice_id, invoice, and custom, none are sent back when it goes through.
The custom variable should certainly work, if it was included in the POST. Alternatively you can add any variable name=value pair you like to the notify_url, as long as they don't conflict with PayPal's IPN variables.
rp_invoice_id is returned in both recurring_payments_profile_created and regular recurring_payment IPN's. Here's a sample of both.
Array
(
[payment_cycle] => Monthly
[txn_type] => recurring_payment_profile_created
[last_name] => Parr
[next_payment_date] => 02:00:00 Jan 02, 2014 PST
[residence_country] => US
[initial_payment_amount] => 0.00
[rp_invoice_id] => 5416
[currency_code] => USD
[time_created] => 11:40:24 Jan 02, 2014 PST
[verify_sign] => A0AUpo6gn8Mp.jtr-HUe-oSqCFb6A0LWR7wKLHmMMUUwszTktyPfL8DU
[period_type] => Regular
[payer_status] => verified
[tax] => 0.00
[payer_email] => blahblah#aol.com
[first_name] => Don
[receiver_email] => blahblah#usbswiper.com
[payer_id] => F5T99998MN
[product_type] => 1
[payer_business_name] => Testers, LLC
[shipping] => 0.00
[amount_per_cycle] => 1.95
[profile_status] => Active
[charset] => windows-1252
[notify_version] => 3.7
[amount] => 1.95
[outstanding_balance] => 0.00
[recurring_payment_id] => I-WK69LR0DU8DU
[product_name] => USBSwiper Monthly Subscription
[ipn_track_id] => 6ddc294dddb3f
)
Array
(
[mc_gross] => 1.95
[period_type] => Regular
[outstanding_balance] => 0.00
[next_payment_date] => 02:00:00 Feb 02, 2014 PST
[protection_eligibility] => Ineligible
[payment_cycle] => Monthly
[address_status] => confirmed
[tax] => 0.00
[payer_id] => F59999MN
[address_street] => 96 east granada drive
[payment_date] => 11:41:08 Jan 02, 2014 PST
[payment_status] => Completed
[product_name] => USBSwiper Monthly Subscription
[charset] => windows-1252
[rp_invoice_id] => 5416
[recurring_payment_id] => I-WK69LR0DU8DU
[address_zip] => 08723
[first_name] => Blah
[mc_fee] => 0.34
[address_country_code] => US
[address_name] => Testers, LLC
[notify_version] => 3.7
[amount_per_cycle] => 1.95
[payer_status] => verified
[currency_code] => USD
[business] => blah#usbswiper.com
[address_country] => United States
[address_city] => brick
[verify_sign] => AoumLIHoQx0AdOelHJVEVpKjHTDiArY--xdOStWxP3msX12oC3zHxpWw
[payer_email] => blahblah#aol.com
[initial_payment_amount] => 0.00
[profile_status] => Active
[amount] => 1.95
[txn_id] => 5DL77590UR008354X
[payment_type] => instant
[payer_business_name] => Testers, LLC
[last_name] => Blah
[address_state] => NJ
[receiver_email] => blahblah#usbswiper.com
[payment_fee] => 0.34
[receiver_id] => M5VRAQYEFCSK6
[txn_type] => recurring_payment
[mc_currency] => USD
[residence_country] => US
[transaction_subject] => USBSwiper Monthly Subscription
[payment_gross] => 1.95
[shipping] => 0.00
[product_type] => 1
[time_created] => 11:40:24 Jan 02, 2014 PST
[ipn_track_id] => 8e2c922895e5c
)
If you're not getting rp_invoice_id in your IPN's then it must not be getting included in your API request correctly.

Paypal Payment Failure for Recurring Payment API IPN's txn_type

I am implementing Recurring Payment API with Paypal Pro. My question is when a payment fails, and i receive an IPN, what will be its txn_type? And what all IPN's i'll be expecting? so that i can take care of then in my IPNhandler class.
Possible txn_type's you can get when using Recurring Payments consist of:
recurring_payment_profile_created
recurring_payment_profile_cancel
recurring_payment_profile_modify
recurring_payment
recurring_payment_skipped
recurring_payment_failed
recurring_payment_suspended_due_to_max_failed_payment
In most cases when a payment fails you'll get the skipped notification. I very rarely see an actual failed notification. I've never gotten any answers as to why that is.
Here are some samples.
Array
(
[payment_cycle] => Monthly
[txn_type] => recurring_payment_skipped
[last_name] => Testerson
[next_payment_date] => 03:00:00 Oct 24, 2012 PDT
[residence_country] => US
[initial_payment_amount] => 0.00
[rp_invoice_id] => 3250
[currency_code] => USD
[time_created] => 15:42:49 Sep 19, 2012 PDT
[verify_sign] => AH1WkYze3JQ1xNtDm31SsDJxLeGrAxPpeVKBrMHLFmRVOWXnZep95xOm
[period_type] => Regular
[payer_status] => unverified
[test_ipn] => 1
[tax] => 0.00
[payer_email] => test#hey.com
[first_name] => Tester
[receiver_email] => usb_1329725429_biz#angelleye.com
[payer_id] => TP7CXHP6TVNSS
[product_type] => 1
[shipping] => 0.00
[amount_per_cycle] => 1.95
[profile_status] => Active
[charset] => windows-1252
[notify_version] => 3.7
[amount] => 1.95
[outstanding_balance] => 0.00
[recurring_payment_id] => I-0SAH6FDN3JJA
[product_name] => USBSwiper Monthly Subscription
[ipn_track_id] => f2380796ce7c
)
Array
(
[payment_cycle] => Monthly
[txn_type] => recurring_payment_failed
[last_name] => Garcia
[next_payment_date] => 02:00:00 Feb 12, 2012 PST
[residence_country] => US
[initial_payment_amount] => 0.00
[rp_invoice_id] => 939
[currency_code] => USD
[time_created] => 16:29:33 Jan 29, 2010 PST
[verify_sign] => A5rGTRcXhg6p48uIMYaPQKo7dsKqAO89FRXvCmuAfV5EYGWkAAD0vbPc
[period_type] => Regular
[payer_status] => unverified
[tax] => 0.00
[payer_email] => testpayer#hey.com
[first_name] => Maria
[receiver_email] => testreceiver#hey.com
[payer_id] => EJ8JBQ63VHECL
[product_type] => 1
[shipping] => 0.00
[amount_per_cycle] => 4.95
[profile_status] => Active
[charset] => windows-1252
[notify_version] => 3.4
[amount] => 4.95
[outstanding_balance] => 14.85
[recurring_payment_id] => I-S3APFHH0KFJ2
[product_name] => USBSwiper Monthly Subscription
[ipn_track_id] => Gi2zp.DfhsYitm8Kd0Dn3g
)
Array
(
[payment_cycle] => Monthly
[txn_type] => recurring_payment_suspended_due_to_max_failed_payment
[last_name] => Nom_3
[next_payment_date] => N/A
[residence_country] => CA
[initial_payment_amount] => 0.00
[rp_invoice_id] => 3245
[currency_code] => USD
[time_created] => 10:53:25 Mar 14, 2012 PDT
[verify_sign] => AptDZCkTZINE6OhArrkjyIYauY8GAGO.XoBdyMW5t7SoHPSC8DOFS9kB
[period_type] => Regular
[payer_status] => unverified
[test_ipn] => 1
[tax] => 0.00
[payer_email] => sandbox#hey.com
[first_name] => Prenom_3
[receiver_email] => usb_1329725429_biz#angelleye.com
[payer_id] => TP7CXHP6TVNSS
[product_type] => 1
[shipping] => 0.00
[amount_per_cycle] => 1.95
[profile_status] => Suspended
[charset] => windows-1252
[notify_version] => 3.4
[amount] => 1.95
[outstanding_balance] => 1.95
[recurring_payment_id] => I-CEBHH0K0V7T1
[product_name] => USBSwiper Monthly Subscription
[ipn_track_id] => d09d07fdd833
)
Array
(
[mc_gross] => 1.95
[period_type] => Regular
[outstanding_balance] => 0.00
[next_payment_date] => 03:00:00 Aug 18, 2013 PDT
[protection_eligibility] => Ineligible
[payment_cycle] => Monthly
[address_status] => confirmed
[tax] => 0.00
[payer_id] => E7BTGVXBFSUAU
[address_street] => 1 Main St
[payment_date] => 05:00:34 Jul 18, 2013 PDT
[payment_status] => Completed
[product_name] => USBSwiper Monthly Subscription
[charset] => windows-1252
[rp_invoice_id] => 3275
[recurring_payment_id] => I-R0KGNCTUYAVW
[address_zip] => 95131
[first_name] => Drew
[mc_fee] => 0.15
[address_country_code] => US
[address_name] => Drew Angell's Test Store
[notify_version] => 3.7
[amount_per_cycle] => 1.95
[payer_status] => verified
[currency_code] => USD
[business] => usb_1329725429_biz#angelleye.com
[address_country] => United States
[address_city] => San Jose
[verify_sign] => AOX9jItnq2qBtXeyCB5nhWVdWyqEAScu5FToCodROuhjlKYjtDeAdlmL
[payer_email] => sandbo_1204199080_biz#angelleye.com
[initial_payment_amount] => 0.00
[profile_status] => Active
[amount] => 1.95
[txn_id] => 9PD943662S291292G
[payment_type] => instant
[payer_business_name] => Drew Angell's Test Store
[last_name] => Angell
[address_state] => CA
[receiver_email] => usb_1329725429_biz#angelleye.com
[payment_fee] => 0.15
[receiver_id] => C9TAVNJFATXCS
[txn_type] => recurring_payment
[mc_currency] => USD
[residence_country] => US
[test_ipn] => 1
[transaction_subject] => USBSwiper Monthly Subscription
[payment_gross] => 1.95
[shipping] => 0.00
[product_type] => 1
[time_created] => 15:10:22 Jun 18, 2013 PDT
[ipn_track_id] => 28067cf6ae8f
)
Array
(
[payment_cycle] => Monthly
[txn_type] => recurring_payment_profile_created
[last_name] => Angell
[next_payment_date] => 03:00:00 Jun 18, 2013 PDT
[residence_country] => US
[initial_payment_amount] => 0.00
[rp_invoice_id] => 3275
[currency_code] => USD
[time_created] => 15:10:22 Jun 18, 2013 PDT
[verify_sign] => ANrMRzzgbWP1I9ntjeVxAzQDTVjbATTckkxc4RtXKTYHoCoFDbklKPpd
[period_type] => Regular
[payer_status] => verified
[test_ipn] => 1
[tax] => 0.00
[payer_email] => sandbo_1204199080_biz#angelleye.com
[first_name] => Drew
[receiver_email] => usb_1329725429_biz#angelleye.com
[payer_id] => E7BTGVXBFSUAU
[product_type] => 1
[payer_business_name] => Drew Angell's Test Store
[shipping] => 0.00
[amount_per_cycle] => 1.95
[profile_status] => Active
[charset] => windows-1252
[notify_version] => 3.7
[amount] => 1.95
[outstanding_balance] => 0.00
[recurring_payment_id] => I-R0KGNCTUYAVW
[product_name] => USBSwiper Monthly Subscription
[ipn_track_id] => 1bf251e429b9c
)
Same as Andrew, but expanding on how skips and fails work (from what I've seen.):
recurring_payment_profile_created - When the profile is created. Important to note the recurring_payment_id, this is what you'll need to cancel/suspend/modify the profile.
recurring_payment_profile_cancel - When the profile is canceled.
recurring_payment_profile_modify - When the profile is modified.
recurring_payment - When you receive a recurring payment.
recurring_payment_skipped - When PayPal failed to collect payment and will try again in 5 days.
recurring_payment_failed - When MAXFAILEDPAYMENTS is not set, PayPal will try 3 times, if it fails all three, this will be the 3rd IPN.
recurring_payment_suspended_due_to_max_failed_payment - When MAXFAILEDPAYMENTS is set, this will be the IPN instead of recurring_payment_failed when the max is reached.