Bonjour,
Je reviens vers vous après de nombreuses tentatives de mon côté..
Il y a plusieurs jours que je suis bloqué sur ce sujet!!
Quelqu'un a une idée pour m'orienter ? Votre aide serait grandement appréciée.
J'essaie juste d'apprendre en appliquant à la lettre le tuto Créer un système d'abonnement.
Au niveau de mes tests, la transaction s'effectue correctement sur sandbox de paypal quand je souscris un abonnement.
Le compte vendeur est bel et bien crédité. Par contre il n'y a aucune répercussion sur ma base de données, aucun enregistrement ne s'effectue.
La récupération des données de paypal ne se fait pas !
Je travaille sur un serveur VPS.
voici le résultat du debug de la transaction :
/app/Model/Transaction.php (line 48)
array(
'WEBSITECODE' => '<form target="_top" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="9T7KJVGXDQ3EU">
<input type="image" src="https://www.sandbox.paypal.com/fr_FR/FR/i/btn/btn_buynow_LG.gif" border="0" name="submit" alt="PayPal - la solution de paiement en ligne la plus simple et la plus sécurisée !">
<img alt="" border="0" src="https://www.sandbox.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
',
'EMAILLINK' => 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9T7KJVGXDQ3EU',
'HOSTEDBUTTONID' => '9T7KJVGXDQ3EU',
'TIMESTAMP' => '2014-11-07T13:58:32Z',
'CORRELATIONID' => 'e64fed9e4e2cd',
'ACK' => 'Success',
'VERSION' => '87',
'BUILD' => '000000'
)
Sauf que je ne récupère rien dans la base de données et je ne génère pas le fichier log !!
Voici le code de notification Paypal :
<?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.1\r\n";
$header .= "Host: www.".PP_sandbox."paypal.com\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.'.PP_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);
//$this->log($_POST,'paypal', $custom); die();
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'));
//$this->session->setFlash("","notify"); //On peut mettre un message flash personnalisé -Tout s est bien déroulé-
}
function cancel(){
}
}
Merci pour votre aide.