Bonjour,
je suis entrain de mettre en place un système d'abonnement sur payapl avec le système Digital goods express checkout flow, j'ai quatre(4) options d'abonnement; mon problème c'est que seul option 1 mois marche en ouvrant la fenêtre modal , je ne sais si j'ai fait une erreur quelque part.
voici mon code

<?php $this->set('title_for_layout', 'Abonnement sur le site');?>
<div class="row" id="start">
<div class="col-md-12" align="center">
<h1><i class="fa fa-credit-card"></i> <?php echo __('ABONNEMENT',true); ?></h1>
<?php echo __("Choisissez l'offre dont vous avez besoin",true);?><br /><br />
</div>
</div><br /> 
<div class="row">
<div class="col-md-3 right"></div>
<div class="col-md-6">
 <?php echo $this->Session->Flash();?>
</div></div>

<div class="row">
<div class="col-md-2 right"></div>
<div class="col-md-8">

  <div class="row pricing-tables">

  <div class="col-md-3 col-sm-3">
  <div class="pricing-table">
  <div class="plan-name">
  <h3><?php echo __('Abonnement 1 Mois',true);?></h3>
  </div>
 <div class="plan-price">
 <div class="price-value">2&euro;<span>.00</span></div>
 <div class="interval">par mois</div>
 </div>
 <div class="plan-list">
 <ul>
<li><strong>40 GB</strong> Storage</li> 
<li><strong>40GB</strong> Transfer</li>
<li><strong>10</strong> Domains</li>

</ul>
</div>
<div class="plan-signup">
 <?php 

            echo $this->Form->create('Abonnement',array('url'=>array('controller'=>'payment','action'=>'paypal_set_ec')));
            echo $this->Form->input('price', array('value'=>'2','type'=>'hidden'));
            echo $this->Form->input('duree', array('value'=>'1','type'=>'hidden'));

            echo $this->Form->submit(__("S'ABONNER",true),array('id'=>'paypal-pay')); 
            echo $this->Form->end();
            $this->Html->script('https://www.paypalobjects.com/js/external/dg.js',array('inline'=>false));

            ?>
            <script src='https://www.paypalobjects.com/js/external/dg.js' type='text/javascript'></script>
            <script>
            var dg = new PAYPAL.apps.DGFlow({
            // the HTML ID of the form submit button which calls setEC
            trigger: 'paypal-pay',
            // the experience type: instant or mini
            expType: 'instant'
            });
            </script>
</div>
</div>
</div> 

<div class="col-md-3 col-sm-3">
  <div class="pricing-table">
  <div class="plan-name">
  <h3><?php echo __('Abonnement 3 Mois',true);?></h3>
  </div>
 <div class="plan-price">
 <div class="price-value">5&euro;<span>.00</span></div>
 <div class="interval">par mois</div>
 </div>
 <div class="plan-list">
 <ul>
<li><strong>40 GB</strong> Storage</li> 
<li><strong>40GB</strong> Transfer</li>
<li><strong>10</strong> Domains</li>

</ul>
</div>
<div class="plan-signup">
 <?php 

            echo $this->Form->create('Abonnement',array('url'=>array('controller'=>'payment','action'=>'abonnement3')));
            echo $this->Form->input('price', array('value'=>'5','type'=>'hidden'));
            echo $this->Form->input('duree', array('value'=>'3','type'=>'hidden'));
            echo $this->Form->submit(__("S'ABONNER",true),array('id'=>'paypal-pay')); 
            echo $this->Form->end();
            $this->Html->script('https://www.paypalobjects.com/js/external/dg.js',array('inline'=>false));

            ?>
            <script src='https://www.paypalobjects.com/js/external/dg.js' type='text/javascript'></script>
            <script>
            var dg = new PAYPAL.apps.DGFlow({
            // the HTML ID of the form submit button which calls setEC
            trigger: 'paypal-pay',
            // the experience type: instant or mini
            expType: 'instant'
            });
            </script>
</div>
</div>
</div> 

