PayPal(3p)

NAME
Business::PayPal - Perl extension for automating PayPal transactions

ABSTRACT
Business::PayPal makes the automation of PayPal transactions as simple as doing credit card transactions through a regular processor. It includes methods for creating PayPal buttons and for validating the Instant Payment Notification that is sent when PayPal processes a payment.

SYNOPSIS
  To generate a PayPal button for use on your site
  Include something like the following in your CGI

  use Business::PayPal;
  my $paypal = Business::PayPal->new;
  my $button = $paypal->button(
      business => 'dr@dursec.com',
      item_name => 'CanSecWest Registration Example',
      return => 'http://www.cansecwest.com/return.cgi',
      cancel_return => 'http://www.cansecwest.com/cancel.cgi',
      amount => '1600.00',
      quantity => 1,
      notify_url => http://www.cansecwest.com/ipn.cgi
  );
  my $id = $paypal->id;

  #store $id somewhere so we can get it back again later
  #store current context with $id
  #Apache::Session works well for this
  #print button to the browser
  #note, button is a CGI form, enclosed in <form></form> tags

  To validate the Instant Payment Notification from PayPal for the
  button used above include something like the following in your
  'notify_url' CGI.

  use CGI;
  my $query = new CGI;
  my %query = $query->Vars;
  my $id = $query{custom};
  my $paypal = Business::PayPal->new(id => $id);
  my ($txnstatus, $reason) = $paypal->ipnvalidate(\%query);
  die "PayPal failed: $reason" unless $txnstatus;
  my $money = $query{payment_gross};
  my $paystatus = $query{payment_status};

  #check if paystatus eq 'Completed'
  #check if $money is the ammount you expected
  #save payment status information to store as $id

  To tell the user if their payment succeeded or not, use something like
  the following in the CGI pointed to by the 'return' parameter in your
  PayPal button.

  use CGI;
  my $query = new CGI;
  my $id = $query{custom};

  #get payment status from store for $id
  #return payment status to customer

DESCRIPTION

  new()
  Creates a new Business::PayPal object, it can take the
  following parameters:

id
      - The Business::PayPal object id, if not specified a new
        id will be created using md5_hex(rand())

address
      - The address of PayPal's payment server, currently:
        https://www.paypal.com/cgi-bin/webscr

cert
      - The x509 certificate for I<address>, see source for default

certcontent
      - The contents of the x509 certificate I<cert>, see source for
        default

  id()
  Returns the id for the Business::PayPal object.

  button()
  Returns the HTML for a PayPal button.  It takes a large number of
  parameters, which control the look and function of the button, some
  of which are required and some of which have defaults.  They are
  as follows:

cmd
      required, defaults to '_ext-enter'
      This allows the user information to be pre-filled in.
      You should never need to specify this, as the default should
      work fine.

redirect_cmd
      required, defaults to '_xclick'
      This allows the user information to be pre-filled in.
      You should never need to specify this, as the default should
      work fine.

button_image
      required, defaults to:

        CGI::image_button(-name => 'submit',
                          -src  => 'http://images.paypal.com/x-click-but01.gif'
                          -alt  => 'Make payments with PayPal',
                         )

      You may wish to change this if the button is on an https page
      so as to avoid the browser warnings about insecure content on a
      secure page.

business
      required, no default
      This is the name of your PayPal account.

item_name
      This is the name of the item you are selling.

item_number
      This is a numerical id of the item you are selling.

image_url
      A URL pointing to a 150 x 50 image which will be displayed
      instead of the name of your PayPal account.

no_shipping
      defaults to 1
      If set to 1, does not ask customer for shipping info, if
      set to 0 the customer will be prompted for shipping information.

return
      This is the URL to which the customer will return to after
      they have finished paying.

cancel_return
      This is the URL to which the customer will be sent if they cancel
      before paying.

no_note
      defaults to 1
      If set to 1, does not ask customer for a note with the payment,
      if set to 0, the customer will be asked to include a note.

currency_code
      Currency the payment should be taken in, e.g. EUR, GBP.
      If not specified payments default to USD.

address1
undefined_quantity
      defaults to 0
      If set to 0 the quantity defaults to 1, if set to 1 the user
      can edit the quantity.

notify_url
      The URL to which PayPal Instant Payment Notification is sent.

first_name
      First name of customer, used to pre-fill PayPal forms.

last_name
      Last name of customer, used to pre-fill PayPal forms.

shipping
      I don't know, something to do with shipping, please tell me if
      you find out.

shipping2
      I don't know, something to do with shipping, please tell me if you
      find out.

quantity
      defaults to 1
      Number of items being sold.

amount
      Price of the item being sold.

address1
      Address of customer, used to pre-fill PayPal forms.

address2
      Address of customer, used to pre-fill PayPal forms.

city
      City of customer, used to pre-fill PayPal forms.

state
      State of customer, used to pre-fill PayPal forms.

zip
      Zip of customer, used to pre-fill PayPal forms.

night_phone_a
      Phone

night_phone_b
      Phone

night_phone_c
      Phone

day_phone_a
      Phone

day_phone_b
      Phone

day_phone_c
      Phone

receiver_email
      Email address of customer - I think

invoice
      Invoice number - I think

custom
      defaults to the Business::PayPal id
      Used by Business::PayPal to track which button is associated
      with which Instant Payment Notification.

  ipnvalidate()
  Takes a reference to a hash of name value pairs, such as from a
  CGI query object, which should contain all the name value pairs
  which have been posted to the script by PayPal's Instant Payment
  Notification posts that data back to PayPal, checking if the ssl
  certificate matches, and returns success or failure, and the
  reason.

  postpaypal()
  This method should not normally be used unless you need to test,
  or if you are overriding the behaviour of ipnvalidate.  It takes a
  reference to a hash containing the query, posts to PayPal with
  the data, and returns success or failure, as well as PayPal's
  response.

MAINTAINER
phred, <fred@redhotpenguin.com>

AUTHOR
mock, <mock@obscurity.org>

SEE ALSO
CGI, perl, Apache::Session.

https://www.cansecwest.com/register.cgi is currently using this module to do conference registrations. If you wish to see it working, just fill out the forms until you get to the PayPal button, click on the button, and then cancel before paying (or pay, and come to CanSecWest :-) ).

LICENSE
Copyright (c) 2010, phred <fred@redhotpenguin.com>. All rights reserved.

Copyright (c) 2002, mock <mock@obscurity.org>. All rights reserved.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.