Bonjour à tous,
Alors on va commencer par le problème, c'est le plus important je pense.
J'ai suivi le tuto paypal et il fonctionnait bien jusqu'à vendredi, et depuis vendredi je n'ai plus aucune information qui s'enregistre dans la table Transaction, après un paiement Paypal...
De plus je n'ai plus aucun enregistrement de fait dans le log Paypal, je voulais savoir si ça venait de moi ou autre, j'avoue avoir du mal à saisir la chose...
Code Paypal : PaypalController.php
<?php
class PaypalController extends AppController{
public $uses = array('User','Transaction');
function notify(){
$email_account = Configure::read('Paypal.mail');
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.'.Configure::read('Paypal.sandbox').'paypal.com', 443, $errno, $errstr, 30);
$item_name = $_POST'item_name'];
$item_number = $_POST'item_number'];
$payment_status = $_POST'payment_status'];
$payment_amount = $_POST'mc_gross'];
$payment_tax = $_POST'tax'];
$payment_ht = $payment_amount - $payment_tax;
$payment_currency = $_POST'mc_currency'];
$address = $_POST'address_street'];
$country = $_POST'address_country'];
$city = $_POST'address_city'];
$name = $_POST'address_name'];
$txn_id = $_POST'txn_id'];
$receiver_email = $_POST'receiver_email'];
$payer_email = $_POST'payer_email'];
parse_str($_POST'custom'],$custom);
if (!$fp) {
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
// vérifier que payment_status a la valeur Completed
if ( $payment_status == "Completed") {
if ( $email_account == $receiver_email) {
if($custom'action'] == 'subscribe'){
$duration = $custom'duration'];
$uid = $custom'uid'];
if($payment_ht == Configure::read("Site.Prices.$duration")){
$this->Transaction->save(array(
'price' => $payment_ht,
'tax' => $payment_tax,
'txnid' => $txn_id,
'user_id'=> $uid,
'action' => 'subscribe',
'amount' => $duration,
'name'=> $name,
'country'=> $country,
'city' => $city,
'address'=> $address
));
$this->User->id = $uid;
if($this->User->field('premium')){
$end = $this->User->field('end_subscribtion');
$date = new DateTime($end);
}else{
$date = new DateTime();
}
$date->add(new DateInterval('P'.$duration.'M'));
$this->User->saveField('end_subscribtion',$date->format('Y-m-d H:i:s'));
}else{
$this->log("Paiement $duration mois = $payment_ht Ne correspond pas ",'paypal');
}
}
}
}
else {
// Statut de paiement: Echec
}
exit();
}
else if (strcmp ($res, "INVALID") == 0) {
// Transaction invalide
}
}
fclose ($fp);
}
}
function success(){
if( !$this->Auth->user("id")){
throw new NotFoundException();
}
$this->User->id = $this->Auth->user("id");
$this->Session->write('Auth',$this->User->read());
$this->redirect(array('controller'=>'users','action'=>'edit'));
}
function cancel(){
}
}
Ce code, est donc à l'identique de celui qui est utilisé dans le tuto.
function subscribe() dans UsersController.php
function subscribe(){
if(!$this->Auth->user('id')){
$this->redirect('/users/connect');
}
$ce = $this->Auth->user('ce_user');
$this->loadModel('Bijou'); //On charge le modèle "Bijou"
$listebijoux = $this->Bijou->find('all'); //Récupération de la liste des bijoux
$this->set('Bijou',$this->Bijou->find('all')); //On transmet à la vue variable "BIJOUX"
// debug($listebijoux);
// die();
if(!empty($this->request->data)){
$nbbijoux = $this->request->data'duration'];
$uid = $this->Auth->user('id'); // Permet de récupérer l'idée de l'utilisateur
if(Configure::read("Site.Prices.$nbbijoux")){
$price = number_format(Configure::read("Site.Prices.$nbbijoux"),2);
$this->loadModel('Transaction');
$url = $this->Transaction->requestPaypal($price,"Esprit Bijoux box : $nbbijoux bijou(x)","action=subscribe&uid=$uid&duration=$nbbijoux");
if($url){
$this->redirect($url);
}
}
}
}
Et enfin la partie Transaction.php
<?php
class Transaction extends AppModel{
function requestPaypal($price, $name, $custom){
$request = array(
'METHOD' => 'BMCreateButton',
'VERSION' => '87',
'USER' => Configure::read('Paypal.USER'),
'PWD' => Configure::read('Paypal.PWD'),
'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
'BUTTONCODE' => 'HOSTED',
'BUTTONTYPE' => 'BUYNOW',
'BUTTONSUBTYPE' => 'SERVICES',
'L_BUTTONVAR0' => 'business='.Configure::read('Paypal.mail'),
'L_BUTTONVAR1' => "item_name=$name",
'L_BUTTONVAR2' => "amount=$price",
'L_BUTTONVAR3' => "currency_code=EUR",
'L_BUTTONVAR4' => "no_note=1",
'L_BUTTONVAR5' => "notify_url=".Router::url('/paypal/notify',true),
'L_BUTTONVAR6' => "return=".Router::url('/paypal/success',true),
'L_BUTTONVAR7' => "cancel=".Router::url('/paypal/cancel',true),
'L_BUTTONVAR8' => "custom=$custom",
);
$request = http_build_query($request);
$curlOptions = array(
CURLOPT_URL => "https://api-3t.".Configure::read('Paypal.sandbox')."paypal.com/nvp",
CURLOPT_VERBOSE => 1,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 1,
CURLOPT_CAINFO => APP.'Vendor'.DS.'cacert.pem',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => $request
);
$ch = curl_init();
curl_setopt_array($ch,$curlOptions);
$response = curl_exec($ch);
if(curl_errno($ch)){
debug(curl_error($ch)); die();
return false;
}else{
curl_close($ch);
parse_str($response,$responseArray);
return $responseArray'EMAILLINK'];
}
}
}
Si quelqu'un a une idée, je suis preneur...
Bon et maintenant, ma question.
Dans l'état actuel des choses, le tuto permet un ABONNEMENT. Seulement moi je vend des box de bijoux, or du coup il me faut un paiement OneShot, qui n'est pas renouvelable, et qui puisse prendre jusqu'à trois articles différents...Et là j'avoue que je sèche un peu...
En gros détails de mes offres :
Je sais pas si je suis assez clair, si ça n'est pas le cas, n'hésitez pas !
Merci à vous !
Re bonjour tout le monde,
Bon bah comme je pense qu'il y a un problème avec le retour paypal même si j'ai un log, j'ai feinté... ^^
J'ai créé une table order et quand les clients valident pour aller faire la page de paiement, ça enregistre le montant, l'offre, le numéro de l'utilisateur, et moi je n'ai plus qu'a rapproché les informations avec les logs paypal :)
Voili voilou, on peut dire que le problème est "résolu" :)
salut
le detail de tes offre correspondrais a la duree d abonement il te suffit juste de laisser ceci dans la partie et de modifier en fonction
moi je l ai fait pour des pack photos
$this->User->id = $uid;
if($this->User->field('Bijoux')){
$bijoux = $this->User->field('achat ou le nom du champs ds la table ^^');
}
et de faire la meme chose dans tous ce qui concerne ton espace dedie a la vente de bijoux ^^.
ensuite est tu sur que l enregistrement ne fonctionne plus ou ne foncionnez pas depuis le debut je te pose cette question car moi depuis le debut il ne fonctionne pas donc si tu trouve le souci fait partager la soluce :) :) :) :) :) :) :) :) :) :) :)
en esperant ne pas t avoir dit de betise car je ne suis pas le meilleur du site :) mais je me debrouille :p
Salut guizmo!
Merci pour ta réponse :-)
Alors dans l'idée oui j'ai déjà modifié le prix des offres pour qu'il corresponde au prix des bijoux mais je dois rajouter les nom des bijoux + le nom des box dans la table transaction... ^^ et la je bug un peu dessus..
Et oui depuis le début ça fonctionnait car j'ai eu deux paiements qui se sont bien enregistrés dans la table transaction et dans le log de paypal :-(
un petit coup de main je v mettre des ** autour de ce que j'ecris:
$item_name = $_POST'item_name'];
$item_number = $_POST'item_number'];
$payment_status = $_POST'payment_status'];
$payment_amount = $_POST'mc_gross'];
$payment_tax = $_POST'tax'];
$payment_ht = $payment_amount - $payment_tax;
$payment_currency = $_POST'mc_currency'];
$address = $_POST'address_street'];
$country = $_POST'address_country'];
$city = $_POST'address_city'];
$name = $_POST'address_name'];
$txn_id = $_POST'txn_id'];
$receiver_email = $_POST'receiver_email'];
$payer_email = $_POST'payer_email'];
*$nomdubijoux* = *$_POST'nom_du_bijoux*
et ainsi de suite apres pour la bdd tu reprend les nom que tu as marque pareil ensuite tu envoie le tout pour que que cela ce sauvegarde ^^
sinon affiche les tables que tu as besoin pour plus d infos ^^
Bah du coup j'avais pensé à ça aussi mais j'ai aucun enregistrement de fait... Enfin remarques même en normal je n'ai plus de truc, donc bon ce soir je vais investiguer et je te tiens au courant :-)
Merki