使用 CodeIgniter 的 PayPal IPN [英] PayPal IPN with CodeIgniter

查看:24
本文介绍了使用 CodeIgniter 的 PayPal IPN的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在一个内置于 CodeIgniter 的网站上实现会员订阅服务.我希望使用 PayPal 来管理付款,但实施起来非常困难.

我想要实现的是:

  1. 用户填写会员表格个人资料
  2. 用户选择一个订阅选项(8 个选项中的 1 个 - 每个不同的价格)并提交表格
  3. 用户被发送到 PayPal 进行支付
  4. 成功付款后用户将返回网站,个人详细信息存储在创建用户帐户(会员资格)的数据库中.

还添加了表单验证,我在 CodeIgniter 中使用了 form_validation 助手,但这需要在 PayPal 付款开始之前完成.

我曾尝试实现 Ran Aroussi 的 PayPal_Lib,但我觉得它没有足够明确的文档或指南.任何实施的示例或建议将不胜感激.

卢卡斯

解决方案

以下是我在 Ran 的库中使用的未修改代码.希望有帮助.

load->library('Paypal_Lib');}函数索引(){$this->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 网址$this->paypal_lib->add_field('custom', '470874552');//<-- 验证返回$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');//如果你想要一个图像按钮,使用这个:$this->paypal_lib->image('button_03.gif');//否则,不要写任何东西或(如果你想//更改默认按钮文本),这样写://$this->paypal_lib->button('点击支付!');$data['paypal_form'] = $this->paypal_lib->paypal_form();$this->load->view('paypal/form', $data);}函数取消(){$this->load->view('paypal/cancel');}函数成功(){//$data['pp_info'] = $this->input->post();$data['pp_info'] = $_POST;//使固定?$this->load->view('paypal/success', $data);}函数 ipn(){$ipn_valid = $this->paypal_lib->validate_ipn();如果( $ipn_valid == TRUE ){/**登录IPN待办事项:bunu daha guzel gozukecek sekilde yapayim ilerde.**/date_default_timezone_set('欧洲/伊斯坦布尔');$this->load->helper('date');$raw = '';foreach ($this->paypal_lib->ipn_data as $key=>$value){$raw .= "
$key: $value";}$this->load->model('model_paypal');$data_ipn['user_id'] = $this->paypal_lib->ipn_data['custom'];/* 从自定义字段中获取 USER_ID.*/$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', '支付状态 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_info['item_fee']);if ( $item_info['item_fee'] == $ipn_mc_gross ){log_message('debug', '费用总 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);}别的{//TODO: 报告 eksik 交易.}}}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();}}函数 ipn_list(){//TODO: 管理员检查$this->load->helper('form');$this->load->model('model_theme');开关( $_SERVER['REQUEST_METHOD'] ){案例获取":/* 带有参考变量的主题系统(第一个参数)*/$this->model_theme->Theme_returnThemeInfo( $data, 'paypal' );$this->load->view( $data['theme_folder_vault'] .'master-ipn_list', $data );休息;案例'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 '

';打印_r( $list_ipn );echo '</pre>';休息;默认:休息;}}函数 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 '

';print_r( $data_account );echo '</pre>';$this->model_user_premium->Premium_membership_change(123, $data_account);}}?>

I am trying to implement a membership subscription service on a website built in CodeIgniter. I wish to use PayPal to manage payments, and am having a very hard time implementing this.

What I am trying to achieve is:

  1. User fills in a membership form with personal details
  2. User selects a subscription option (1 of 8 choices - each different price) and submits form
  3. User is sent to PayPal to pay
  4. User is returned to site upon successful payment and personal details are stored in database which creates user account (membership).

There is also the addition of form validation, I use the form_validation helper in CodeIgniter, but this needs to be done before PayPal payment can commence.

I have attempted to implement the PayPal_Lib from Ran Aroussi, but I feel it has not enough clear documentation or guidance on it. Any implemented examples or advice would be much appreciated.

Lucas

解决方案

Below is the unmodified code that i used with Ran's library. Hope it 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 .= "
$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 '</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 );

    }

}

?>

这篇关于使用 CodeIgniter 的 PayPal IPN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