it-swarm.com.de

So integrieren Sie das Payment Gateway in yii2 mithilfe der Paypal-Erweiterung für den Yii2

Verwendung der Paypal-Erweiterung in yii2. Ich verwende diesen Link 
https://github.com/marciocamello/yii2-Paypal
Ich habe die Erweiterung installiert und auch Code in der Konfigurationsdatei hinzugefügt.

Aber es gibt nicht mehr Informationen darüber, was als nächstes zu tun ist. Also bitte hilf mir.

Vielen Dank

12
jatin vaghasiya

Dafür ist keine Erweiterung erforderlich. Sie können einfach das Paket Paypal/rest-api-sdk-php installieren und die folgenden Schritte ausführen.

1. Erstellen Sie eine Komponente, um Paypal mit Yii2 zu verkleben

Erstellen Sie einen components-Ordner in Ihrem @app-Verzeichnis. Wenn Sie die Basisvorlage verwenden, ist dies derselbe Ordner wie webroot. In der erweiterten Vorlage befindet sich dieser Ordner in der App, in der Sie Zahlungen aktivieren möchten.

Erstellen Sie eine PHP-Klassendatei (zum Beispiel CashMoney) mit folgendem Inhalt

use yii\base\Component;

use Paypal\Rest\ApiContext;
use Paypal\Auth\OAuthTokenCredential;

class CashMoney extends Component {
  public $client_id;
  public $client_secret;
  private $apiContext; // Paypal's API context

  // override Yii's object init()
  function init() { 
    $this->apiContext = new ApiContext(
      new OAuthTokenCredential($this->client_id, $this->client_secret)
    );
  }

  public function getContext() {
    return $this->apiContext;
  }
}

Das ist genug um loszulegen. Sie können später weitere Konfigurationen für Paypal hinzufügen.

2. Registrieren Sie Ihre Klebstoffkomponente bei Yii2

Fügen Sie in Ihrem app/config/main.php (oder app/config/main-local.php) Folgendes zum Registrieren der CashMoney-Komponente hinzu.

'components' => [
  ...
  'cm' => [ // bad abbreviation of "CashMoney"; not sustainable long-term
    'class' => 'app/components/CashMoney', // note: this has to correspond with the newly created folder, else you'd get a ReflectionError

     // Next up, we set the public parameters of the class
    'client_id' => 'YOUR-CLIENT-ID-FROM-Paypal',
    'client_secret' => 'YOUR-CLIENT-SECRET-FROM-Paypal',
    // You may choose to include other configuration options from Paypal
    // as they have specified in the documentation
  ],
  ...
]

Jetzt haben wir unsere Zahlungskomponente als CashMoney registriert, wir können mit Yii::$app->cm darauf zugreifen. Cool was?

3. Machen Sie API-Aufrufe

Machen Sie Ihren ersten API-Aufruf in Yii2,

Öffnen Sie die Controller-Aktion, in der Sie Zahlungen abwickeln möchten, und fügen Sie Folgendes hinzu

use Yii;
...
use Paypal\Api\CreditCard;
use Paypal\Exception\PaypalConnectionException;

class PaymentsController { // or whatever yours is called
  ...
  public function actionMakePayments { // or whatever yours is called
    ...
    $card = new PayPalCreditCard;
    $card->setType('visa')
      ->setNumber('4111111111111111')
      ->setExpireMonth('06')
      ->setExpireYear('2018')
      ->setCvv2('782')
      ->setFirstName('Richie')
      ->setLastName('Richardson');

    try {
      $card->create(Yii::$app->cm->getContext());
      // ...and for debugging purposes
      echo '<pre>';
      var_dump('Success scenario');
      echo $card;
    } catch (PayPalConnectionException) {
      echo '<pre>';
      var_dump('Failure scenario');
      echo $e;
    }
    ...
  }

  ...

}

Die erwartete Ausgabe ähnelt der in der Paypal-Dokumentation.

Sobald Sie die Verbindung hergestellt haben, sollten Sie andere Aufgaben ausführen können. 

16
iGbanam

Dies ist meine Lösung, es funktioniert mit yii2 advanced tempalte!

