I've got an application using Paypal's IPN interface, pointing at the sandbox site while it's in development.
I've got it handling the success cases correctly, along with the failure cases I accidentally generated during account setup ;-) What I can't find though is how to simulate a transaction being denied, refunded or reversed (other than producing an entirely fake IPN through the test tool, but that won't tie up with transactions at my end so isn't a great test). I've tried enabling the negative testing but that didn't seem to do anything different.
Are these outcomes possible to test using the sandbox and if so, what do I need to set up to create them? Thanks :-)
EDIT: Here's the form code that's submitted for a test transaction.
<form id="payForm" method="post"
action="https://www.sandbox.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_xclick" />
<input type="hidden" name="business"
value="greg_1362574680_biz#gregwebb.co.uk" />
<input type="hidden" name="item_number" value="1_25_2013-03-2221:02:02.063" />
<input type="hidden" name="item_name"
value="ISM Print Subscription - One Year" />
<input type="hidden" name="amount" value="20.00" />
<input type="hidden" name="no_shipping" value="1" />
<input type="hidden" name="return"
value="http://ism.gregwebb.co.uk/?p=PaymentReceived" />
<input type="hidden" name="rm" value="" />
<input type="hidden" name="notify_url"
value="http://ism.gregwebb.co.uk/Payment/Paypal/IPNRecv.aspx" />
<input type="hidden" name="cancel_return"
value="http://ism.gregwebb.co.uk/?p=PaymentCancelled" />
<input type="hidden" name="currency_code" value="GBP" />
<input type="hidden" name="custom" value="1_25_2013-03-2221:02:02.063" />
</form>
You can enable payment review on your test account to allow you to test this. You can also use specific values to trigger specific conditions when processing transactions. You would need to use Negative Testing. You can find more on sandbox and negative testing here.
By default, the Sandbox mimics the live PayPal site as closely as possible. This means means an error condition can be replicated only by creating the exact conditions and sequences of events to raise the error. The Sandbox is a positive test environment in that it's well-suited for testing your program logic as it follows an error-free path. However, you can also do negative testing with the Sandbox, meaning you can force flows through the different error conditions you expect to encounter.
Use negative testing to test against the following kinds of errors:
Errors that result from calling a PayPal API.
Address verification and credit card validation errors that occur through Virtual Terminal, or by calling DoDirectPayment.
NOTE: Negative testing is only available for Version 2.4 and later of the Classic PayPal APIs.
You raise error conditions by setting erroneous values in the fields you pass to an API operation. By setting different input values to erroneous states, you can trigger the API to respond to specific error conditions. Negative testing is available only in the Sandbox; you cannot force or simulate error conditions on the live PayPal site.
To enable negative testing:
Navigate to the Profile > Settings page of your test merchant's Business account.
Set Negative Testing to On.
This sets the Sandbox into the negative testing state for transactions that include the merchant. Without this configuration, the Sandbox does not raise error conditions, unless the error would be raised in the default positive test environment.
Related
Okay, so we have a member site using Joomla, and a component that allows users to perform certain tasks (creating teams). They are allowed to login, and create a team, but they can't add members to this team until they pay a $25.00 fee.
This happens through Paypal IPN. There is essentially this form below... (some personal data removed).
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="item_name" value="<?php echo $item_name;?>">
<input type="hidden" name="business" value="blah#blah.com">
<input type="hidden" name="amount" value="25">
<input type="hidden" name="quantity" value="1">
<input type="hidden" name="no_note" value="1">
<!--<input name="userId" value="<?php //echo $user->id;?>" type="hidden">-->
<!--<input name="task" value="paypal_register" type="hidden">-->
<input type="hidden" name="currency_code" value="USD">
<!-- Enable override of buyers's address stored with PayPal . -->
<!-- Set variables that override the address stored with PayPal. -->
<input type="hidden" name="return" value="<?php echo JURI::ROOT().'index.php?option=com_fastball&view=payment&task=paypal_register';?>">
<input type="hidden" name="notify_url" value="<?php echo JURI::ROOT().'index.php?option=com_fastball&view=payment&task=paypal_register&userId='.$user->id.'&ipn=1';?>">
<!--<input type="image" name="submit" border="0" src="https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif" alt="PayPal - The safer, easier way to pay online">-->
</form>
Now sometimes the IPN redirects and works just fine. But other times it cuts the url short from "index.php?option=com_fastball&view=payment&task=paypal_register&userId=" to "index.php?option=com_fastball", therefore not activating the view in Joomla that contains the code to update the database on notification.
It seems fairly random. There are several scenarios, 1 - New User Creating New Team. 2 - Old User Creating New Team. 3- Old User Renewing Old Team.
But regardless of that, they ALL hit this payment form button with THESE notify URL as hidden input.
So I'm not sure where paypal is either A.) Getting the shortened URL, or B.) They are cutting it short for some reason. It returns to the shortened URL with all of the Paypal Post info showing in the URL Parameters (&st=Completed&amt=25.00 etc from paypals servers)
This has been extremely frustrating and I may not have explained it well so if you have any questions or thoughts, just let me know. Thanks!
For URL paths you should use JURI::base() not JURI::ROOT. You can check the documentation here https://docs.joomla.org/Constants.
This appears to be a recent PayPal problem. All the urls (return, cancel_return, and notify_url) PayPal is stripping the url of all content after the first '&'.
Note also that the issue appears to be intermittent; it may be dependent on the PayPal server you connect to (QueryString values removed from the IPN endpoint by PayPal).
I have made some modifications to my own PayPal form replacing just the '&' with '&' (the encoded version) and that seems to work.
I have built a system with Paypal for a client however the client has now asked once a customer has made an order if an email can be sent to them and also the warehouse so they can start packaging it.
Just to make sure could this be achieved by adding another value in the html code like this:
<input type="hidden" name="business" value="email#address1.co.uk" value="email#address2.co.uk">
<input type="hidden" name="currency_code" value="GBP">
<input type="hidden" name="item_name" value="Personal Built Board 27 Inch">
<input type="hidden" name="amount" value="44.50">
.... and so on
PayPal is a payments service, not an email service: the business identifies the recipient of the transaction (order, and eventually payment), and only incidentally who gets sent the email. You need to identify the (single) counterparty to the transaction in this 'business' field.
Also, PayPal recommends against using their emails for fulfillment activity, as there are too many ways for it to go wrong (emails can get spam filtered, misfiled, spoofed, etc).
The best practice for this sort of thing is to integrate PayPal's IPN service for secure notification of order placements. Your sytem would, upon receiving and verifying the IPN, send whatever notifications are required to various people or systems to initiate fulfillment (e.g., you send 2 different emails from the one IPN, if emails are what you want to use internally).
Yes, it is possible, but you have to change the syntax like below.
Use [ ] in the field name to send multiple values:
<input type="hidden" name="your_field_name[]" value="1" />
<input type="hidden" name="your_field_name[]" value="2" />
<input type="hidden" name="your_field_name[]" value="3" />
You will get an array of values in the your_field_name field.
Refer this.
I'm hoping there's an accepted method for this, as I seem to be able to get it to kind of work.
I have a donate form that has an optional 'One-off/Every month' select box.
Ideally the user should be able to either donate a one-off amount, or create a donation subscription.
The issue I'm facing is that there's a subscription button, and there is a donate button, but no donate subscription button.
So the code I've cobbled together so far almost works:
<form name="_xclick" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_donations" />
<input type="hidden" name="no_note" value="1" />
<input type="hidden" name="a3" value="5.00" />
<input type="hidden" name="p3" value="24" />
<input type="hidden" name="t3" value="M" />
<input type="hidden" name="src" value="1" />
<input type="hidden" name="sra" value="1" />
<input type="hidden" name="bn" value="PP-DonationsBF:btn_donateCC_LG.gif:NonHostedGuest" />
<input type="hidden" name="business" value="X" />
<input type="hidden" name="currency_code" value="GBP" />
<input type="hidden" name="no_note" value="0" />
<input type="hidden" name="return" value="X" />
<input type="hidden" name="item_name" value="X" />
<input type="submit" name="submit" value="Donate now" />
</form>
(X replacing sensitive values)
So this will pass the user to a page that at least looks kind of right:
It's a donation form, with a subscription checkbox - almost there!
However you'll notice that the amount isn't present, and the recurring box isn't ticked.
If I include the amount attribute with the form then none of the subscription bits show up, and it reverts to a standard donation page.
Is what I'm trying to do actually possible? I mean it really should be, but the only content on the PayPal site that refers to it (via a Google search) takes me to a 404 page, so who knows: https://www.paypal.com/webapps/mpp/get-started/create-recurring-donation-button
(It's also not on the WayBack machine, unfortunately)
The description text on Google looks promising… so I'll keep my fingers crossed that somebody knows what used to be on that page…
Edit: The above link appears to be functioning correctly now. Must be due to some weird territory/permissions bug, as yesterday while logged in it was just a 'Sorry this page does not exist' page; logging out seems to have granted me access to PayPal's knowledge.
However the content is a tad ambiguous (maybe):
The instructions below will show you how to create a recurring donation button by creating a Subscription button, then changing some of the HTML … to make it appear as a Donate button.
I'm not sure I really see any advantage to this - are they saying this process will create a subscription button that just looks like a donation button? Not sure what the purpose of that would be…
After speaking with PayPal this morning on the phone I can confirm that #geewiz and the common advice is definitely the way to go. i.e. just use a standard subscription.
The piece of the puzzle I was missing (partially due to this being work for a client) is that the fee's applied are based on the account, not the payment type. i.e. a 'donation' through paypal is no different than any other payment, it's just a different button (and a slightly modified form at the other end).
If you're registered as a charity etc. then a standard subscription is sufficient, and the walkthrough provided by PayPal in my OP is the best resource for that. Just be warned that you might see a 'Sorry, that page doesn't exist' message when visiting the link. Logging out of PayPal worked for me.
I have been making a hotel booking software that calculates, for given dates and specifications, a price for staying at a hotel. I'm looking to use Paypal for accepting the payment, but having browsed their website, can't find a solution that seems to be compatible with this.
Since the price is dynamic, it's not like a normal one-price product which Paypal seems to handle best. I need a method where I can send the cost to Paypal, have Paypal charge the customer, then have Paypal send a confirmation back to the website that the payment has processed correctly at which point the booking is complete.
I presume Paypal is capable of handling a dynamically priced item like this. Could anyone point me in the direction of where I should be looking?
I just completed this process in my current website: bpremium.com, basically I built a webservice api for the payment process where it can send commands over javascript until it gets to the last stage, which is where you build the form you send to paypal.
in order to record the payment, you setup another webservice for the notify url and this will catch all the $_POST data and process it into your database.
<form id="form-payment-paypal" action="https://www.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_xclick" />
<input type="hidden" name="bn" value="PP-BuyNowBF" />
<input type="hidden" name="charset" value="utf-8" />
<input type="hidden" name="business" value="YOUR_ACCOUNT_EMAIL_ADDRESS" />
<input type="hidden" name="item_name" value="THE PRODUCT NAME" />
<input type="hidden" name="item_number" value="YOUR_RECOGNISABLE_SALE_ID?>" />
<input type="hidden" name="currency_code" value="EUR" />
<input type="hidden" name="lc" value="THE LANGUAGE CODE: es_ES, en_GB, etc" />
<input type="hidden" name="amount" value="<?=$amount+($amount*0.04)?>" />
<input type="hidden" name="return" value="/payment/complete/" />
<input type="hidden" name="notify_url" value="/webservice/payment/notify/paypal/" />
<p class="ac span300">
<input type="submit" class="form-style-bt" value="PAY" />
</p>
</form>
that is basically what we use, you can see we put the $amount + $amount*0.04 because you needed to add a 4% surcharge in spain, where I am. perhaps thats different in your code.
I think the rest of it is pretty self explanatory.
on the /webservice/ url, you need to record everything into your database, it sends you the information whether it succeeded or failed, but it's not a call to your website, you won't see this page, it's a "back channel" call to your website, so it's not your landing page, it's simple the url paypal sends all the raw data to, you're supposed to record it, process it and perhaps send out emails, etc.
then if the user returns to your website, you land on the /payment/complete page, so this page could show the result, whether everything is ok, or something failed.
hope it helps.
Paypal's Direct Integration can handle pricing like this. I'd imagine some of their less involved solutions will too, but I know that DI does.
Edit:
ExpressCheckout appears to also:
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_nvp_r_SetExpressCheckout
I'm trying to setup a registration form for some workshops that last a week. Basically, they can sign up for the workshops individually or the whole week. Depending on what they select, the price will change. I get how to send this information to paypal, however I also want to submit information to my own DB. How would I submit to paypal and file the info into my DB at the same time?
I also want to have a variable that is returned that verifies they have paid so I can mark it in my DB.
Would I just have another page that would put all this info into the DB (once submitted) then also put the info into hidden form fields and then automatically submit to paypal?
Thanks in advance! :)
"When payment is successful your user is returned to your self which is when you can record the payment in the db."
That's exactly what you shouldn't be doing.
Depending on a buyer to return to your website in order to update an order status is the worst thing you can do.
PayPal IPN was designed with especially this use case in mind.
Simply add in
This will ensure PayPal will POST to you whenever the payment has completed. Even if your buyer has already closed his/her browser.
You can use the 'custom' fields to link an IPN POST to a transaction made on your site. For example:
will ensure you get an IPN POST with $_POST['custom'] of '1122334455'. From there, it's simply a matter of making a db call to update the order status to 'paid', or whatever you use to mark it as payment received.
Oh, and don't forget to post the data back to https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate to validate the IPN POST. More info is available at https://www.paypal.com/ipn/
So I guess you are probably using Website payment standard.
If so the process is like this:.
Users signs up for a particular workshop using your form (select prices, time etc etc)
On submit you process the form (check validation etc)
If you happy with this then you generate a from that is automatically posted to paypal that looks like this:
<body onLoad="document.forms['paypal_auto_form'].submit();">
<p>Please wait</p>
<form method="post" action="https://www.paypal.com/cgi-bin/webscr" name="paypal_auto_form"/>
<input type="hidden" name="rm" value="2" />
<input type="hidden" name="cmd" value="_xclick" />
<input type="hidden" name="currency_code" value="AUD" />
<input type="hidden" name="quantity" value="1" />
<input type="hidden" name="business" value="PAYPAL#EMAIL.COM" />
<input type="hidden" name="return" value="http://domain.com/paypal/success" />
<input type="hidden" name="cancel_return" value="http://domain.com/paypal/cancel" />
<input type="hidden" name="notify_url" value="http://domain.com/paypal/ipn" />
<input type="hidden" name="custom" value="1234567890" />
<input type="hidden" name="item_name" value="Paypal Test Transaction" />
<input type="hidden" name="item_number" value="6941" />
<input type="hidden" name="amount" value="197" />
<p><input type="submit" name="pp_submit" value="Pay Now!" /></p></form>
</body>
The values you of course customize to what you want. Look at Appendix A of the paypal documentation for the variables. You can also add your own log with cpp_header_image or something like that.
The users is taken to paypal to process payments
When payment is successful your user is returned to your self which is when you can record the payment in the db. You might use some for of key or cookie variable to track the payment they have made.
You probably want to use the IPN to double check that it was successfully paid.
If all this is too hard just use http://wufoo.com/ and add the payment module to the form.