web-dev-qa-db-fra.com

Paiement à l'inscription?

Étude de cas:

J'ai besoin que les gens me paient quand ils viennent s'inscrire sur mon site. La plupart de la page devrait être disponible uniquement pour l'utilisateur connecté. Paypal sera mon option de paiement.

Question?

J'ai besoin de savoir comment puis-je communiquer avec Paypal après le paiement qu'un utilisateur a effectué le paiement ou non?

2
Choudhury A. M.

Le meilleur moyen est de gérer cela avec des rôles d'utilisateur. Un utilisateur peut s'inscrire mais pas lire. Après avoir payé avec Paypal, le rôle sera mis à jour (par exemple, du lecteur à l’abonné). La mise à jour peut être effectuée via PayPals IPN.

Je l'ai fait pour l'un de mes clients. Vous serez payé par votre client. Je serai payé par vous. Vous avez le plugin.

Mettre à jour

Comme vous voulez écrire un thème et ne l’utilisez pas pour votre activité professionnelle, voici quelques éléments de ma solution plug-in.

Paypal IPN

Commençons par IPN Paypal. Paypal dispose d'une API bien documentée et d'un réseau de développeurs Paypal . Un compte dans le réseau de développeurs vous aidera beaucoup, Paypal propose un bac à sable et de nombreux scripts et tutoriels.
En fouillant dans le réseau de développement, j'ai trouvé le IPN (Notification instantanée de paiement). IPN signifie que Paypal envoie une demande de publication avec des informations détaillées sur le donneur d’ordre à l’URL spécifiée dans votre compte Paypal. Pendant le développement, vous allez adorer le simulateur IPN .
Commençons par le premier script expérimental. Aller à la simulatro Paypal IPN (voir lien ci-dessus). La première chose dont le simulateur a besoin, est l’adresse de votre script. Paypal envoie les données avec une demande de publication, vous ne pouvez donc pas utiliser votre serveur Web local, vous avez besoin d'un serveur public. En supposant que votre serveur est accessible sous http://yourdoma.in, chargez le script ci-dessous avec ftp (par exemple, nommez-le pplog.php) et entrez http://yourdoma.in/pplog.php dans le champ ou IPN handler URL. Sélectionnez Cart checkout dans la liste déroulante suivante et appuyez sur Send IPN

<?php
if (empty($_POST))
    exit( 'No post request' );

define('MAILMODE', true);

$filename    = 'Paypal-ipn.log';
$file_exists = file_exists(filename);

if ($file_exists && MAILMODE) {
    unlink($filename);
    $mode = 'w';
} else {
    $mode =  $file_exists ? 'a+' : 'w';
}

$handle = fopen($filename, $mode);
if ( $handle ) {
    fputs($handle, date( 'Y-m-d')."\n");
    fputs($handle, var_export( $_POST, true));
    fputs($handle, "\n");
    fputs($handle, str_repeat('-', 80)."\n");
    fclose($handle);
}

if (MAILMODE)
    mail('[email protected]', 'Paypal IPN Log', file_get_contents($filename));

Le script doit envoyer un courrier électronique avec les données envoyées par Paypal en tant que demande postale. Une fois que l'e-mail est arrivé et que vous l'ouvrez, vous verrez beaucoup de données. Nous n'avons besoin que d'une poignée d'entre eux, ne vous énervez pas. Nous sommes simplement interesetd à last_name, first_name et payer_email.

Nous devons maintenant faire quelque chose avec les données postales reçues. Au début, vous pouvez vérifier les données postales. Si vous pensez que les données sont correctes et que personne ne vous traitera, ignorez l'étape suivante. Si vous savez que tout le monde peut envoyer une demande de publication avec les données de publication nécessaires (car votre thème est open source), vous devez vérifier les données de la publication.
Pour vérifier les données reçues, nous devons les renvoyer à Paypal. Paypal répondra avec VERIFIED ou INVALID. L'extrait de code suivant provient du réseau de développement Paypal

class Paypal_IPN_API
{
//const PAYPALURI = 'ssl://www.sandbox.Paypal.com';
const PAYPALURI = 'ssl://ipnpb.Paypal.com';

private function talk_to_Paypal() {
    /*
     * Original code from Paypal Developer Network
     */

    // read the post from Paypal system and add 'cmd'
    $req = 'cmd=_notify-validate';

    foreach( $_POST as $key => $value ){

        $value = urlencode( stripslashes( $value ) );
        $req .= "&$key=$value";

    }

    // post back to Paypal system to validate
    $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( self::PAYPALURI, 443, $errno, $errstr, 30 );

    /*
     * End Paypal Developer Code
     */
  }
}

Ce code de code provient d'une classe que j'ai utilisée. Au début de la classe, vous pouvez voir le const PAYPALURI. Paypal propose un bac à sable (compte nécessaire) afin que vous puissiez tester vos scxripts sans traiter de données "réelles". Je laisse ce code tel quel, il pourrait être optimisé et au lieu d'utiliser fsockopen(), vous pourriez également utiliser wp_remote_get().
Maintenant, nous devons gérer la réponse de Paypal, le prochain extrait vient encore de ma classe:

/*
 * Modified Paypal Developer Code
 */