Diese Klasse wurde von marciocamello/yii2-Paypal/PayPal.php aus dem Lieferantenordner nach common/component/Paypal.php verschoben

Sie müssen allgemeine\components\Paypal in frontend\config\main.php im Abschnitt "Komponenten" einfügen:

 'components' => [
    'Paypal'=> [
        'class'        => 'common\components\Paypal',
        'clientId'     => 'your id you can find it over your Paypal develpoer account. Ypu ah to create an application',
        'clientSecret' => 'your id you can find it over your Paypal develpoer account. Ypu ah to create an application',
        'isProduction' => false,
         // This is config file for the Paypal system
         'config'       => [
             'http.ConnectionTimeOut' => 30,
             'http.Retry'             => 1,
             'mode'                   => \common\components\Paypal::MODE_SANDBOX, 
             'log.LogEnabled'         => YII_DEBUG ? 1 : 0,
             'log.FileName'           => '@runtime/logs/Paypal.log',
             'log.LogLevel'           => \common\components\Paypal::LOG_LEVEL_INFO,
        ]
    ],

]

In PPHttpConfig.php in Zeile 11 habe ich die folgende Zeile geändert

    //CURLOPT_SSLVERSION => 3,
    CURLOPT_SSLVERSION => 'CURL_SSLVERSION_TLSv1',

In PPLoggingManager.php in Zeile 48-52 wurde der Protokollpfad hart codiert

if($this->isLoggingEnabled) {
        $this->loggerFile = $_SERVER['DOCUMENT_ROOT'].'/domain/frontend/runtime/logs/Paypal.log';//($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log');
        $loggingLevel = strtoupper($config['log.LogLevel']);
        $this->loggingLevel = (isset($loggingLevel) && defined(__NAMESPACE__."\\PPLoggingLevel::$loggingLevel")) ? constant(__NAMESPACE__."\\PPLoggingLevel::$loggingLevel") : PPLoggingManager::DEFAULT_LOGGING_LEVEL;
    }

Im Site-Controller wurde die Komponentenfunktion aufgerufen

      echo '<pre/>';
  print_r(Yii::$app->Paypal->payDemo());  
  exit();

Ich habe eine erfolgreiche Antwort mit Weiterleitungs-URL, Transaktions-ID usw. erhalten.

--------------  400 ERROR Debuging ----------

Ich habe immer 400 Fehler bekommen, weil ich ein Problem mit dem Preisformat hatte. Ich habe es mit der Funktion number_format behoben.

Ich habe die payDemo () - Funktion etwas geändert.

    $amount = 16;    
$formattedAmount = number_format($amount,2);
        $payer = new Payer();
        $payer->setPayment_method("Paypal");
        $item1 = new Item();
$item1->setName('Ground Coffee 40 oz')
    ->setCurrency('USD')
    ->setQuantity(1)
    ->setPrice($formattedAmount);
$item2 = new Item();
$item2->setName('Granola bars')
    ->setCurrency('USD')
    ->setQuantity(1)
    ->setPrice($formattedAmount);
$itemList = new ItemList();

$itemList->setItems(array($item1, $item2));
        //  $amountDetails = new Details();
        // $amountDetails->setSubtotal('7');
        // $amountDetails->setTax('0.00');
        // $amountDetails->setShipping('0.00');

         $amount = new Amount();
        $amount->setCurrency('USD');
        $amount->setTotal(number_format((2*$formattedAmount),2));
      //  $amount->setDetails($amountDetails);

        $transaction = new Transaction();
        $transaction->setDescription("creating a payment");
        $transaction->setItemList($itemList);
        $transaction->setAmount($amount);

        //$baseUrl = getBaseUrl();
        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturn_url("https://devtools-Paypal.com/guide/pay_Paypal/php?success=true");
        $redirectUrls->setCancel_url("https://devtools-Paypal.com/guide/pay_Paypal/php?cancel=true");

        $payment = new Payment();
        $payment->setIntent("sale");
        $payment->setPayer($payer);
        $payment->setRedirect_urls($redirectUrls);
        $payment->setTransactions(array($transaction));


        return $payment->create($this->_apiContext);

