PayPal IPN с CodeIgniter - PullRequest
       4

PayPal IPN с CodeIgniter

7 голосов
/ 20 октября 2010

Я пытаюсь внедрить услугу подписки на членство на веб-сайте, встроенном в CodeIgniter. Я хочу использовать PayPal для управления платежами, и мне очень трудно реализовать это.

То, чего я пытаюсь достичь, это:

  1. Пользователь заполняет форму членства с личные данные
  2. Пользователь выбирает вариант подписки (1 из 8 вариантов - каждая цена отличается) и отправка формы
  3. Пользователь отправляется в PayPal для оплаты
  4. Пользователь возвращается на сайт после успешной оплаты, а личные данные сохраняются в базе данных, которая создает учетную запись пользователя (членство).

Существует также добавление проверки формы, я использую помощник form_validation в CodeIgniter, но это необходимо сделать до того, как платеж PayPal может начаться.

Я попытался реализовать PayPal_Lib от Ран Арусси, но мне кажется, что у него недостаточно четкой документации или руководства по этому вопросу. Будем весьма благодарны за любые реализованные примеры или советы.

Lucas

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Я обнаружил, что библиотеку Рана тоже немного сложно использовать, поэтому я написал замену, которая также позволяет выполнять больше проверок транзакции и регистрировать вызов IPN и детали заказа в вашей базе данных. Вот библиотека на GitHub, надеюсь, вы найдете ее полезной:

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

1 голос
/ 22 октября 2010

Ниже приведен неизмененный код, который я использовал с библиотекой Рана. Надеюсь, это поможет.

<code><?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("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( '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 '
'; перерыв; дефолт: перерыв; } } функция ipn_test () { $ This-> load-> модель ( 'model_user_premium'); $ data_account ['user_id'] = 123; $ data_account ['type'] = 4; $ data_account ['date_expire'] = дата ("Y-m-d", mktime (0, 0, 0, дата ("m") + 12, дата ("d"), дата ("y"))); echo '
';
        print_r( $data_account );
        echo '
'; $ this-> model_user_premium-> Premium_membership_change (123, $ data_account); } } ?>
1 голос
/ 20 октября 2010

Вот библиотека PayPal от Jamie Rumbelow, которую я использовал с небольшими изменениями:

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

...