PAYPAL IPN custom field missing - paypal

I'm facing troubles implementing paypal recurring payment with the API process and the sandbox.
I succeed to create the subscription button and redirect the user to the paypal express checkout page.
But the custom field is missing in some IPN generated by paypal and I really need this field.
Here are the requests I send while generating the subscription button:
METHOD=SetExpressCheckout
&VERSION=94.0
&PWD=123456
&USER=myEmail#biz.com
&SIGNATURE=mySignature
&PAYMENTREQUEST_0_AMT=5.00
&PAYMENTREQUEST_0_PAYMENTACTION=Sale
&PAYMENTREQUEST_0_CURRENCYCODE=EUR
&RETURNURL=http%3A%2F%2Fwww.myWebSite.com?ok
&CANCELURL=http%3A%2F%2Fwww.myWebSite.com?ko
&L_BILLINGTYPE0=RecurringPayments
&L_BILLINGAGREEMENTDESCRIPTION0=test+paypal
&REQCONFIRMSHIPPING=0
&NOSHIPPING=1
&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital
&L_PAYMENTREQUEST_0_NAME0=test+paypal
&L_PAYMENTREQUEST_0_AMT0=5.00
&L_PAYMENTREQUEST_0_QTY0=1
&PAYMENTREQUEST_0_CUSTOM=custom_var1%3Dvalue1%7Ccustom_var2%3Dvalue2
After the user has confirmed the transaction, he is coming back to my website and I have to verify the informations and to create the recurring profil.
Here are the requests I do :
METHOD=GetExpressCheckoutDetails
&VERSION=94.0
&PWD=123456
&USER=myEmail#biz.com
&SIGNATURE=mySignature
&TOKEN=theToken
METHOD=CreateRecurringPaymentsProfile
&VERSION=94.0
&PWD=123456
&USER=myEmail#biz.com
&SIGNATURE=mySignature
&TOKEN=theToken
&AMT=5.00
&CURRENCYCODE=EUR
&PROFILESTARTDATE=2013-02-04T15%3A16%3A24%2B01%3A00
&BILLINGPERIOD=Day
&BILLINGFREQUENCY=1
&DESC=test+paypal
METHOD=DoExpressCheckoutPayment
&VERSION=94.0
&PWD=123456
&USER=myEmail#biz.com
&SIGNATURE=mySignature
&TOKEN=theToken
&PAYERID=JZUVX4TAHRHRU
&PAYMENTREQUEST_0_PAYMENTACTION=Sale
&PAYMENTREQUEST_0_AMT=5.00
&PAYMENTREQUEST_0_CURRENCYCODE=EUR
&PAYMENTREQUEST_0_NOTIFYURL=http%3A%2F%2Fwww.myWebSite.com?notify
&PAYMENTREQUEST_0_CUSTOM=custom_var1%3Dvalue1%7Ccustom_var2%3Dvalue2
After doing this I receive these IPN :
Array
(
[transaction_subject] => test paypal
[payment_date] => 06:01:52 Feb 04, 2013 PST
[txn_type] => express_checkout
[last_name] => numerik
[residence_country] => FR
[item_name] =>
[payment_gross] =>
[mc_currency] => EUR
[payment_type] => instant
[protection_eligibility] => Ineligible
[verify_sign] => myVerifySign
[payer_status] => verified
[test_ipn] => 1
[tax] => 0.00
[payer_email] => myEmail#per.com
[txn_id] => 6XC11065S3796804E
[quantity] => 1
[receiver_email] => myEmail#biz.com
[first_name] => buyer
[payer_id] => myPayerId
[receiver_id] => myReceiverId
[item_number] =>
[handling_amount] => 0.00
[payment_status] => Completed
[payment_fee] =>
[mc_fee] => 0.42
[shipping] => 0.00
[mc_gross] => 5.00
[custom] => custom_var1=value1|custom_var2=value2
[charset] => windows-1252
[notify_version] => 3.7
[ipn_track_id] => ab76ea3421261
)
Array
(
[payment_cycle] => Daily
[txn_type] => recurring_payment_profile_created
[last_name] => numerik
[next_payment_date] => 02:00:00 Feb 04, 2013 PST
[residence_country] => FR
[initial_payment_amount] => 0.00
[currency_code] => EUR
[time_created] => 06:01:47 Feb 04, 2013 PST
[verify_sign] => myVerifySign
[period_type] => Regular
[payer_status] => verified
[test_ipn] => 1
[tax] => 0.00
[payer_email] => myEmail#per.com
[first_name] => buyer
[receiver_email] => myEmail#biz.com
[payer_id] => myPayerId
[product_type] => 1
[shipping] => 0.00
[amount_per_cycle] => 5.00
[profile_status] => Active
[charset] => windows-1252
[notify_version] => 3.7
[amount] => 5.00
[outstanding_balance] => 0.00
[recurring_payment_id] => myRecurringPaymentId
[product_name] => test paypal
[ipn_track_id] => a8adfdf8b61d3
)
As you can see in the 1st IPN the field custom is available but not in the second one.
Does anyone know what I'm missing for retrieving the custom field in the 2nd IPN ?

