it-swarm.com.de

Bezahlung bei Registrierung?

Fallstudie:

Ich muss bezahlt werden, wenn sich jemand auf meiner Website registriert. Der größte Teil der Seite sollte nur für angemeldete Benutzer verfügbar sein. Paypal wird meine Zahlungsmöglichkeiten sein.

Frage?

Ich muss wissen, wie ich mit Paypal kommunizieren kann, nachdem ich die Zahlung getätigt habe, dass ein Benutzer die Zahlung getätigt hat oder nicht?

2
Choudhury A. M.

Dies geschieht am besten mit Benutzerrollen. Ein Benutzer kann sich registrieren, aber nicht lesen. Nach dem Bezahlen mit Paypal wird die Rolle aktualisiert (z. B. vom Leser zum Abonnenten). Das Update kann über PayPals IPN erfolgen.

Ich habe das für einen meiner Kunden gemacht. Sie werden von Ihrem Kunden bezahlt. Ich werde von dir bezahlt. Du hast das Plugin.

Update

Da Sie ein Theme schreiben möchten und es nicht für Ihre professionelle Arbeit nutzen, hier einige Teile meiner Plugin-Lösung.

Paypal IPN

Beginnen wir mit Paypal IPN. Paypal hat eine gut dokumentierte API und ein Paypal Developer Network . Ein Konto im Entwicklernetzwerk wird Ihnen viel helfen, Paypal bietet eine Sandbox und viele Skripte und Tutorials.
Als ich durch das Entwicklernetzwerk grub, fand ich das IPN (Instant Payment Notification). IPN bedeutet, dass Paypal eine Post-Anfrage mit detaillierten Informationen über den Zahler an eine in Ihrem Paypal-Konto angegebene URL sendet. Während der Entwicklung werden Sie den IPN-Simulator lieben.
Lassen Sie das erste experimentelle Skript beginnen. Gehen Sie zum Paypal IPN Simulatro (siehe Link oben). Das erste, was der Simulator benötigt, ist eine URL zu Ihrem Skript. Paypal sendet die Daten mit einer Post-Anfrage, sodass Sie Ihren lokalen Webserver nicht nutzen können. Sie benötigen einen öffentlichen Webserver. Angenommen, Ihr Server ist unter http://yourdoma.in erreichbar, laden Sie das unten stehende Skript mit ftp hoch (z. B. pplog.php) und geben Sie http://yourdoma.in/pplog.php in das Feld oder IPN handler URL ein. Wählen Sie Cart checkout aus der nächsten Dropdown-Liste und drücken Sie 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));

Das Skript sollte eine E-Mail mit den Daten senden, die Paypal als Postanforderung sendet. Nachdem die E-Mail eingegangen ist und Sie sie geöffnet haben, sehen Sie viele Daten. Wir brauchen nur eine Handvoll von ihnen, sei nicht gereizt. Wir sind nur an last_name, first_name und payer_email interessiert.

Jetzt müssen wir etwas mit den erhaltenen Postdaten machen. Zunächst können Sie die Post-Daten überprüfen. Wenn Sie der Meinung sind, dass die Daten in Ordnung sind und niemand Sie behandeln wird, überspringen Sie den nächsten Schritt. Wenn Sie wissen, dass jeder eine Post-Anfrage mit den erforderlichen Post-Daten senden kann (da Ihr Theme Open Source ist), müssen Sie die Post-Daten überprüfen.
Um die erhaltenen Daten zu überprüfen, müssen wir sie an Paypal zurücksenden. Paypal antwortet mit VERIFIED oder INVALID. Das nächste Code-Snippet stammt aus dem Paypal Dev Network

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
     */
  }
}

Dieser Code stammt aus einer Klasse, die ich benutzt habe. Zu Beginn des Kurses sehen Sie den const PAYPALURI. Paypal bietet eine Sandbox (Account erforderlich), mit der Sie Ihre Skripte testen können, ohne mit "echten" Daten umzugehen. Ich lasse diesen Code so, wie er ist. Er könnte optimiert werden. Anstatt fsockopen() zu verwenden, könnten Sie auch wp_remote_get() verwenden.
Nun müssen wir die Antwort von Paypal bearbeiten, das nächste Snippet stammt wieder aus meiner Klasse:

