如何使用PayPal扩展为Yii2集成yii2中的支付网关

时间:2015-02-05 12:05:04

标签: php paypal yii2 yii-extensions

如何在yii2中使用paypal扩展。我正在使用此链接
https://github.com/marciocamello/yii2-paypal
我安装了扩展程序,并在配置文件中添加了代码。

但是没有更多信息下一步该做什么。所以请帮助我。

由于

4 个答案:

答案 0 :(得分:16)

无需为此使用扩展名。您只需安装paypal/rest-api-sdk-php包并执行以下步骤即可。

1。创建一个组件,将Paypal粘贴到Yii2

components目录中创建@app文件夹。如果您使用的是基本模板,则该文件夹与webroot相同;在高级模板中,此文件夹位于您要启用付款的应用中。

使用以下内容创建一个PHP类文件(例如CashMoney

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;
  }
}

这足以开始使用。您可以选择稍后添加特定于PayPal的其他配置。

2。使用Yii2

注册胶水组件

app/config/main.php(或app/config/main-local.php)中,添加以下内容以注册CashMoney组件。

'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
  ],
  ...
]

现在我们的付款组件已注册为CashMoney,我们可以使用Yii::$app->cm访问它。很酷,嗯?

3。进行API调用

Yii2中的Make Your First API call

打开要处理付款的控制器操作,并包含以下内容

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;
    }
    ...
  }

  ...

}

预期输出类似于PayPal文档中的输出。

一旦建立连接,您应该能够执行其他任务。

答案 1 :(得分:2)

这是我的解决方案,它适用于yii2高级tempalte!

我将此类marciocamello / yii2-paypal / PayPal.php从供应商文件夹移至common / component / PayPal.php

你必须&#34;包括&#34;组件部分下的frontend \ config \ main.php中的common \ components \ paypal:

 '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,
        ]
    ],

],

在第11行的PPHttpConfig.php中,我更改了以下行

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

在第48-52行的PPLoggingManager.php中,硬编码了日志路径

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;
    }

在站点控制器中,我称之为组件功能

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

我通过重定向网址,transactionId等获得了成功的回复。

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

我总是得到400错误,因为我有价格格式的问题,我使用number_format函数修复它。

我修改了payDemo()函数。

    $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);

如果仍然出现400或40x错误,您可以在第107行的PPHttpConnection.php中打印整个PayPal响应和错误消息等。

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

答案 2 :(得分:1)

https://github.com/marciocamello/yii2-paypal。通过此扩展,您可以设置/安装此链接上可用的paypal库 - https://github.com/paypal/PayPal-PHP-SDK
这个papypal-php-SDK有不同方法的例子。

我已在YII2中安装/设置此库并使用了付款方式。

答案 3 :(得分:0)

我在我的网站上使用基于Rest API的paypal express checkout。无需任何第三方扩展。该解决方案可以应用于任何网站,通常不限于Yii框架。要获得基本概念,请阅读https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/

这是我的方法:

  1. https://developer.paypal.com中创建REST API APP。创建APP后,您将获得客户端ID和密钥,以便稍后用于身份验证。

  2. 在您要显示结帐按钮的网页上,创建一个空div <div id="paypal-button"></div>

  3. 在您的资源中加入https://www.paypalobjects.com/api/checkout.js个javascript。

  4. 4.使用以下Javascript代码恢复paypal按钮

    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. 现在您需要对创建付款进行编码并在控制器中执行付款方式。

      /* 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. 最后创建一个组件来进行身份验证/生成令牌并执行付款。

      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;
      
      }
      }