<div class="col-md-3 col-sm-3">
  <div class="pricing-table">
  <div class="plan-name">
  <h3><?php echo __('Abonnement 6 Mois',true);?></h3>
  </div>
 <div class="plan-price">
 <div class="price-value">11&euro;<span>.00</span></div>
 <div class="interval">par mois</div>
 </div>
 <div class="plan-list">
 <ul>
<li><strong>40 GB</strong> Storage</li> 
<li><strong>40GB</strong> Transfer</li>
<li><strong>10</strong> Domains</li>

</ul>
</div>
<div class="plan-signup">
 <?php 

            echo $this->Form->create('Abonnement',array('url'=>array('controller'=>'payment','action'=>'abonnement6')));
            echo $this->Form->input('price', array('value'=>'11','type'=>'hidden'));
            echo $this->Form->input('duree', array('value'=>'6','type'=>'hidden'));
            echo $this->Form->submit(__("S'ABONNER",true),array('id'=>'paypal-pay')); 
            echo $this->Form->end();
            $this->Html->script('https://www.paypalobjects.com/js/external/dg.js',array('inline'=>false));

            ?>
            <script src='https://www.paypalobjects.com/js/external/dg.js' type='text/javascript'></script>
            <script>
            var dg = new PAYPAL.apps.DGFlow({
            // the HTML ID of the form submit button which calls setEC
            trigger: 'paypal-pay',
            // the experience type: instant or mini
            expType: 'instant'
            });
            </script>       
</div>
</div>
</div> 

<div class="col-md-3 col-sm-3">
  <div class="pricing-table">
  <div class="plan-name">
  <h3><?php echo __('Abonnement 12 Mois',true);?></h3>
  </div>
 <div class="plan-price">
 <div class="price-value">23&euro;<span>.00</span></div>
 <div class="interval">par mois</div>
 </div>
 <div class="plan-list">
 <ul>
<li><strong>40 GB</strong> Storage</li> 
<li><strong>40GB</strong> Transfer</li>
<li><strong>10</strong> Domains</li>

</ul>
</div>
<div class="plan-signup">
 <?php 

            echo $this->Form->create('Abonnement',array('url'=>array('controller'=>'payment','action'=>'abonnement12')));
            echo $this->Form->input('price', array('value'=>'23','type'=>'hidden'));
            echo $this->Form->input('duree', array('value'=>'12','type'=>'hidden'));
            echo $this->Form->submit(__("S'ABONNER",true),array('id'=>'paypal-pay')); 
            echo $this->Form->end();
            $this->Html->script('https://www.paypalobjects.com/js/external/dg.js',array('inline'=>false));

            ?>
            <script src='https://www.paypalobjects.com/js/external/dg.js' type='text/javascript'></script>
            <script>
            var dg = new PAYPAL.apps.DGFlow({
            // the HTML ID of the form submit button which calls setEC
            trigger: 'paypal-pay',
            // the experience type: instant or mini
            expType: 'instant'
            });
            </script>       
</div>
</div>

</div> 

  </div>
 <div class="row">
<div class="col-md-2 right"></div>
<div class="col-md-8" align="center">
<div class="row">
<div class="col-md-4 right"></div>
<div class="col-md-4">
<?php echo __('Afficher prix en');?><?php echo $this->Form->create('User',array('inputDefaults' => array( 'label' => false,)));?>
 <?php 

                      $options = array(
                    'CFA Franc BCEAO (CFA)' => 'CFA Franc BCEAO(CFA)', 
                    'Ghanaian Cedi (GHS)' => 'Ghanaian Cedi (GHS)',
                    'Nigerian Naira(NGN)' => 'Nigerian Naira(NGN)',
                    'South African Rand (ZAR)' => 'South African Rand (ZAR)',
                    'CFA Franc BEAC (FCFA)' => 'CFA Franc BEAC (FCFA)',
                    'Congolese Franc (CDF)' => 'Congolese Franc (CDF)',
                    'Eur (EURO)' => 'Eur(EURO) ', 
                    'USD(US Dollar)' => 'USD(US Dollar)', 

                                        );

                                        echo $this->Form->input('eglise', array('type' => 'select', 'options' => $options,
                                        'id'=>'eglise','class'=>'form-control'));?>
                                        <?php echo $this->Form->end();?>
