PayPal IPN with CodeIgniter

I am trying to implement a membership subscription service on a website built in CodeIgniter. I want to use PayPal to manage payments, and it is very difficult for me to implement this.

I am trying to achieve:

  • User fills out a membership form using personal data
  • The user selects a subscription option (1 of 8 options - each is a different price) and sends the form
  • User is sent to PayPal for payment
  • The user returns to the site after a successful payment, and personal data is stored in a database that creates a user account (membership).

There is also a form validation add-on, I use the form_validation helper in CodeIgniter, but this must be done before the PayPal payment starts.

I tried to implement PayPal_Lib with Ran Aroussi, but I feel that there is not enough clear documentation or recommendations on it. Any embedded examples or recommendations would be greatly appreciated.

Lucas

+6
php codeigniter paypal paypal-ipn
source share
3 answers

I found that the Ran library is a bit complicated to use, so I wrote a replacement that also has the advantage of doing more transaction checks and logging IPN calls and order details in your database. Here's the library on GitHub, hope you find this useful:

https://github.com/orderly/codeigniter-paypal-ipn

+2
source share

Here is the Jamie Rumbelow Paypal library that I used with a few tricks:

http://bitbucket.org/jamierumbelow/codeigniter-paypal/src

+1
source share

Below is the unmodified code that I used with the Ran library. Hope this helps.

<?php /** * PayPal_Lib Controller Class (Paypal IPN Class) * * Paypal controller that provides functionality to the creation for PayPal forms, * submissions, success and cancel requests, as well as IPN responses. * * The class requires the use of the PayPal_Lib library and config files. * * @package CodeIgniter * @subpackage Libraries * @category Commerce * @author Ran Aroussi < ran@aroussi.com > * @copyright Copyright (c) 2006, http://aroussi.com/ci/ * */ class Paypal extends Controller { function Paypal() { parent::Controller(); $this->load->library('Paypal_Lib'); } function index() { $this->form(); } function form() { $this->paypal_lib->add_field('business', ' herrka_1245670546_biz@pandorascode.com '); $this->paypal_lib->add_field('return', site_url('paypal/success') ); $this->paypal_lib->add_field('cancel_return', site_url('paypal/cancel') ); $this->paypal_lib->add_field('notify_url', site_url('paypal/ipn') ); // <-- IPN url $this->paypal_lib->add_field('custom', '470874552'); // <-- Verify return $this->paypal_lib->add_field('item_name', 'Paypal Test Transaction'); $this->paypal_lib->add_field('item_number', '5'); $this->paypal_lib->add_field('amount', '9.95'); // if you want an image button use this: $this->paypal_lib->image('button_03.gif'); // otherwise, don't write anything or (if you want to // change the default button text), write this: // $this->paypal_lib->button('Click to Pay!'); $data['paypal_form'] = $this->paypal_lib->paypal_form(); $this->load->view('paypal/form', $data); } function cancel() { $this->load->view('paypal/cancel'); } function success() { //$data['pp_info'] = $this->input->post(); $data['pp_info'] = $_POST; //FIX? $this->load->view('paypal/success', $data); } function ipn() { $ipn_valid = $this->paypal_lib->validate_ipn(); if ( $ipn_valid == TRUE ) { /** Log IPN TODO: bunu daha guzel gozukecek sekilde yapayim ilerde. **/ date_default_timezone_set('Europe/Istanbul'); $this->load->helper('date'); $raw = ''; foreach ($this->paypal_lib->ipn_data as $key=>$value) { $raw .= "\n$key: $value"; } $this->load->model('model_paypal'); $data_ipn['user_id'] = $this->paypal_lib->ipn_data['custom']; /* get USER_ID from custom field. */ $data_ipn['txn_id'] = $this->paypal_lib->ipn_data['txn_id']; $data_ipn['payment_status'] = $this->paypal_lib->ipn_data['payment_status']; $data_ipn['mc_gross'] = $this->paypal_lib->ipn_data['mc_gross']; $data_ipn['mc_fee'] = $this->paypal_lib->ipn_data['mc_fee']; $data_ipn['mc_currency'] = $this->paypal_lib->ipn_data['mc_currency']; $data_ipn['item_number'] = $this->paypal_lib->ipn_data['item_number']; $data_ipn['datetime'] = mdate( "%Y-%m-%d %H:%i:%s" ); $data_ipn['status'] = IPN_ENTRY_AWAITING; $data_ipn['raw'] = $raw; $this->model_paypal->ipn_entry_add ( $data_ipn ); $ipn_payment_status = $this->paypal_lib->ipn_data['payment_status']; if ( strtolower($ipn_payment_status) == 'pending' ) { log_message('debug', 'payment status TAMAM'); $this->load->model('model_user_premium'); $ipn_item_number = $this->paypal_lib->ipn_data['item_number']; $item_info = $this->model_user_premium->Premium_item_info ( $ipn_item_number ); $ipn_mc_gross = $this->paypal_lib->ipn_data['mc_gross']; log_message('debug', 'Item fee: '. $item_info['item_fee'] ); if ( $item_info['item_fee'] == $ipn_mc_gross ) { log_message('debug', 'fee ile gross TAMAM'); $data_account['user_id'] = $data_ipn['user_id']; $data_account['type'] = $item_info['item_type']; $data_account['date_expire'] = date("Ymd", mktime(0, 0, 0, date("m") + $item_info['date_extender'], date("d"), date("y") ) ); log_message('debug', 'UserID: '. $data_account['user_id'] ); log_message('debug', 'Type:'. $data_account['type'] ); log_message('debug', 'Expire:'. $data_account['date_expire'] ); $this->model_user_premium->Premium_membership_change( $data_ipn['user_id'], $data_account ); } else { //TODO: report eksik transaction. } } } elseif ( $ipn_valid == FALSE ) { $this->load->library('email'); $this->email->to( ' demo@demo.com ' ); $this->email->subject('IPN - FAILED'); $this->email->from( ' notify@bulusturx.com ', 'PAYPAL' ); $this->email->message('or 4 life'); $this->email->send(); } } function ipn_list() { //TODO: admin check $this->load->helper('form'); $this->load->model('model_theme'); switch ( $_SERVER['REQUEST_METHOD'] ) { case 'GET': /* Theme System with Reference Variable ( first param ) */ $this->model_theme->Theme_returnThemeInfo( $data, 'paypal' ); $this->load->view( $data['theme_folder_vault'] . 'master-ipn_list', $data ); break; case 'POST': $this->load->model('model_paypal'); $user_id = $this->input->post('user_id'); $txn_id = $this->input->post('txn_id'); $list_ipn = $this->model_paypal->ipn_entry_list ( $user_id, $txn_id ); echo '<pre>'; print_r( $list_ipn ); echo '</pre>'; break; default: break; } } function ipn_test() { $this->load->model('model_user_premium'); $data_account['user_id'] = 123; $data_account['type'] = 4; $data_account['date_expire'] = date("Ymd", mktime(0, 0, 0, date("m") + 12, date("d"), date("y") ) ); echo '<pre>'; print_r( $data_account ); echo '</pre>'; $this->model_user_premium->Premium_membership_change( 123, $data_account ); } } ?> 
+1
source share

All Articles