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 :
- Box Aventurière ou Box de mes rêves (Bouton radio pour un premier choix)
- Trois tarifs : 1 Bijou = 14.99 - 2 bijoux = 19.99 - 3 bijoux = 24.99
- SI choix box = aventuriere >> Possibilité de choisir un, deux, trois bijoux en fonction du choix suivant les tarifs...
Je sais pas si je suis assez clair, si ça n'est pas le cas, n'hésitez pas !
Merci à vous !