</div>
</div>
</div>

</div>

</div></div>  

<br /><br />
<?php echo $this->Html->script('bootstrap');?>

  <?php echo $this->Html->script('http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js');?>

 <?php echo $this->Html->script('jquery.js');?>
       <?php $this->Html->scriptStart(array('inline'=>false));?>
       jquery
       jQuery(function($){
       var alert = $('#alert');
       if(alerte.lenght>0){
    alert.hide().fadein(300).delay(500).fadeout;
          }
         });

         <?php $this->Html->scriptEnd();?>

Merci

13 réponses


Lartak
Réponse acceptée

Pourquoi parles tu de 4 vues, alors que tu as les 4 formulaires pour chacun des 4 prix dans la même vue ?
Vu que tu as un champ pour la durée et un champ pour le prix dans chacun des 4 formulaires, tu peux facilement accéder à ces données postées à travers d'une seule fonction.
Au lieu d'avoir :

  • abonnement1
  • abonnement3
  • abonnement6
  • abonnement12

Tu renommes abonnement1 en abonnement, puis tu supprimes les 3 autres (abonnement3, abonnement6 et abonnement12) et tu diriges tes 4 formulaires vers l'action abonnement qui traitera le formulaire soumis.

comment je vais passer la variable price comme ce n'est le même montant?

Dans tes formulaires, tu as déjà défini les valeurs en dur dans les champs en hidden, je ne vois donc pas où est le problème, étant donné qu'une fois le formulaire soumis par l'utilisateur, la fonction pourra récupérer la valeur de ces champs.

Bonjour.
Oui, tu as fais une erreur.
Tu définies 3 fois le même nom d'id à un élément.
L'id d'un élément ne peut être utilisé 3 fois sur la même page.

wenz
Auteur

ok merci, je n'avais même pas remarqué ça merci bcp, mais j'ai cette erreur après avoir payé:
Access denied for user 'test'@'%' to database 'test.mysql.db'
pourtant les données de connexion à la base de données sont exactes

voic le code mon controller

<?php App::import('Core','Router');
class PaymentController extends AppController {

    public function  payment() {
    $user_id= $this->Auth->user('id');
    if(!$user_id) {
      return $this->redirect('/users/login');
    }

    }

    public function abonnement1() {
        $this->loadModel('Abonnement');

         if ($this->request->is('post')) {
             $d=$this->request->data; 
             $user_id= $this->Auth->user('id');
                $this->Abonnement->Create();
                $suscribe=$this->Abonnement->find('count',array(
                'conditions'=>array('user_id'=>$user_id)
                ));

                $this->Session->write('price',$d['Abonnement']['price']);
                $this->Session->write('duree',$d['Abonnement']['duree']);

                $price=$d['Abonnement']['price'];
                $duree=$d['Abonnement']['duree'];
                $nom="Abonnement ".$duree." Mois";

            //build nvp string
            //use your own logic to get and set each variable
            $returnURL = Router::url(array('controller'=>'payment','action'=>'paypal_return'),true);
            $cancelURL = Router::url(array('controller'=>'payment','action'=>'paypal_cancel'),true);
            $nvpStr=
             "RETURNURL=$returnURL&CANCELURL=$cancelURL"
            ."&PAYMENTREQUEST_0_CURRENCYCODE=EUR"
            ."&PAYMENTREQUEST_0_AMT=$price"
            ."&PAYMENTREQUEST_0_ITEMAMT=$price"
            ."&PAYMENTREQUEST_0_PAYMENTACTION=Sale"
            ."&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital"  
            ."&L_PAYMENTREQUEST_0_NAME0=$nom" 
            ."&L_PAYMENTREQUEST_0_QTY0=1"
            ."&L_PAYMENTREQUEST_0_AMT0=$price"      
            ;           
            //do paypal setECCheckout
            App::import('Model','Paypal');
            $paypal = new Paypal();
            if($paypal->setExpressCheckout($nvpStr)) {
                $result = $paypal->getPaypalUrl($paypal->token);
                debug($result);
            }else {
                $this->log($paypal->errors);
                debug($paypal->errors);
                $result=false;
            }

            if(false!=$result) {
                $this->redirect($result);
            }else {
                $this->Session->setFlash(__('Erreur de connection avec paypal , Veuillez réessayer.', true));

            }
        }
    }