Wenn Sie immer noch einen 400- oder 40-fachen Fehler erhalten, können Sie die gesamte Paypal-Antwort mit Fehlermeldungen usw. in der Zeile PPHttpConnection.php in Zeile 107 ausgeben. 

    $ex->setData($result);
        // echo '<pre>';
        // print_r($ex);exit;
        throw $ex;
2
Nagy Ervin

https://github.com/marciocamello/yii2-Paypal . Mit dieser Erweiterung können Sie einfach die Paypal-Bibliothek einrichten/installieren, die unter diesem Link verfügbar ist - https://github.com/Paypal/PayPal-PHP-SDK
Dieses papypal-php-SDK hat Beispiele mit unterschiedlichen Methoden. 

Ich habe diese Bibliothek in YII2 installiert und eingerichtet und Zahlungsmethoden verwendet.

1
Mohd Bashir

Ich verwende die Paypal Express Checkout-Funktion, die auf Rest API basiert, auf meiner Website. Keine Erweiterung von Drittanbietern erforderlich. Die Lösung kann auf jede Website angewendet werden, die nicht auf das Yii-Framework beschränkt ist. Um grundlegende Konzepte zu erhalten, lesen Sie https://developer.Paypal.com/docs/integration/direct/express-checkout/integration-jsv4/

Hier ist mein Ansatz:

  1. Erstellen Sie eine REST API-APP in https://developer.Paypal.com . Nachdem Sie Ihre APP erstellt haben, erhalten Sie die Client-ID und den geheimen Schlüssel, die später zur Authentifizierung verwendet werden.

  2. Erstellen Sie auf Ihrer Webseite, auf der Sie die Checkout-Schaltfläche anzeigen möchten, ein leeres div <div id="Paypal-button"></div>.

  3. Fügen Sie https://www.paypalobjects.com/api/checkout.js javascript in Ihr Asset ein. 

4.Rendern Sie den Paypal-Button mit dem folgenden Javascript-Code

