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.
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'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 am creating an e-shop builder, i.e. a site where a user creates their site and e-shop. The products are entered into my custom CMS by the person who builds the e-shop. I ask the shop builder to link the shop to their PayPal account by entering their e-mail.
I am currently trying to create a checkout button for my cart.
Problem is, multiple products might have different tax rates, for instance alcoholic beverages might have a 13% tax rate whereas other products have 23%. Is there a way to incorporate this in the post request?
Ideally what I would like to do is this:
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="item_name_1" value="Some product">
<input type="hidden" name="item_number_1" value="1">
<input type="hidden" name="amount_1" value="20.00" />
<input type="hidden" name="tax_rate_1" value="23">
<input type="hidden" name="item_name_2" value="Some alcoholic product">
<input type="hidden" name="item_number_2" value="1">
<input type="hidden" name="amount_2" value="15.00" />
<input type="hidden" name="tax_rate_2" value="13">
<!-- other fields omitted for brevity -->
</form>
The tax_rate_1 and tax_rate_2 fields are hypothetical, I don't know if something like this is possible.
If I RTFM'ed correctly, setting per-item tax rates should be possible if you register the products yourself in the PayPal website interface. This is exactly what I am trying to avoid, because the products are entered by the end user on my CMS.
If what I want isn't possible with a Website Payments Standard button, I would also welcome other ideas on how to forward such orders to PayPal. I am trying to avoid the Express Checkout payment product because if I understand correctly I won't have full control of the cart. I want to have a custom cart and later be able to offer more payment options besides PayPal.
Please help in any way you can! I am a total noob with PayPal.
To answer my own question, what I want is indeed possible and is described in the manual. In my situation where I have built a custom shopping cart, I want to use the Cart upload command of the Website Payments Standard product.
To do a "cart upload" I've set the following fields:
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
The variables are tax_1, tax_2, etc. They need to be specified as currency, not percentage.
I have a Donate button set up for the user to enter the donation amount. I am trying to send an amount with the button. I can enter amount=1.00 in the Add Advanced Variables in the button setup - that works fine. However, I have had no success sending the amount as part of the URL. I have added the following line to the PayPal button form:
<input type="hidden" name="amount" value="9.99" />
but the amount field is blank when I get to PayPal. Any thoughts what I am doing wrong?
If you're creating a so called 'hosted button' (that is, a button where the button details are stored on the PayPal side), then the 'amount' POST parameter is ignored for requests to https://www.paypal.com/cgi-bin/webscr.
This is a security feature to prevent people from being able to manipulate the amount passed to PayPal for checkout.
You can identify whether you're using a hosted button by the following data;
Hosted buttons will have a value for cmd of _s-xclick and include the hosted_button_id parameter.
If this is the case, you cannot update the amount by passing in an extra amount POST parameter.
However, because you're dealing with donations and the amount is flexible by definition, you don't in fact need a 'hosted button'.
In the button creation form, turn off 'Host button with PayPal', or write your own to point to PayPal.
If you do this, you can set the amount via the amount POST parameter.
For example, the below works fine;
<form method="POST" action="https://www.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_donations">
<label for="amount">Amount: </label><input type="text" name="amount" value="">
<input type="submit" name="submit" value="Pay with PayPal">
</form>
Robert's solution is on the right track, however a non-hosted PayPal form will not work without the hidden "business" field (which should have a value of the email address associated with your PayPal account.)
Other fields should be included for thoroughness:
<input type="hidden" name="business" value="myemail#here.com">
<input type="hidden" name="item_name" value="Donation Description">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="tax" value="0">
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