if( ! $fp ){

    $this->log( "connection failed" );
    die( "Can not open connection to Paypal" );

} else {

    fputs( $fp, $header . $req );

    while( ! feof( $fp ) ){

        $res = fgets( $fp, 1024 );

        // the received data was verified by Paypal
        if( strcmp( $res, "VERIFIED" ) == 0 ){

            $payment_status = isset( $_POST['payment_status'] ) ? strtolower( $_POST['payment_status'] ) : '';

            // check payment status. only completed payments will be processed
            if( 'completed' == $payment_status ){

                // create the userdata-array
                $udata = array(
                    'payer_email'   => $_POST['payer_email'],
                    'first_name'    => $_POST['first_name'],
                    'last_name'     => $_POST['last_name']
                );

                $this->modify_wp_user( $udata );
            }

        // the received data could not be verified by Paypal
        } elseif( strcmp( $res, "INVALID" ) == 0 ){

                $this->log( "invalid request" );
                die( "Invalid request at Paypal" );

        } else {
            // something went terrible wrong
            $this->log( "unknown error while connection" );

        }
    }
}

// be Nice. close the connections you have opened
fclose( $fp );

/*
 * End modified Paypal Code
 */

Calme simple. Vérifiez si la connexion a réussi. Si oui, vérifiez la réponse. Si la réponse est INVALID, ne faites rien. S'il s'agit de VERIFIED, saisissez le prénom, le nom de famille et l'adresse électronique du payeur à partir de la première demande de publication.

Créer ou mettre à jour un utilisateur

Nous avons maintenant un nom et une adresse électronique, ce qui nous permet de créer un utilisateur ou de mettre à jour un utilisateur existant. Fondamentalement, vous devez trouver un utilisateur avec les données fournies. S'il existe un utilisateur existant, mettez-le à jour. Sinon créer un nouvel utilisateur.
Il est possible de rechercher un utilisateur par son prénom et son nom de famille, mais pas le sujet de ce message. Nous faisons le moyen facile et essayons de chercher un utilisateur par l'adresse email que nous venons de recevoir. C'est facile parce que WordPress a une fonction intéressante pour ceci: get_user_by(). Ci-dessus, nous avons copié le nom et l'adresse électronique d'un tableau et passons ce tableau à la méthode modify_wp_user().

/**
 * 
 * Create or modify the WP-user
 * If the user already exists, the method will upgrade the user
 * to a higher user-role.
 * If the user does not exists, the method create an user with
 * the email as user-name, first and last name and the predefined
 * user-role. The password should be send via email to the user! 
 * 
 * @param array $userdata Array with the user-email, first and last name.
 * @access private
 * @since 0.1
 */
private function modify_wp_user( $userdata = array() ) {

    if( empty( $userdata ) )
        return FALSE;
    else
        extract( $userdata );

    $user = get_user_by( 'email', $userdata['payer_email'] );

    if ( ! $user ) {
        $random_password = wp_generate_password( $length=12, $include_standard_special_chars=false );

        $data = array(
            'user_pass'     => $random_password,
            'user_login'    => $payer_email,
            'user_email'    => $payer_email,
            'first_name'    => $first_name,
            'last_name'     => $last_name,
            'role'          => 'subscriber' // adjust the role to your needs
        );

        wp_insert_user( $data );
    } else {
        $data = array(
            'ID'    => $user->ID,
            'role'  => 'contributor' // adjust the role to your needs, maybe use a custom role
        );

        wp_update_user( $data );
    }
}

C'est un simple commutateur. Récupérer l'utilisateur et mettre à jour ou créer. dans cette solution, le payeur doit utiliser la même adresse email dans Paypal et dans le blog. Et quand un nouvel utilisateur est créé, le login est le même que l'adresse email (de send by Paypal).

Le point de terminaison de l'API

Ok, nous avons maintenant une interface avec Paypal. Si un payeur paie, Paypal nous envoie les données avec une demande de post. Et nous pouvons travailler avec les données (les vérifier, créer un nouvel utilisateur ou mettre à jour les utilisateurs existants).
Le problème suivant pourrait être le plus important. Vous devez créer un terminal auquel Paypal envoie les données. Vous vous souvenez du IPN handler URL? Et vous vous souvenez du premier script que j'ai posté au début?
Maintenant, vous devez créer un noeud final, quelque chose comme http://customer-website.tld/paypalapi. Ce noeud final est l'URL du gestionnaire IPN. Vous pouvez le faire avec les fonctions WordPress, il y a de bonnes réponses sur WPSE sur ce sujet . Je ne discuterai pas de cela ici.
Après avoir créé votre point de terminaison et l'avoir pointé sur un fichier php, utilisez le premier script pour vos tests. De cette manière, vous pouvez facilement tester si votre terminal fonctionne et si les données nécessaires sont présentes.
Si votre ordinateur d'extrémité fonctionne et que vous recevez les données nécessaires, remplacez le script par les deux méthodes ci-dessus, mais utilisez l'URL sandbox à la place de l'URL "active". Connectez-vous maintenant à votre compte de développeur Paypal et créez des paiements. En utilisant l'URL du bac à sable, vous disposez d'un environnement de développement et de test performant.

Résumé

  • Au début, vous devez vous inscrire sur PayPals Developer Network pour avoir accès aux exemples de scripts, à sandox et à bien d’autres.
  • Créez un script pour tester si la demande de publication de Paypal arrive. Commencez à tester des simulations IPN.
  • Créer un script pour enregistrer ou mettre à jour les utilisateurs WordPress en fonction des données envoyées par Paypal
  • Créer un terminal en tant que cible pour la demande de publication Paypal IPN
  • Mettez le tout ensemble, testez-le avec le bac à sable Paypal.
4
Ralf912