Die PayPal PHP SDK - Was ist das? Wie nutze ich sie?

Die PayPal PHP SDK

Die PayPal PHP SDK ist in die Jahre gekommen, aber funktioniert sehr gut. Zum Nutzen der Api brauchst du Credentials, sprich Zugangsdaten.

So sieht im Sandbox-Account aus, du hast so viel Geld, wie du willst, kannst es hier jederzeit nachfüllen und kannst auch so tun, als ob du kaufen kannst, was du willst, diesen Account brauchst du, wenn du mit der Api spielen willst, deshalb heißt es ja Paypal Sandbox Account.

Bildmaße: 1366 x 768 ,
Keywords: Paypal, Sandbox, Account

Ganz grundsätzlich musst du bei Paypal einen Business-Account haben. Ohne diesen kannst du nicht die Api nutzen. Wenn du weitere Informationen zu Grundlagen wie die Api brauchst, möchte ich dich auf diesen Artikel verweisen, wo ich die Smart Payment Buttons beschrieben habe. Sabald du diesen Business-Account oder Merchant-Account hast, kannst du dich im Developer Bereich von Paypal anmelden und Apps erstellen. Das ist hier.

Die Anmelde-Maske der Sanbox-Plattform

Der blaue abgerundete Knopf rechts oben ist der Zugang zum Developer Bereich von Paypal.

Bildmaße: 1312 x 618 ,
Keywords: Paypal, Sandbox, Developer, Bereich

Die Einrichtung eines Sandbox-Accounts, Apps und weitere wichtige Voraussetzungen

Sobald du dich angemeldet hast, kannst du eine App erstellen. Eine App ist nichts anderes als die Zugangsdaten. Die App kannst du für REST-Api erstellen oder für die NVP/SOAP API apps, die sind aber "legacy", Erbe, sprich veraltet. Wichtig: Du befindest dich auf "My Apps & Credentials" (siehe das Menu links). Alte SDKs werden nicht einfach abgeschaltet, da sonst viele Webshops nicht mehr funktionieren würden. Sie werden weitermitgeschleppt. Übrigens kannst du an dieser Stelle auch Zugangsdaten für die Arbeit mit dem Braintree SDK erstellen. Entsprechende Links sind auch hier zu finden.

App erstellen im Developer Bereich von Paypal, unter meine Apps und credentials

Unter dem Menupunkt My apps & credentials erstellt du deine App. Hier klickst du auf create App. App erstellen im Developer Bereich von Paypal.

Bildmaße: 1366 x 768 ,
Keywords: Paypal, Sandbox, Developer, Bereich

Links im Menu findest du weitere wichtige Links, wie den Link zu den Accounts, das sind die Sandbox-Accounts, die du einrichten musst, da du einen Business und einen normalen Account für Testzwecke benötigst. Sobald du deine App eingerichtet hast, klickst du auf Accounts und richtest dir einige User ein, um zu spielen:

Wir richten einige Sandbox-Accounts ein.

Fülle hier das Formular aus, um Accounts einzurichten, benutze die Währung deines Landes, Developer Bereich von Paypal, Account einrichten.

Bildmaße: 1366 x 768 ,
Keywords: Paypal, Sandbox, Developer, Bereich, einrichten, Account

Fertig.

Du klickst nun auf create Account und im Hintergrund wird dann von Paypal ein Account erstellt. Das dauert etwas. Übrigens gibt es die E-Mail nicht. Developer Bereich von Paypal, Account einrichten.

Bildmaße: 1366 x 768 ,
Keywords: Paypal, Sandbox, Developer, Bereich, einrichten, Account

Wie komme ich in meinen Sandbox-Account?

Und wie kommt man in seinen Paypal Sandbox-Account? Einfach auf das kleine graue Dreieck klicken. Dort kannst du deinen Account anpassen und z.B. Geld (funding) zuweisen. Developer Bereich von Paypal, Sandbox Account anpassen.

Bildmaße: 1366 x 768 ,
Keywords: Paypal, Sandbox, Developer, Bereich, anpassen, Account