    /*----ABONNEMENT3-------*/

    public function abonnement3() {
        $this->loadModel('Abonnement'); 
         if ($this->request->is('post')) {
            $d=$this->request->data; 

             $user_id= $this->Auth->user('id');
                $this->Abonnement->Create();

                $suscribe=$this->Abonnement->find('count',array(
                'conditions'=>array('user_id'=>$user_id)
                ));
               $this->Session->write('price',$d['Abonnement']['price']);
                $this->Session->write('duree',$d['Abonnement']['duree']);

                $duree=$d['Abonnement']['duree'];
                $price=$d['Abonnement']['price'];
                $nom="Abonnement ".$duree." Mois";
            //build nvp string
            //use your own logic to get and set each variable
            $returnURL = Router::url(array('controller'=>'payment','action'=>'paypal_return'),true);
            $cancelURL = Router::url(array('controller'=>'payment','action'=>'paypal_cancel'),true);
            $nvpStr=
             "RETURNURL=$returnURL&CANCELURL=$cancelURL"
            ."&PAYMENTREQUEST_0_CURRENCYCODE=EUR"
            ."&PAYMENTREQUEST_0_AMT=$price"
            ."&PAYMENTREQUEST_0_ITEMAMT=$price"
            ."&PAYMENTREQUEST_0_PAYMENTACTION=Sale"
            ."&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital"  
            ."&L_PAYMENTREQUEST_0_NAME0=$nom" 
            ."&L_PAYMENTREQUEST_0_QTY0=1"
            ."&L_PAYMENTREQUEST_0_AMT0=$price"      
            ;           
            //do paypal setECCheckout
            App::import('Model','Paypal');
            $paypal = new Paypal();
            if($paypal->setExpressCheckout($nvpStr)) {
                $result = $paypal->getPaypalUrl($paypal->token);
                debug($result);
            }else {
                $this->log($paypal->errors);
                debug($paypal->errors);
                $result=false;
            }

            if(false!=$result) {
                $this->redirect($result);
            }else {
                $this->Session->setFlash(__('Problème de connection avec Paypal, Veuillez réessayer,', true));

            }
        }
    }

    /*----ABONNEMENT6-------*/

    public function abonnement6() {
        $this->loadModel('Abonnement'); 
         if ($this->request->is('post')) {
            $d=$this->request->data; 

             $user_id= $this->Auth->user('id');
                $this->Abonnement->Create();

                $suscribe=$this->Abonnement->find('count',array(
                'conditions'=>array('user_id'=>$user_id)
                ));
               $this->Session->write('price',$d['Abonnement']['price']);
                $this->Session->write('duree',$d['Abonnement']['duree']);

                $duree=$d['Abonnement']['duree'];
                $price=$d['Abonnement']['price'];
                $nom="Abonnement ".$duree." Mois";
            //build nvp string
            //use your own logic to get and set each variable
            $returnURL = Router::url(array('controller'=>'payment','action'=>'paypal_return'),true);
            $cancelURL = Router::url(array('controller'=>'payment','action'=>'paypal_cancel'),true);
            $nvpStr=
             "RETURNURL=$returnURL&CANCELURL=$cancelURL"
            ."&PAYMENTREQUEST_0_CURRENCYCODE=EUR"
            ."&PAYMENTREQUEST_0_AMT=$price"
            ."&PAYMENTREQUEST_0_ITEMAMT=$price"
            ."&PAYMENTREQUEST_0_PAYMENTACTION=Sale"
            ."&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital"  
            ."&L_PAYMENTREQUEST_0_NAME0=$nom" 
            ."&L_PAYMENTREQUEST_0_QTY0=1"
            ."&L_PAYMENTREQUEST_0_AMT0=$price"      
            ;           
            //do paypal setECCheckout
            App::import('Model','Paypal');
            $paypal = new Paypal();
            if($paypal->setExpressCheckout($nvpStr)) {
                $result = $paypal->getPaypalUrl($paypal->token);
                debug($result);
            }else {
                $this->log($paypal->errors);
                debug($paypal->errors);
                $result=false;
            }

            if(false!=$result) {
                $this->redirect($result);
            }else {
                $this->Session->setFlash(__('Problème de connection avec Paypal, Veuillez réessayer,', true));

            }
        }
    }

