Bonjour !

Je ne sais pas si c'est la bonne section pour cette question mais bref..

Pour un site Web, je dois faire un système d'abonnement et donc de payement par Paypal. Seulement, je n'avais jamais fait cela auparavant.

J'ai vu le nouveau tutoriel de Grafikart sur le Paypal Express Checkout mais malheureusement, ayant regardé quelques parties du tutoriel, il me semble qu'il est en orienté objet et je ne connais justement pas cet aspect là de PHP (et je déteste avoir du code que je ne comprends pas sur mes sites).

Je me demandais si Grafikart prévoyait un tutoriel là-dessus mais de manière procédurale ou si vous connaissiez des sites qui l'apprennent.

Je vous remercie.
Boris

3 réponses


Petit up :)

Salut, l'API a un peux étais modifier mais elle est toujours pareil voir même simplifier je trouve

<?php
$email = "Tonemail@email.com";
$price = 15;

// CONFIG: Enable debug mode. This means we'll log requests into 'ipn.log' in the same directory.
// Especially useful if you encounter network errors or other intermittent problems with IPN (validation).
// Set this to 0 once you go live or don't require logging.
define("DEBUG", 1);
// Set to 0 once you're ready to go live
define("USE_SANDBOX", 1);
define("LOG_FILE", "./ipn.log");
// Read POST data
// reading posted data 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";
}
// Post IPN data back to PayPal to validate the IPN data is genuine
// Without this step anyone can fake IPN data
if(USE_SANDBOX == true) {
    $paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
} else {
    $paypal_url = "https://www.paypal.com/cgi-bin/webscr";
}
$ch = curl_init($paypal_url);
if ($ch == FALSE) {
    return FALSE;
}
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);
if(DEBUG == true) {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
}
// CONFIG: Optional proxy configuration
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
// Set TCP timeout to 30 seconds
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path
// of the certificate as shown below. Ensure the file is readable by the webserver.
// This is mandatory for some environments.
//$cert = __DIR__ . "./cacert.pem";
//curl_setopt($ch, CURLOPT_CAINFO, $cert);
$res = curl_exec($ch);
if (curl_errno($ch) != 0) // cURL error
    {
    if(DEBUG == true) { 
        error_log(date('[Y-m-d H:i e] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE);
    }
    curl_close($ch);
    exit;
} else {
        // Log the entire HTTP response if debug is switched on.
        if(DEBUG == true) {
            error_log(date('[Y-m-d H:i e] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE);
            error_log(date('[Y-m-d H:i e] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE);
        }
        curl_close($ch);
}
// Inspect IPN validation result and act accordingly
// Split response headers and payload, a better way for strcmp
$tokens = explode("\r\n\r\n", trim($res));
$res = trim(end($tokens));
if (strcmp ($res, "VERIFIED") == 0) {
    $mc_gross = $_POST['mc_gross'];
    $payment_currency = $_POST['mc_currency'];
    $txn_id = $_POST['txn_id'];
    $receiver_email = $_POST['receiver_email'];
    $payer_email = $_POST['payer_email'];
    $item_name = $_POST['item_name'];
    if ($receiver_email == $email && $price == $mc_gross && $payment_currency == "EUR" && $txn_id == true) {
    // check whether the payment_status is Completed
    // check that txn_id has not been previously processed
    // check that receiver_email is your PayPal email
    // check that payment_amount/payment_currency are correct
    // process payment and mark item as paid.
    // 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'];
       // La personne a bien payer
    }else{
        //La la personne a essayer de fraude en modifiant le prix ou autre
    }
    if(DEBUG == true) {
        error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
    }
} else if (strcmp ($res, "INVALID") == 0) {
    // log for manual investigation
    // Add business logic here which deals with invalid IPN messages
    if(DEBUG == true) {
        error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
    }
}
?>

Tu as juste a modifier a ta guise ;)

La tu est en mode Debug + Sandbox tu soit passer a 0 en haut en situation réel, tu peux laisser en Sandbox pour tester

PS: tu risques de galerer a créé un compte sous Sandbox tu doit allez sur http://fr.fakenamegenerator.com/ et généré une personne copier ça carte bancaire etc et tu pourras payer ;)

Et pour faire payer la personne rien de bien compliquer
<?php
$price = 15;
$email = "tonemail@email.com";
$desc = "Canapé en cuir";
$number = 1;
$currency = "EUR";
$paypalurl = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_xclick&amount=".urlencode($price)."&business=".urlencode($email)."&item_name=".urlencode($desc)."&item_number=".urlencode($number)."&return=http://Si il a bien payer/"."&rm=2&notify_url=http://IPNPaypal/ipn.php"."&cancel_return=http://Si il annule.com"."&no_note=1&currency_code=".urlencode($currency)."";
?>
<a href="<?= $paypalurl ?>"><?= $paypalurl ?></a>

Modifier bien tes lien a la fin après les HTTP au debut de paypalurl j'ai mis sandbox.paypal.com si tu est plus en test (sandbox) tu as juste a enlever le sandbox.php