CreatePaymentUsingPayPal.php


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="generator" content="CoffeeCup HTML Editor (www.coffeecup.com)">
    <meta name="dcterms.created" content="Sa, 01 Jun 2019 08:38:02 GMT">
    <meta name="description" content="Code von Paypal etwas adaptiert">
    <meta name="keywords" content="code">
    <title>create Payment</title>

  </head>
  <body>

  
<?php



    /**
     * error reporting wird erst einmal angeschaltet, d.h. 
     * die Fehler werden angezeigt, was gut 
     * für die Fehlerbehebung (Debugging) ist. Nicht vergessen 
     * in der Produktion wieder auszuschalten!
     */
 
session_start();
error_reporting(E_ALL);
ini_set("display_errors", "on");
ini_set("display_startip_errors", "on");








    /**
     * Das SDK habe ich auf Github einfach heruntergeladen. 
     * Du brauchst hier kein Composer
     * Sehr wichtig ist der Pfad von deiner Datei in
     * __DIR__ zur Datei autoload.php. Ohne autoload
     * geht gar nichts.
     * 
     */
 

require __DIR__  . '/PayPal-PHP-SDK/autoload.php';


$apiContext = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            'HieR_muSSt_du_deine_ClientID_aus_deM_SanDboX_ACCount_EInSEtzen', // ClientID
            'HIEr_KommT_DaS_CLIEntSecRet_rein'  // ClientSecret
        )
);



    /**
     * Create Payment bedeutet, wir bauen ein  
     * Payment Objekt und geben es an Paypal weiter.
     * Wir bekommen von Paypal eine URL zurück, 
     * die der Kunde besuchen kann. Dort findet
     * er oder sie seine Bestellung vor und 
     * muss sie nur noch bestätigen.
     */
 
//Create Payment using PayPal as payment method
//This sample code demonstrates how you can process a PayPal Account based Payment. API used: /v1/payments/payment

//require __DIR__ . '/../bootstrap.php';   //Es wird nicht gesagt, wofür der Code ist.
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;

    /**
     * Payer-Ojekt  
     * setPaymentMethod("paypal")
     * setzt Zahlungsmethode auf Paypal.
     */
$payer = new Payer();
$payer->setPaymentMethod("paypal");




    /**
     * Item-Objekte sind die Sachen,  
     * also einzelne Sachen, die du
     * verkaufst.
     */

$item1 = new Item();
$item1->setName('Ground Coffee 40 oz')//Name des Produkts
    ->setCurrency('EUR')   //Währung
    ->setQuantity(1)       //Menge
    ->setSku("123123") // eine Produktnummer
    ->setPrice(7.5); //Preis
$item2 = new Item();
$item2->setName('Granola bars')
    ->setCurrency('EUR')
    ->setQuantity(5)
    ->setSku("321321") // Similar to `item_number` in Classic API
    ->setPrice(2);
    
    
    
    
    
    /**
     * Item-Objekte werden hier in einer Liste als   
     * Array zusammengefasst.
     * 
     */
$itemList = new ItemList();
$itemList->setItems(array($item1, $item2));



    /**
     * Hier können optionale   
     * Angaben wie z.B. zu Lieferkosten
     * gemacht werden.
     */
$details = new Details();
$details->setShipping(1.2)
    ->setTax(1.3)
    ->setSubtotal(17.50);
	
	
	

    /**
     * Gesamtbetrag, auch zusätzliche Details 
     * wie Lieferkosten, Steuer können
     * gemacht werden.
     */
$amount = new Amount();
$amount->setCurrency("EUR")
    ->setTotal(20)
    ->setDetails($details);
    
    
    
    
    

    /**
     * Eine Transaktion (das Transaktions-Objekt) 
     * ist der Vertrag, wenn man eine 
     * Zahlung durchführt.
     * Hier steht wofür die Zahlung ist,
     * und wer sie bezahlt.
     *
     * Das Transaktionsobjekt beinhaltet
     * die Itemlist (Liste der Produkte,
     * die im vorherigen Schritt erstellt
     * wurde).
     */
$transaction = new Transaction();
$transaction->setAmount($amount)
    ->setItemList($itemList)
    ->setDescription("Payment description")
    ->setInvoiceNumber(uniqid());
	
	
	
    /**
     * Wenn der Kauf abgeschlossen ist,
     * kommt der Käufer zurück zu deiner
     * Seite,zu
     * $baseUrl/ExecutePayment.php?success=true.
     * Wenn der Käufer abgebrochen hat, zu
     * $baseUrl/ExecutePayment.php?success=false,
     * wobei $baseUrl deine Homepage ist.
     * Das änderst du unter 
     * $baseUrl = "https://www.primitivecode.com";
     */

