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€<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€<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€<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€<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
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 :
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.
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
}
}
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.
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.
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 ?
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.
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?