Bonjour à tous,
Voici mon petit (enfin gros) soucis :
J'ai besoin d'envoyer un mai contenant une clé de déverrouillage extraite d'une base de donnée une fois un paiement via paypal effectué.
Bien sur il faut que l'envoi se fasse uniquement si le paiement a bien été effectué.
Pour cela j'utilise donc l'IPN de Paypal.
J'ai donc crée une page ipn.php comme celle ci :
<?php
// STEP 1: Read POST data
// reading posted data from directly from $_POST causes serialization
// issues with array data in POST
// reading raw POST data from input stream instead.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$myPost = array();
foreach ($raw_post_array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$myPost$keyval[0]] = urldecode($keyval[1]);
}
// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($myPost as $key => $value) {
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&$key=$value";
}
// STEP 2: Post IPN data back to paypal to validate
$ch = curl_init('https://www.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// In wamp like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path
// of the certificate as shown below.
// curl_setopt($ch, CURLOPT_CAINFO, dirname( __FILE__ ) . '/cacert.pem');
if( !($res = curl_exec($ch)) ) {
// error_log("Got " . curl_error($ch) . " when processing IPN data");
curl_close($ch);
exit;
}
curl_close($ch);
// STEP 3: Inspect IPN validation result and act accordingly
if (strcmp ($res, "VERIFIED") == 0) {
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process payment
// assign posted variables to local variables
$item_name = $_POST'item_name'];
$item_number = $_POST'item_number'];
$payment_status = $_POST'payment_status'];
$payment_amount = $_POST'mc_gross'];
$payment_currency = $_POST'mc_currency'];
$txn_id = $_POST'txn_id'];
$receiver_email = $_POST'receiver_email'];
$payer_email = $_POST'payer_email'];
$to = "monmail@gmail.com";
$headers = "From: ".$payer_email;
$message = "Test de l'ipn !!!";
$subject = "SANDBOX PAYPAL";
mail($to, $subject, $message, $headers);
} else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
}
?>
Ici j'essai juste de faire un test en envoyant un mail. Hors je ne reçois rien du tout.
Le paiement se fait via un bouton "Acheter" Paypal que j'ai configuré :
Dans la rubrique variables avancées j'ai mis notify_url=http://www.monwebsite.com/ipn.php
Voila donc quand je fais un test avec la sandbox je ne reçois pas de mail.
J'ai aussi fais un test en "production" et aucun mail ne part.
Si vous avez une idée cela m'aiderai beaucoup.
Merci :)
Question bête : Ton serveur peut t'il envoyer des mails ? Essaye dans une page PHP de test la fonction mail() et regarde si tu reçois un mail.
:)