web-dev-qa-db-ja.com

Yii2のPaypal拡張機能を使用してyii2に支払いゲートウェイを統合する方法

Yii2でPaypal拡張機能を使用する方法。私はこのリンクを使用しています
https://github.com/marciocamello/yii2-Paypal
拡張機能をインストールし、設定ファイルにコードを追加しました。

しかし、次に何をすべきかについての情報はこれ以上ありません。だから私を助けてください。

ありがとう

12
jatin vaghasiya

このために拡張機能を使用する必要はありません。 Paypal/rest-api-sdk-php パッケージをインストールして、次の手順を実行するだけです。

1.PaypalをYii2に接着するコンポーネントを作成します

@appディレクトリにcomponentsフォルダを作成します。基本テンプレートを使用している場合、これは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呼び出しを行います

To 最初のAPI呼び出しを行う Yii2では、

支払いを処理するコントローラーアクションを開き、以下を含めます

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のドキュメントと同様です。

接続を開始すると、他のタスクを実行できるようになります。

16
iGbanam

これは私の解決策です、それはyii2の高度なtempalteで動作します!

このクラスmarciocamello/yii2-Paypal /PayPal.phpをベンダーフォルダーからcommon/component /Paypal.phpに移動しました

コンポーネントセクションの下の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();

リダイレクトURL、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または40倍のエラーが発生する場合は、Paypalの応答全体をエラーメッセージなどとともにPPHttpConnection.phpの107行目に出力できます。

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

https://github.com/marciocamello/yii2-Paypal 。この拡張機能により、このリンクから入手できるPaypalライブラリをセットアップ/インストールできます https://github.com/Paypal/PayPal-PHP-SDK
このpapypal-php-SDKには、さまざまな方法の例があります。

このライブラリをYII2にインストール/セットアップし、支払い方法を使用しました。

1
Mohd Bashir

私のウェブサイトでは、RestAPIに基づくPaypalエクスプレスチェックアウトを使用しています。サードパーティの拡張機能は必要ありません。このソリューションは、Yiiフレームワークに限らず、一般的にどのWebサイトにも適用できます。基本的な概念を理解するには https://developer.Paypal.com/docs/integration/direct/ express-checkout/Integration-jsv4 /

これが私のアプローチです:

  1. REST API APP in https://developer.Paypal.com を作成します。APPを作成すると、クライアントIDと秘密鍵が取得されます。後で認証に使用されます。

  2. チェックアウトボタンを表示するWebページで、空のdiv <div id="Paypal-button"></div>を作成します

  3. https://www.paypalobjects.com/api/checkout.js javascriptをアセットに含めます。

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;
    
    }
    }
    
0
Vikalp Veer