Paypal.Button.render({
    env: 'sandbox', // Specify 'sandbox' for the test environment
    client: {
        sandbox: 'CLIENT-ID of your APP in step1'           
    },
    payment: function (resolve, reject) {

        /* URL which would create payment */
        var CREATE_PAYMENT_URL = '/transactions/create-Paypal';

        Paypal.request.post(CREATE_PAYMENT_URL)
            .then(function (data) {
                resolve(data.paymentID);
            })
            .catch(function (err) {
                reject(err);
            });
    },

    onAuthorize: function (data, actions) {

        // Execute the payment here, when the buyer authorize and approves the transaction
        var EXECUTE_PAYMENT_URL = '/transactions/execute-Paypal';
        Paypal.request.post(EXECUTE_PAYMENT_URL,
            {paymentID: data.paymentID, payerID: data.payerID, token: data.paymentToken,serviceId:serviceId})

            .then(function (data) {
                console.log(data);
                if(data.http_code == '200') {
                    /* payment done .. do something here */
                    handleCreateService(url);
                }else {
                    /* something didn't went right with payment */
                }
            })
            .catch(function (err) {
                /* catch any exceptions */
                console.log(err);
            });
    }

}, '#Paypal-button');
  1. Jetzt müssen Sie Ihre Erstellungszahlung codieren und Zahlungsmethoden im Controller ausführen. 

    /* Create Paypal function will pass token,
    paymentID back to JS in step 4. */
    
    public function actionCreatePaypal() {        
        $Paypal = new Paypal();
        $Paypal->getToken();
        $res = $Paypal->createPayment();
        echo json_encode($res);
    }
    
    public function actionExecutePaypal() {
        $paymentID = $_POST['paymentID'];
        $payerID =  $_POST['payerID'];
        $access_token = $_POST['token'];
        $Paypal = new Paypal(['paymentID'=>$paymentID,'payerID' =>$payerID,'access_token' =>$access_token]);
        $Paypal->getToken();
        $res = $Paypal->executePayment();
        echo json_encode($res);
    }    
    
  2. Erstellen Sie schließlich eine Komponente für die Authentifizierung/Generierung des Token und die Ausführung der Zahlung.

    class Paypal {  
    
        public $url;
        public $env;
        public $clientId;
        public $clientSecret;
        public $access_token;
        public $paymentID;
        public $payerID;
        public $premiumService;
    
        public function __construct($params=0) {
            $this->access_token = '';
            /* for sandbox url is https://api.sandbox.Paypal.com */
            $this->url = \Yii::$app->params['Paypal_url'];
            $this->clientId = \Yii::$app->params['Paypal_clientId'];
            $this->clientSecret = \Yii::$app->params['Paypal_clientSecret'];
    
            if(isset($params['paymentID'])) {
                $this->paymentID = $params['paymentID'];
            }
    
            if(isset($params['payerID'])) {
                $this->payerID = $params['payerID'];
            }
    
            if(isset($params['access_token'])) {
                $this->access_token = $params['access_token'];
            }
    
            /* This is where you describe the product you are selling */    
            $this->premiumService = '{
            "intent":"sale",
            "redirect_urls":{
                 "cancel_url":"https://cancelurl.com",
                 "return_url":"https://returnurl.com"
            },
            "payer":{
                "payment_method":"Paypal"
            },
            "transactions":[
            {
                "amount":{
                "currency":"USD",
                "total":"39.00"
                },
                "item_list":{
                    "items": [
                    {
                        "quantity": "1",
                        "name": "Premium Service",
                        "price": "39.00",
                        "currency": "USD",
                        "description": "Purchase allows one time use of this premium service"
                    }]
                },
                "description":"Premium Service"
    
            }]
            }';
    }
    public function getToken() {
        $curlUrl = $this->url."/v1/oauth2/token";
        $curlHeader = array(
            "Content-type" => "application/json",
            "Authorization: Basic ". base64_encode( $this->clientId .":". $this->clientSecret),
        );
        $postData = array(
            "grant_type" => "client_credentials"
        );
    
        $curlPostData = http_build_query($postData);
        $curlResponse = $this->curlCall($curlUrl, $curlHeader, $curlPostData);
        if($curlResponse['http_code'] == 200) {
            $this->access_token = $curlResponse['json']['access_token'];
        }
    }
    
    
    public function createPayment() {
        $curlUrl = $this->url."/v1/payments/payment";
        $curlHeader = array(
            "Content-Type:application/json",
            "Authorization:Bearer  ". $this->access_token,
        );
    
    
        $curlResponse = $this->curlCall($curlUrl, $curlHeader, $this->premiumService);
        $id = null;
        $approval_url = null;
        if($curlResponse['http_code'] == 201) {
            $id = $curlResponse['json']['id'];
            foreach ($curlResponse['json']['links'] as $link) {
                if($link['rel'] == 'approval_url'){
                    $approval_url = $link['href'];
                }
            }
        }
    
        $res = ['paymentID' =>$id,'approval_url'=>$approval_url];
        return $res;
    }
    
    public function executePayment() {
        $curlUrl = $this->url."/v1/payments/payment/".$this->paymentID."/execute";
    
        $curlHeader = array(
            "Content-Type:application/json",
            "Authorization:Bearer ".$this->access_token,
        );
        $postData = array(
            "payer_id" => $this->payerID
        );
    
        $curlPostData = json_encode($postData);
        $curlResponse = $this->curlCall($curlUrl, $curlHeader, $curlPostData);
    
        return $curlResponse;
    }
    
    function curlCall($curlServiceUrl, $curlHeader, $curlPostData) {
        // response container
        $resp = array(
            "http_code" => 0,
            "json"     => ""
        );
    
        //set the cURL parameters
        $ch = curl_init($curlServiceUrl);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
    
        //turning off the server and peer verification(TrustManager Concept).
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    
        curl_setopt($ch, CURLOPT_SSLVERSION , 'CURL_SSLVERSION_TLSv1_2');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        //curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeader);
    
        if(!is_null($curlPostData)) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPostData);
        }
        //getting response from server
        $response = curl_exec($ch);
    
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
        curl_close($ch); // close cURL handler
    
        // some kind of an error happened
        if (empty($response)) {
            return $resp;
        }
    
        $resp["http_code"] = $http_code;
        $resp["json"] = json_decode($response, true);
    
        return $resp;
    
    }
    }
    
0
Vikalp Veer