Your DoExpressCheckoutPayment request includes the custom parameter which is why you're getting it back for that transaction. Your CreateRecurringPaymentsProfile request does not have a custom parameter included, so it would not come back.
That said, it doesn't look like the custom parameter is available to CRPP so you'll need to save your data locally and include your local record ID in the PROFILEREFERENCE paramter of your CRPP request. This way it will come back in IPN as rp_invoice_id like Matt Cole suggested, and you can pull your custom data back out of your database using that record ID accordingly.

Your best bet is to add PROFILEREFERENCE to your CreateRecurringPaymentsProfile call. It will come back in the IPN as rp_invoice_id.

Related

See if PayPal payment came from eBay for PayPal IPN [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
How do you stop eBay PayPal payments going to the IPN listener? (preferred but probably not possible?)
Or - How do I get my listener to ask where the payment comes from?
If from eBay do nothing / just verify (or store in table in hope of extending my order management system in future, say)
If from myshop log order for invoice, sending, etc.
What IPN variable can I use? Check for length of item number, perhaps? umm
If it comes from eBay there will be a for_auction parameter included that is set to true. You will also ebay_txn_idn, where n is the number of the item(s) array. Also an auction_buyer_id will be included. Plenty of options to flag those.
Here is an example of an IPN that came from an eBay auction:
Array
(
[mc_gross] => 440.99
[protection_eligibility] => Eligible
[for_auction] => true
[address_status] => confirmed
[item_number1] => 232029148438
[tax] => 0.00
[payer_id] => 83W5CCCCCCCS6
[ebay_txn_id1] => 1370976126013
[address_street] => 123 Test Ave
[payment_date] => 23:52:09 Oct 20, 2016 PDT
[payment_status] => Completed
[charset] => windows-1252
[address_zip] => 59840-2149
[mc_shipping] => 21.00
[first_name] => David
[mc_fee] => 10.00
[auction_buyer_id] => comasdfr33
[address_country_code] => US
[address_name] => Tester Testerson
[notify_version] => 3.8
[custom] => EBAY_EMSCX0000687394734010
[payer_status] => unverified
[business] => sales#domain.com
[address_country] => United States
[num_cart_items] => 1
[address_city] => Hamilton
[verify_sign] => A0av94YibvcTZFf.ILwh4u8suh06AqfSvHzsAv3r.zSG91GuDFSbZ.Mw
[payer_email] => asdfg#gmx.com
[contact_phone] => 408-636-6400
[txn_id] => 9EX39945FA6779640
[payment_type] => instant
[last_name] => Testerson
[address_state] => MT
[item_name1] => Zebra GX420d USB/Serial/Ethernet Mono Direct Printer
[receiver_email] => sales#domain.com
[payment_fee] => 10.00
[quantity1] => 1
[receiver_id] => EMY7DGXTF8ZVE
[insurance_amount] => 0.00
[txn_type] => cart
[item_name] => Zebra GX420d USB/Serial/Ethernet Mono Direct Printer
[mc_gross_1] => 419.99
[mc_currency] => USD
[item_number] => 232029148438
[residence_country] => US
[receipt_id] => 0428-5320-1923-6500
[transaction_subject] =>
[payment_gross] => 440.99
[ipn_track_id] => 9429e4ed195db
)

PayPal DoCapture in Sandbox fails with 10609 error - Invalid TransactionID

Paypal's Sandbox API responds to a DoCapture with "Invalid TransactionID" error code 10609. The same operation works correctly in the PayPal live site. I think there might be some deprecated params that are rejected in the Sandbox, but accepted in the PayPal live site.
The ff. is POST data from IPN:
[mc_gross] => 1.05
[auth_exp] => 05:28:33 May 26, 2016 PDT
[protection_eligibility] => Ineligible
[payer_id] => SCBNBBCFDWQ54
[tax] => 0.00
[payment_date] => 05:28:33 Apr 26, 2016 PDT
[payment_status] => Pending
[charset] => windows-1252
[first_name] => SandboxStephen
[option_selection1] => Lc1tCoAwCAbgu3iCxtYHdpghtEKoUc2IEd09G_ulPq8oYYtPwh7hSuH0PMGYlMCYbrB_r8kUaK2JRXCuqc7JLzzLPxmEogPCcVEUllzZlKq-U95CFL-QhJtyPagb-ub9AA,,~7634f
[transaction_entity] => auth
[option_selection2] => VU7LDgIhEPuX-QACw_CavfoHxjPZAAdNBLO4h43x3wXjxfYybZNOVyZ-dUaG6wOWzooYnBZIQSiDQqH8upphvbe9PmMtJZcMS2YlpJF_ICLpA8rgR2DRqsFABq11qK1Gr9D82tK-baWmI6aWy3wxvMv5NC83tvR4661OJRlgeX8A~97b17
[option_selection3] => S7QytKoutjK3UspNLS5OTE9Vsi62MrBSUrKuBQA,~2c5b4
[option_selection4] => S7QytqoutjK3UkrPTCuJL8lXsi62MrBSAlGWUMG0ovxcJGFDA6h4am5iZg5cohYA~2aa63
[notify_version] => 3.8
[custom] =>
[payer_status] => verified
[business] => xxxxxxx#xxxxx
[quantity] => 1
[verify_sign] => AvzodxdQ1l47jbnC5iCE7iEjAVYEAnMT6fQE9TdHnShf4zX8V6L99Kpe
[payer_email] => xxxxxx#xxxx
[option_name1] => Transkey
[parent_txn_id] =>
[option_name2] => Syskey
[option_name3] => Message
[option_name4] => Gift
[txn_id] => 4R146799GX924083N
[payment_type] => instant
[remaining_settle] => 10
[auth_id] => 4R146799GX924083N
[last_name] => xxxxx
[receiver_email] => xxxxxxx#xxxxx
[auth_amount] => 1.05
[shipping_discount] => 0.00
[insurance_amount] => 0.00
[receiver_id] => F3XAHZBJYATHU
[pending_reason] => authorization
[txn_type] => web_accept
[item_name] => Test New Deal 2 (Topic)
[discount] => 0.00
[mc_currency] => USD
[item_number] =>
[residence_country] => US
[test_ipn] => 1
[shipping_method] => Default
[handling_amount] => 0.00
[transaction_subject] =>
[payment_gross] => 1.05
[auth_status] => Pending
[shipping] => 0.00
[ipn_track_id] => ff07a74b6ad10
The ff. are parameters for DoCapture:
[authorization_id] => 4R146799GX924083N
[amount] => 1.05
[invoice_id] => 9569
[currency] => USD
[CompleteCodeType] => Complete
[note] => Acuerdo de pago
The ff. is PayPal's response to DoCapture:
[AUTHORIZATIONID] => 4R146799GX924083N
[TIMESTAMP] => 2016-04-26T12:28:57Z
[CORRELATIONID] => 82d81683c3cc8
[ACK] => Failure
[VERSION] => 62
[BUILD] => 21669447
[L_ERRORCODE0] => 10609
[L_SHORTMESSAGE0] => Invalid transactionID.
[L_LONGMESSAGE0] => Transaction id is invalid.
[L_SEVERITYCODE0] => Error
I have tested the new PayPal security upgrades on the site and they work correctly. I specify a very old version (62) of the API, so that might be the problem, but I don't see what I need to change to get the Sandbox to work correctly.
Thanks.
It looks like you mix up the sandbox environment and live environment. You call DoCapture in the live environment, but the 4R146799GX924083N transaction is generated in sandbox environment.
When you call Docapture API, please make sure the API endpoint is https://api-3t.sandbox.paypal.com/nvp , the endpoint change to sandbox , not live.

Paypal IPN keeps failing - The totals of the cart item amounts do not match order amounts

We are using Woocommerce and Woocommerce Subscriptions. For some reason by default, Woocommerce Subscriptions (Reference Transactions) do not pass or include the Tax amount to Paypal. So I ended up modifying the class files and added in the field "TAXAMT" in the IPN.
However, when I did so, it is now giving us the error:
[L_ERRORCODE0] => 10413
[L_ERRORCODE1] => 10004
[L_SHORTMESSAGE0] => Transaction refused because of an invalid argument. See additional error messages for details.
[L_SHORTMESSAGE1] => Invalid Data
[L_LONGMESSAGE0] => The totals of the cart item amounts do not match order amounts.
[L_LONGMESSAGE1] => This transaction cannot be processed.
[L_SEVERITYCODE0] => Error
[L_SEVERITYCODE1] => Error
Can anybody please help me identify what's missing or what is wrong here?
Below is the IPN request sent to paypal (via woocommerce paypal logs)
This is a recurring product. The product costs $7.70 and the Tax is $0.77 with a total of $8.47
[USER] => ****************
[PWD] => ****************
[SIGNATURE] => ********************************************************
[VERSION] => 124
[METHOD] => DoReferenceTransaction
[REFERENCEID] => B-4CR65046J0487452E
[BUTTONSOURCE] => WooThemes_Cart
[RETURNFMFDETAILS] => 1
[AMT] => 7.70
[CURRENCYCODE] => AUD
[INVNUM] => WC-5184
[PAYMENTACTION] => Sale
[NOTIFYURL] => https://affgo.co/go/wc-api/WC_Gateway_Paypal/
[CUSTOM] => {"order_id":5184,"order_key":"wc_order_56bad2660bf0f"}
[TAXAMT] => 0.77
[ITEMAMT] => 8.47
[L_PAYMENTREQUEST_0_NAME0] => Subscriptions → IMMag Monthly
[L_PAYMENTREQUEST_0_AMT0] => 7.70
[L_PAYMENTREQUEST_0_QTY0] => 1
[PAYMENTREQUEST_0_ITEMAMT] => 7.70
[PAYMENTREQUEST_0_SHIPPINGAMT] => 0.00
[PAYMENTREQUEST_0_TAXAMT] => 0.77

Paypal sandbox 'Pending' multicurrency

Im currently using PayPals rest api. When executing payment it is returning as 'Pending' and the reason its stating is 'Multi Currency'.
The reason behind this is because the default 'facilitators' account is set to US i need it to all be in GB. The problem is I can login to user-facilitators#email.co.uk's account on sandbox.paypal.co.uk. I'm entering the email and password (which is 100% correct) and It wont let me login to sandbox so I can change the currency preferences back to GBP.
Does anybody no why?
In order to log into a Sandbox Paypal account, you have to be logged into your Paypal Developer Account
as the default 'facilitators' account is set to US and you want to change it to other country. but this edit is not possible in sandbox.
so an alternate solution is to create an another sandbox account and set it to business account. set your desired country and then currency will be your country currency, automatically.
after doing this, use this business account for testing instead of that default 'facilitators' account.
like this you can create any number of business accounts for any country/currency.
hope this will help to you and understood.
Yes, once we register on Paypal developer site, as default, Paypal will issue us two default test account, one is merchant account and another is user test account. All there are fine.
But the problem is their default currency is US, and We can't change them.
When your Magento store's base currency has been set others, like AU, this issue definitely will come out with following system log:
[CURRENCYCODE] => AUD
[PAYMENTSTATUS] => Pending
[PENDINGREASON] => multicurrency
Create another merchant account and set the same currency with your Magento store, it will be fixed.
payment_paypal_express.log
2014-12-12T01:51:34+00:00 DEBUG (7): Array
(
[url] => https://api-3t.sandbox.paypal.com/nvp
[GetTransactionDetails] => Array
(
[TRANSACTIONID] => 15Y48062WM0910211
[METHOD] => GetTransactionDetails
[VERSION] => 72.0
[USER] => ****
[PWD] => ****
[SIGNATURE] => ****
[BUTTONSOURCE] => OneStepCheckout_SI_MagentoCE
)
[response] => Array
(
[RECEIVEREMAIL] => john.yin.au-facilitator#gmail.com
[RECEIVERID] => VQ37QYGD3SFPW
[EMAIL] => john.yin.au-buyer#gmail.com
[PAYERID] => LXDH2RT89NRAS
[PAYERSTATUS] => verified
[COUNTRYCODE] => US
[SHIPTONAME] => john h
[SHIPTOSTREET] => 33
[SHIPTOSTREET2] => esdfd re
[SHIPTOCITY] => ddw
[SHIPTOSTATE] => AL
[SHIPTOCOUNTRYCODE] => AU
[SHIPTOCOUNTRYNAME] => Australia
[SHIPTOZIP] => 34343
[ADDRESSOWNER] => PayPal
[ADDRESSSTATUS] => Confirmed
[INVNUM] => 100000036
[SALESTAX] => 0.00
[TIMESTAMP] => 2014-12-12T01:51:34Z
[CORRELATIONID] => 2ef746f5f1a77
[ACK] => Success
[VERSION] => 72.0
[BUILD] => 14077178
[FIRSTNAME] => Test
[LASTNAME] => Buyer
[TRANSACTIONID] => 15Y48062WM0910211
[TRANSACTIONTYPE] => cart
[PAYMENTTYPE] => instant
[ORDERTIME] => 2014-12-12T01:50:39Z
[AMT] => 44.00
[TAXAMT] => 0.00
[SHIPPINGAMT] => 0.00
[HANDLINGAMT] => 0.00
[CURRENCYCODE] => AUD
[PAYMENTSTATUS] => Pending
[PENDINGREASON] => multicurrency
[REASONCODE] => None
[PROTECTIONELIGIBILITY] => Eligible
[PROTECTIONELIGIBILITYTYPE] => ItemNotReceivedEligible,UnauthorizedPaymentEligible
[L_NAME0] => color swatch te
[L_NUMBER0] => ZP-D3241-WHITE-L
[L_QTY0] => 1
[L_TAXAMT0] => 0.00
[L_SHIPPINGAMT0] => 0.00
[L_HANDLINGAMT0] => 0.00
[L_CURRENCYCODE0] => AUD
[L_AMT0] => 44.00
)
[__pid] => 30696
)

paypal IPN get buyer transaction ID

I need the buyer transaction ID that correspond to the transaction PayPal notifies me by IPN.
I'm using
$_POST['txn_id']
but this stores the transaction ID for the seller, not the transaction ID of the buyer. At the same time the buyer hasn't access to the transaction ID of the seller.
I understand that PayPal assign two different transactions ID, but the seller needs to stores the buyer transaction ID in order to be able to communicate with the user about an specific transaction.
Anyone know how I can receive (or search for) the buyer transaction ID when PayPal send a notification to my IPN script?
I only receive the follow data:
Array
(
[mc_gross] => 7.00
[protection_eligibility] => Ineligible
[payer_id] => F6912JHUIIHA
[tax] => 0.00
[payment_date] => 10:14:55 Sep 11, 2011 PDT
[payment_status] => Completed
[charset] => windows-1252
[first_name] => Name
[mc_fee] => 2.08
[notify_version] => 3.2
[custom] =>
[payer_status] => verified
[business] => myemail#gmail.com
[quantity] => 1
[verify_sign] => 123232jh4i32u4u3h5n435i43u5455645
[payer_email] => payermail#gmail.com
[txn_id] => 123u4324324yuy4574
[payment_type] => instant
[btn_id] => 35428120
[last_name] => lastname
[receiver_email] => receiver#gmail.com
[payment_fee] => 2.08
[shipping_discount] => 0.00
[insurance_amount] => 0.00
[receiver_id] => OIUWDWUERWEU
[txn_type] => web_accept
[item_name] => Product name
[discount] => 0.00
[mc_currency] => USD
[item_number] => PRODNum
[residence_country] => SE
[handling_amount] => 0.00
[shipping_method] => Default
[transaction_subject] => Product to sell
[payment_gross] => 7.00
[shipping] => 0.00
[ipn_track_id] => ydedi23484rl4itm54oi
)
From the looks of the list of variables paypal sends back, there is no buyer transaction id.
Another option:
Usually when you send your order information to paypal, you can include an invoice/order number, the buyer, if needed, is able to search his history by your invoice number (the same way they would search by transaction id) if you include it when you send the info to paypal.
You can use the GetTransactionDetails API and pass in the buyer's transaction ID.
A sample API call would be:
METHOD=GetTransactionDetails&
TRANSACTIONID=buyers transaction ID&
See also: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_GetTransactionDetails