    public function abonnement12() {
        $this->loadModel('Abonnement'); 
         if ($this->request->is('post')) {
            $d=$this->request->data; 
             $user_id= $this->Auth->user('id');
                 $this->Abonnement->Create();
                $suscribe=$this->Abonnement->find('count',array(
                'conditions'=>array('user_id'=>$user_id)
                ));
                $this->Session->write('price',$d['Abonnement']['price']);
                $this->Session->write('duree',$d['Abonnement']['duree']);
                $duree=$d['Abonnement']['duree'];
                $price=$d['Abonnement']['price'];
                $nom="Abonnement ".$duree." Mois";
            //build nvp string
            //use your own logic to get and set each variable
            $returnURL = Router::url(array('controller'=>'payment','action'=>'paypal_return'),true);
            $cancelURL = Router::url(array('controller'=>'payment','action'=>'paypal_cancel'),true);
            $nvpStr=
             "RETURNURL=$returnURL&CANCELURL=$cancelURL"
            ."&PAYMENTREQUEST_0_CURRENCYCODE=EUR"
            ."&PAYMENTREQUEST_0_AMT=$price"
            ."&PAYMENTREQUEST_0_ITEMAMT=$price"
            ."&PAYMENTREQUEST_0_PAYMENTACTION=Sale"
            ."&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital"  
            ."&L_PAYMENTREQUEST_0_NAME0=$nom" 
            ."&L_PAYMENTREQUEST_0_QTY0=1"
            ."&L_PAYMENTREQUEST_0_AMT0=$price"      
            ;           
            //do paypal setECCheckout
            App::import('Model','Paypal');
            $paypal = new Paypal();
            if($paypal->setExpressCheckout($nvpStr)) {
                $result = $paypal->getPaypalUrl($paypal->token);
                debug($result);
            }else {
                $this->log($paypal->errors);
                debug($paypal->errors);
                $result=false;
            }

            if(false!=$result) {
                $this->redirect($result);
            }else {
                $this->Session->setFlash(__('Erreur pendant la connexion avec paypal, veuillez réessayer.', true));

            }
        }
    }

     /*
     * page when user clicks on Cancel on Paypal page
     */
    function paypal_cancel($id=null) {
        $this->layout = 'clean';    
        $this->render('paypal_back');   
    }