/*
 * 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
 */

Ganz einfach. Überprüfen Sie, ob die Verbindung erfolgreich war. Wenn ja, überprüfen Sie die Antwort. Wenn die Antwort INVALID lautet, machen Sie nichts. Wenn es sich um VERIFIED handelt, geben Sie den Vor- und Nachnamen sowie die E-Mail-Adresse des Zahlers aus der ersten Postanforderung an.

Benutzer anlegen oder aktualisieren

Jetzt haben wir einen Namen und eine E-Mail-Adresse, damit wir einen Benutzer erstellen oder einen vorhandenen Benutzer aktualisieren können. Grundsätzlich muss man einen Benutzer mit den angegebenen Daten finden. Wenn ein Benutzer vorhanden ist, aktualisieren Sie den Benutzer. Andernfalls legen Sie einen neuen Benutzer an.
Das Abrufen eines Benutzers nach Vor- und Nachnamen ist möglich, jedoch nicht das Thema dieses Beitrags. Wir machen es uns einfach und versuchen, einen Benutzer über die E-Mail-Adresse zu erreichen, die wir gerade erhalten haben. Das ist einfach, weil WordPress eine nette Funktion dafür hat: get_user_by(). Oben haben wir den Namen und die E-Mail-Adresse in ein Array kopiert und dieses Array an die Methode modify_wp_user() übergeben.

/**
 * 
 * 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 );
    }
}

Es ist ein einfacher Schalter. Holen Sie den Benutzer und aktualisieren oder erstellen. Bei dieser Lösung muss der Zahler die gleiche E-Mail-Adresse in Paypal und im Blog verwenden. Und wenn ein neuer Benutzer erstellt wird, ist das Login das gleiche wie die E-Mail-Adresse (von per Paypal senden).

Der API-Endpunkt

Ok, wir haben jetzt eine Schnittstelle zu Paypal. Wenn ein Zahler zahlt, sendet uns Paypal die Daten mit einer Postanfrage. Und wir können mit den Daten arbeiten (sie überprüfen, einen neuen Benutzer erstellen oder vorhandene aktualisieren).
Das nächste Problem könnte das größte sein. Sie müssen einen Endpunkt erstellen, an den Paypal die Daten sendet. Erinnerst du dich an den IPN handler URL? Und erinnerst du dich an das erste Drehbuch, das ich am Anfang gepostet habe?
Nun müssen Sie einen Endpunkt erstellen, etwa http://customer-website.tld/paypalapi. Dieser Endpunkt ist die IPN-Handler-URL. Sie können dies mit WordPress-Funktionen tun, es gibt einige gute Antworten auf WPSE zu diesem Thema . Ich werde das hier nicht diskutieren.
Nachdem Sie Ihren Endpunkt erstellt und auf eine PHP-Datei gezeigt haben, verwenden Sie das erste Skript für Ihre Tests. Auf diese Weise können Sie auf einfache Weise testen, ob Ihr Endpunkt funktioniert und ob die erforderlichen Daten vorhanden sind.
Wenn Ihr Endpunkt funktioniert und Sie die erforderlichen Daten erhalten, ersetzen Sie das Skript durch die beiden oben genannten Methoden, verwenden Sie jedoch die Sandbox-URL anstelle der Live-URL. Melden Sie sich jetzt in Ihrem Paypal-Entwicklerkonto an und erstellen Sie einige Zahlungen. Mit der Sandbox-URL erhalten Sie eine gute Entwicklungs- und Testumgebung.

Zusammenfassung

  • Zuerst sollten Sie sich bei PayPals Developer Network registrieren, um Zugriff auf die Beispielskripte, Sandox und vieles mehr zu erhalten.
  • Erstellen Sie ein Skript, um zu testen, ob die Post-Anfrage von Paypal eintrifft. Beginnen Sie mit dem Testen einiger IPN-Simulationen.
  • Erstellen Sie ein Skript, um WordPress-Benutzer anhand der von Paypal gesendeten Daten zu registrieren oder zu aktualisieren
  • Erstellen Sie einen Endpunkt als Ziel für die Paypal IPN-Post-Anfrage
  • Alles zusammen, testen Sie es mit der Paypal Sandbox.
4
Ralf912