$baseUrl = "https://www.primitivecode.com";
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("$baseUrl/ExecutePayment.php?success=true")
    ->setCancelUrl("$baseUrl/ExecutePayment.php?success=false");
	
	
	
	
    /**
     * Das Payment-Objekt beinhaltet
     * wiederum das Transaktionsobjekt.
     * Das Ziel ist ein Sale, daher 
     * setzt du Intent auf sale mit
     * $payment->setIntent("sale")
     * Die Weiterleitungs-URLs 
     * sind auch im Objekt enthalten.
     * 
     */

$payment = new Payment();
$payment->setIntent("sale")
    ->setPayer($payer)
    ->setRedirectUrls($redirectUrls)
    ->setTransactions(array($transaction));
    
    
    
//For Sample Purposes Only.
$request = clone $payment;



    /**
     * Das ist der Kern des Pudels.
     * Der Funktion
     * $payment->create()
     * wird der Api-Kontext, 
     * das sind die Zugangsdaten,
     * übergeben.
     * Paypal bereitet nun den Sale
     * vor und sendet eine 
     * URL, wo der Käufer den 
     * Paypal-Shop vorfindet 
     * und die Transaktion 
     * abschließen kann, sprich 
     * kaufen.
     */

try {
    $payment->create($apiContext);
} catch (Exception $ex) {



//NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY

    //ResultPrinter::printError("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", null, $request, $ex);
    exit(1);
}
//Get redirect url
//The API response provides the url that you must redirect the buyer to. Retrieve the url from the $payment->getApprovalLink() method






    /**
     * Hier wird die URL 
     * angefordert.
     *
     */

$approvalUrl = $payment->getApprovalLink();



//NOTE: PLEASE DO NOT USE RESULTPRINTER CLASS IN YOUR ORIGINAL CODE. FOR SAMPLE ONLY
 //ResultPrinter::printResult("Created Payment Using PayPal. Please visit the URL to Approve.", "Payment", "<a href='$approvalUrl' >$approvalUrl</a>", $request, $payment);
echo $approvalUrl;
return $payment;  
?>  
  
  
  </body>
</html>


Wenn der Käufer zurückgeschickt wird, wird der Kauf endgültig erst auf deiner Seite abgeschlossen:

ExecutePayment.php


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="generator" content="CoffeeCup HTML Editor (www.coffeecup.com)">
    <meta name="dcterms.created" content="Sa, 01 Jun 2019 08:55:15 GMT">
    <meta name="description" content="execute execution">
    <meta name="keywords" content="Abschluss eines Sales">
    <title></title>
  </head>
  <body>
<?php


session_start();
error_reporting(E_ALL);
ini_set("display_errors", "on");
ini_set("display_startip_errors", "on");



require __DIR__  . '/PayPal-PHP-SDK/autoload.php';


$apiContext = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            'deine_ClientID',     // ClientID
            'dein Secret'      // ClientSecret
        )
);






use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\Transaction;



//Approval Status
//Determine if the user approved the payment or not

