2010-10-20 34 views
6

Estoy tratando de implementar un servicio de suscripción de membresía en un sitio web creado en CodeIgniter. Deseo usar PayPal para administrar los pagos, y estoy teniendo dificultades para implementar esto.PayPal IPN con CodeIgniter

Lo que estoy tratando de lograr es:

  1. usuario rellena un formulario de adhesión con datos personales
  2. El usuario selecciona una opción suscripción (1 de 8 opciones - cada precio diferente) y presenta el formulario
  3. El usuario se envía a PayPal para pagar
  4. El usuario es devuelto al sitio después del pago exitoso y los datos personales se almacenan en la base de datos que crea la cuenta de usuario (membresía).

También existe la adición de la validación de formularios, utilizo el helper form_validation en CodeIgniter, pero esto debe hacerse antes de que comience el pago de PayPal.

He intentado implementar PayPal_Lib de Ran Aroussi, pero creo que no tiene suficiente documentación clara u orientación al respecto. Cualquier ejemplo implementado o consejo sería muy apreciado.

Lucas

+0

Paypal es una API relativamente difícil de usar. Yo personalmente usaría un servicio como DPS. http://www.paymentexpress.com/ – Petah

+0

que lib funciona bien, si cambia "if ($ this-> CI-> input-> post())" a "if (isset ($ _ POST))". ¿Qué errores estás obteniendo? – stef

Respuesta

1

A continuación se muestra el código sin modificar que he usado con la biblioteca de Ran. Espero que ayude.

<?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 <[email protected]> 
* @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', '[email protected]'); 
     $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("Y-m-d", 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('[email protected]'); 
      $this->email->subject('IPN - FAILED'); 
      $this->email->from('[email protected]', '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("Y-m-d", 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); 

    } 

} 

?> 
2

me encontré con la biblioteca de Ran un poco difícil de usar también por lo que he escrito un reemplazo - que también tiene la ventaja de realizar más comprobaciones sobre la transacción, y el registro de la llamada IPN y los detalles de la orden en su base de datos . Aquí está la biblioteca en GitHub, espero que les sea útil:

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

+1

Buen trabajo en este Alex. Sin embargo, ¿tienes una versión que no requiera doctrina? – BrynJ

+0

Hola BrynJ, sí, ahora hay una versión que no requiere Doctrine –

+0

impresionante. ¡Gracias! – Jake