    /*
     *redirects buyer after the buyer approves the payment8
     */
    function paypal_return($id=null) {
        $user_id= $this->Auth->user('id');

        $this->loadModel('Abonnement');

        $price=$this->Session->read('price');
        $duree=$this->Session->read('duree');

        $nom="Abonnement".$duree."Mois";
        $this->loadModel('User');
        $user=$this->User->find('first',array(
        'fields'=>array('id','nom','template'),
        'conditions'=>array('id'=>$user_id)
         ));

         $payerId    = $this->params['url']['PayerID'];
         $token      = $this->params['url']['token'];  
            //get nvp string
            //use your own logic to get and set each variable

            $nvpStr=
                 "TOKEN=$token&PAYERID=$payerId"
                ."&PAYMENTREQUEST_0_CURRENCYCODE=EUR"
                ."&PAYMENTREQUEST_0_AMT=$price"  
                ."&PAYMENTREQUEST_0_ITEMAMT=$price"
                ."&PAYMENTREQUEST_0_PAYMENTACTION=Sale"
                ."&L_PAYMENTREQUEST_0_ITEMCATEGORY0=Digital"  
                ."&L_PAYMENTREQUEST_0_NAME0=$nom"
                ."&L_PAYMENTREQUEST_0_QTY0=1"
                ."&L_PAYMENTREQUEST_0_AMT0=$price"
                ;

            //do paypal setECCheckout
            App::import('Model','Paypal');
            $paypal = new Paypal();
            if($paypal->doExpressCheckoutPayment($nvpStr)) {
                $result = true;
            }else {
                $this->log($paypal->errors);
                $result = false;

            }       
          // $info=$paypal->GetExpressCheckoutDetails($token);

            if (false==$result) {
                $this->Session->setFlash(__('Erreur avec le payement, Veuillez reessayer', true),'message_fail');
            } else {

                 $this->Session->setFlash(__('Merci pour votre commande.', true),'message_ok');

                 $this->User->id=$user_id;
                 if($this->User->field('premium')){
                    $fin=$this->User->field('fin_abonnement');
                    $date=new DateTime($fin);
                   }else{
                    $date=new DateTime();   
                   }

                  $date->add(new DateInterval('P'.$duree.'M'));
                  $this->User->SaveField('fin_abonnement',$date->format('y-m-d H:i:s'));
                  $base = mysql_connect ('localhost','test','akout');
                  mysql_select_db('test', $base)or die(mysql_error()) ;
                  $date=date('y-m-d H:i:s');

                 $req = "INSERT INTO transactions (duree,price,user_id,date) VALUES
                 ('$duree','$price','$user_id','$date')";
                   mysql_query($req);
                   $this->Session->write('Auth.User.premium',1);
                   //$this->Abonnement->save(array('price'=>$price,'duree'=>$duree,'user_id'=>$user_id));
                   $this->redirect('/users/customization');

               }  

       //enregistrement des cours dans suivres

    }

}

Nan mais please, stoppez avec vos parpaings de codes! x)

Heu.
Quel est l'intérêt de créer 4 fonctions dans le même controller, si elles ont toute le même contenu de code ?
Surtout que c'est la premère fois, que je vois un nom de fonction qui contient un chiffre.

wenz
Auteur

Khalysto qu'ai je fais de mal?

Khalysto qu'ai je fais de mal?

Réponds à ma question au lieu de te préoccuper de ce que t'a dit Khalysto.
À moins que tu n'ais pas envie de solutionner ton problème.

wenz
Auteur

au fait c'est par rapport au lieux qui est différent selon l'abonnement choisi

au fait c'est par rapport au lieux qui est différent selon l'abonnement choisi

Comment ça par rapport au lieu ?
Sur le code de la vue, tu as 4 formulaires, dont chacun est pour chacune des 4 fonctions.
Les 4 fonctions sont dans le même controller et chacune de ces 4 fonctionsont le même contenu que les 3 autres.
En quoi y aurait t'il une différence entre les 4 ?

Au passage, que fait la méthode create dans chacune des 4 fonctions, alors qu'aucune ne fait d'insertion, ni de modification en base de données ?

wenz
Auteur

au fait c'est pour creer les formulaire pour l'insertion du prix, j'ai mal procédé?

Je ne sais pas à laquelle de mes questions tu as répondu.
Quand je parle de la méthode create dans mon message précédent, c'est au niveau du controller.
Ensuite, je voulais te dire qu'il est totalement inutile de faire 4 fonctions dans ton controller qui ont exactement le même contenu de code.
Une seule est largement suffisante.

wenz
Auteur

Lartak, merci pour ta réponse, tu as raison au niveau de la methode create, pour ce qui concerne les quatre fonctions leur contenu c'est là même code, ma question est la suivante si je fais une seule fonction pour les quatre view comment je vais passer la variable price comme ce n'est le même montant?

wenz
Auteur

tu as raison, merci