if (isset($_GET['success']) && $_GET['success'] == 'true') {




    /**
     * Hier wird die PaymentID an 
     * payment::get übergeben.
     * Diese wurde von Paypal in der GET-Variablen 
     * an diese Seite
     * übergeben. Das Payment-Objekt wird 
     * jetzt noch einmal 
     * angefordert.
     * Mit diesem Objekt wird schließlich 
     * Die Zahlung durchgeführt durch
     * $result = $payment->execute($execution, $apiContext);
     * Du brauchst also ein Execution-Objekt 
     * und den Api-Kontext.
     *
     */

    $paymentId = $_GET['paymentId'];
    $payment = Payment::get($paymentId, $apiContext);
	
	  //var_dump($payment);
	

      
      
   /**
     * Erstellung des Execution-Objekts,
     * das für die durchführung der 
     * Zahlung benötigt wird.
     */
     
    $execution = new PaymentExecution();
    $execution->setPayerId($_GET['PayerID']);
	
	
    
    
	
   /**
     * Interessanterweise können hier 
     * (Nachdem der Käufer die Zahlung 
     * abgesegnet hat)
     * Änderungen am Zahlungsbetrag
     * vorgenommen werden.
     * Amount ist Teil des Transaktionsobjekts,
     * das hier neu erstellt wird.
     * Nachdem das Transaktionsobjekt
     * aufgebaut wurde, wird es 
     * ebenfalls dem Execution-
     * Objekt hinzugefügt.
     */
     
    $transaction = new Transaction();
    $amount = new Amount();
    $details = new Details();

    $details->setShipping(2.2)
        ->setTax(1.3)
        ->setSubtotal(17.50);

    $amount->setCurrency('EUR');
    $amount->setTotal(21);
    $amount->setDetails($details);
    $transaction->setAmount($amount);


    $execution->addTransaction($transaction);

    try {

    /**
     * Das ist der Kern des Pudels.
     * Die Zahlung wird finalisiert.
     * Der Rest ist die Klasse  
     * und die Veranschaulichung
     * der Rückgabevariablen.
     */
        $result = $payment->execute($execution, $apiContext); //Execute the payment (See bootstrap.php for more on ApiContext)

		echo("<pre>");
        echo("<br />");                           //ResultPrinter::printResult("Executed Payment", "Payment", $payment->getId(), $execution, $result);
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		echo("Execution:");
		print_r ($execution);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		echo("Result:");
		print_r ($result);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		echo("Payment:");
		print_r ($payment);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
        try {
            $payment = Payment::get($paymentId, $apiContext);
        } catch (Exception $ex) {
		
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		echo("Error getting Payment.");
		print_r ($ex);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
            //ResultPrinter::printError("Get Payment", "Payment", null, null, $ex);
            exit(1);
        }
    } catch (Exception $ex) {

	  	echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
		print_r ($ex);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("<br />");
        //ResultPrinter::printError("Executed Payment", "Payment", null, null, $ex);
        exit(1);
    }

	echo("--------------------------------------------");
		echo("<br />");
		echo("Payment:");
		print_r ($payment);
		echo("<br />");                          
		echo("<br />");
		echo("--------------------------------------------");
		echo("</pre>");
    //ResultPrinter::printResult("Get Payment", "Payment", $payment->getId(), null, $payment);

    return $payment;
} else {

  	echo("--------------------User Cancelled the Approval-----------------------");   
    //ResultPrinter::printResult("User Cancelled the Approval", null);
    exit;
}
?>


  </body>
</html>


Hier siehst du z.B. ein zurückgegebenes Execution-Objekt: Du siehst auch, dass das von PHP zurückgegebene Objekt für Menschen gut lesbar ist, und es sieht wie Json aus. Am größten ist aber das Result-Objekt.



--------------------------------------------
Execution:PayPal\Api\PaymentExecution Object
(
    [_propMap:PayPal\Common\PayPalModel:private] => Array
        (
            [payer_id] => SDWRWHMTVTD8A
            [transactions] => Array
                (
                    [0] => PayPal\Api\Transaction Object
                        (
                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                (
                                    [amount] => PayPal\Api\Amount Object
                                        (
                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                (
                                                    [currency] => EUR
                                                    [total] => 21
                                                    [details] => PayPal\Api\Details Object
                                                        (
                                                            [_propMap:PayPal\Common\PayPalModel:private] => Array
                                                                (
                                                                    [shipping] => 2.20
                                                                    [tax] => 1.30
                                                                    [subtotal] => 17.50
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)



Description: Wir schauen uns an, wie man auf seiner Webseite den Verkauf über Paypal mit der PHP SDK integriert.

Keywords: Verkaufen, Paypal, Button, Verkauf, sale, abwickeln, Abwicklung, Verkäufer, Käufer, Transaktion, transaction, Zahlung, Payment, api, rest, erstellen, integrieren, Spenden-Link, onlineshop, online, shop, create, token, PaymentExecution, execute
Geschrieben:
Sprache: de (Deutsch)

Primitivecode ist Grammatik pur. Aber Programmieren kommt auch nicht zu kurz, denn die Seite mache ich allein. Informationen zum Datenschutz findest du hier.