• 0

كيفية إضافة بوابة دفع بيبال إلى تطبيق لارافيل

السلام عليكم

هل هناك شرح او توضيح باللغه العربية لفهم كيفية اضافة  paypall  لمشروع لارافيل  وفهم ال api

تمّ تعديل بواسطة Adnane Kadri
توضيح السؤال
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

ستحتاج أولا التسجيل بحساب تجاري في بيبال .ثم سنحتاج الدخول إلى لوحة تحكم المطور , أين يمكنك التعرف على نمطين و حسابين  :

  • حساب تجريبي , أو حساب sandbox (لأغراض الإختبار و التطوير).
  • حساب حي , أو حساب live (لأغراض الدفع و التعامل الحقيقي) .
  1. سنقوم بتثبيت مكتبة paypal/rest-api-sdk-php عن طريق مدير الحزم composer : 
composer install paypal/rest-api-sdk-php

   2. لنقم بإنشاء ملف إعداد paypal.php في مجلد config , و لنتأكد من إمتلاكه المحتوى التالي :

<?php 
return [ 
    'client_id' => env('PAYPAL_CLIENT_ID',''),
    'secret' => env('PAYPAL_SECRET',''),
    'settings' => array(
        'mode' => env('PAYPAL_MODE','sandbox'),
        'http.ConnectionTimeOut' => 30,
        'log.LogEnabled' => true,
        'log.FileName' => storage_path() . '/logs/paypal.log',
        'log.LogLevel' => 'ERROR'
    ),
];

   3. لنتوجه إلى ملف البيئة env. و لنتأكد من تعريف المتغيرات التالية : 

PAYPAL_CLIENT_ID=xxxxxxxxx
PAYPAL_SECRET=xxxxxxxxx
PAYPAL_MODE=xxxx

حيث أن المتغيرين PAYPAL_CLIENT_ID و PAYPAL_SECRET يجلبان من لوحة تحكم المطور . 

  4. لنقم بإنشاء متحكم PaymentController يلخص بعض العمليات و لنتأكد من إمتلاكه المحتوى التالي :  

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\Plan;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\PayerInfo;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use Illuminate\Support\Facades\Input;
use Redirect;
use URL;

class PaymentController extends Controller
{
    public function __construct()
    {
         /** إعداد سياق العملية و بدءها **/
         $paypal_conf = \Config::get('paypal');
      
         $this->_api_context = new ApiContext(new OAuthTokenCredential(
             $paypal_conf['client_id'],
             $paypal_conf['secret']) 
         );
         
         // حفظ الاعدادات
         $this->_api_context->setConfig($paypal_conf['settings']);
    }
    
    public function payWithpaypal()
    {
      $amountToBePaid = 100; // قيمة افتراضية يفترض أن تستجلب من الطلب
      
      $payer = new Payer();
      
      $payer->setPaymentMethod('paypal');
      
      /*تعريف عنصر*/
      $item_1 = new Item();
      $item_1->setName('هاتف نقال') /** اسم العنصر **/
              ->setCurrency('USD')
              ->setQuantity(1)
              ->setPrice($amountToBePaid); /** سعر العنصر **/
      
      /*تعريف قائمة عناصر و إضافة العنصر المعرف سابقا*/
      $item_list = new ItemList();
      $item_list->setItems(array($item_1));
      
      
      /*تعريف مقدار*/
      $amount = new Amount();
      $amount->setCurrency('USD')
             ->setTotal($amountToBePaid);
      
      /** تخصيص روابط إعادة **/
      $redirect_urls = new RedirectUrls();
      
      $redirect_urls->setReturnUrl(URL::route('status'))
                ->setCancelUrl(URL::route('status'));
      
      /*تعريف تحويل جديد*/
      $transaction = new Transaction();
      $transaction->setAmount($amount)
              ->setItemList($item_list)
              ->setDescription('وصف التحويل');   
      
      /*تعريف مدفوعة و إضافة عملية الدفع إليها*/
      $payment = new Payment();
      $payment->setIntent('Sale')
              ->setPayer($payer)
              ->setRedirectUrls($redirect_urls)
              ->setTransactions(array($transaction));
      
      /*تنفيذ العملية*/ 
      try {
           $payment->create($this->_api_context);
      } catch (\PayPal\Exception\PPConnectionException $ex) {
           if (\Config::get('app.debug')) {
              \Session::put('error', 'فشل الاتصال تحقق من الاتصال');
              return Redirect::route('/');
           } else {
              \Session::put('error', 'حدث خطأ');
              return Redirect::route('/');
           }
      }
      
     foreach ($payment->getLinks() as $link) {
        if ($link->getRel() == 'approval_url') {
           $redirect_url = $link->getHref();
           break;
        }
      }
      
      /** إضافة معرف الدفع إلى الجلسة **/
      \Session::put('paypal_payment_id', $payment->getId());
if (isset($redirect_url)) {
         /** redirect to paypal **/
         return Redirect::away($redirect_url);
      }
  
      \Session::put('error', 'حدث خطأ');
      return Redirect::route('/');
    }
    
  
    public function getPaymentStatus(Request $request)
    {
      /** جلب معرف العملية من الجلسة **/
      $payment_id = Session::get('paypal_payment_id');
      
      /** حذف المعرف من الجلسة **/
      Session::forget('paypal_payment_id');
      
      if (empty($request->PayerID) || empty($request->token)) {
         session()->flash('error', 'فشل الدفع');
         return Redirect::route('/');
      }
      
      $payment = Payment::get($payment_id, $this->_api_context);
      
      $execution = new PaymentExecution();
      
      $execution->setPayerId($request->PayerID);
      
      /**تنفيذ العملية **/
      $result = $payment->execute($execution, $this->_api_context);
      
      if ($result->getState() == 'approved') {
         session()->flash('success', 'نجح الدفع');
         return Redirect::route('/');
      }
      
      session()->flash('error', 'فشل الدفع');
      
      return Redirect::route('/');
    }
}

و بالطبع فإننا سنحتاج تعريف مسارين : 

  • واحد للدفع .
  • واحد لتتبع مسار أو حالة الدفع .

و ليكن : 

Route::post('/payment', ['as' => 'payment', 'uses' => 'PaymentController@payWithpaypal']);
Route::get('/payment/status',['as' => 'status', 'uses' => 'PaymentController@getPaymentStatus']);

حيث يتم إرسال طلب POST بمعلومات العنصر + تفاصيل عملية الدفع , ثم طلب GET لجلب حالة الدفع .

و هذا هو الشكل الأبسط لعملية الدفع عبر بيبال , و بالطبع فإنه يمكن تخصيصها على نطاق واسع و إضافة الكثير من التفاصيل , كأن نقوم بحفظ تفاصيل العملية في قواعد البيانات لدينا و هكذا . 

كما يمكن أيضا إستخدام أحد الحزم التي تلخص العملية أكثر , من مثل حزمة srmklive/laravel-paypal .

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 59 دقائق مضت قال Adnane Kadri:

ستحتاج أولا التسجيل بحساب تجاري في بيبال .ثم سنحتاج الدخول إلى لوحة تحكم المطور , أين يمكنك التعرف على نمطين و حسابين  :

  • حساب تجريبي , أو حساب sandbox (لأغراض الإختبار و التطوير).
  • حساب حي , أو حساب live (لأغراض الدفع و التعامل الحقيقي) .
  1. سنقوم بتثبيت مكتبة paypal/rest-api-sdk-php عن طريق مدير الحزم composer : 

composer install paypal/rest-api-sdk-php

   2. لنقم بإنشاء ملف إعداد paypal.php في مجلد config , و لنتأكد من إمتلاكه المحتوى التالي :


<?php 
return [ 
    'client_id' => env('PAYPAL_CLIENT_ID',''),
    'secret' => env('PAYPAL_SECRET',''),
    'settings' => array(
        'mode' => env('PAYPAL_MODE','sandbox'),
        'http.ConnectionTimeOut' => 30,
        'log.LogEnabled' => true,
        'log.FileName' => storage_path() . '/logs/paypal.log',
        'log.LogLevel' => 'ERROR'
    ),
];

   3. لنتوجه إلى ملف البيئة env. و لنتأكد من تعريف المتغيرات التالية : 


PAYPAL_CLIENT_ID=xxxxxxxxx
PAYPAL_SECRET=xxxxxxxxx
PAYPAL_MODE=xxxx

حيث أن المتغيرين PAYPAL_CLIENT_ID و PAYPAL_SECRET يجلبان من لوحة تحكم المطور . 

  4. لنقم بإنشاء متحكم PaymentController يلخص بعض العمليات و لنتأكد من إمتلاكه المحتوى التالي :  


<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\Plan;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\PayerInfo;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Amount;
use PayPal\Api\Transaction;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use Illuminate\Support\Facades\Input;
use Redirect;
use URL;

class PaymentController extends Controller
{
    public function __construct()
    {
         /** إعداد سياق العملية و بدءها **/
         $paypal_conf = \Config::get('paypal');
      
         $this->_api_context = new ApiContext(new OAuthTokenCredential(
             $paypal_conf['client_id'],
             $paypal_conf['secret']) 
         );
         
         // حفظ الاعدادات
         $this->_api_context->setConfig($paypal_conf['settings']);
    }
    
    public function payWithpaypal()
    {
      $amountToBePaid = 100; // قيمة افتراضية يفترض أن تستجلب من الطلب
      
      $payer = new Payer();
      
      $payer->setPaymentMethod('paypal');
      
      /*تعريف عنصر*/
      $item_1 = new Item();
      $item_1->setName('هاتف نقال') /** اسم العنصر **/
              ->setCurrency('USD')
              ->setQuantity(1)
              ->setPrice($amountToBePaid); /** سعر العنصر **/
      
      /*تعريف قائمة عناصر و إضافة العنصر المعرف سابقا*/
      $item_list = new ItemList();
      $item_list->setItems(array($item_1));
      
      
      /*تعريف مقدار*/
      $amount = new Amount();
      $amount->setCurrency('USD')
             ->setTotal($amountToBePaid);
      
      /** تخصيص روابط إعادة **/
      $redirect_urls = new RedirectUrls();
      
      $redirect_urls->setReturnUrl(URL::route('status'))
                ->setCancelUrl(URL::route('status'));
      
      /*تعريف تحويل جديد*/
      $transaction = new Transaction();
      $transaction->setAmount($amount)
              ->setItemList($item_list)
              ->setDescription('وصف التحويل');   
      
      /*تعريف مدفوعة و إضافة عملية الدفع إليها*/
      $payment = new Payment();
      $payment->setIntent('Sale')
              ->setPayer($payer)
              ->setRedirectUrls($redirect_urls)
              ->setTransactions(array($transaction));
      
      /*تنفيذ العملية*/ 
      try {
           $payment->create($this->_api_context);
      } catch (\PayPal\Exception\PPConnectionException $ex) {
           if (\Config::get('app.debug')) {
              \Session::put('error', 'فشل الاتصال تحقق من الاتصال');
              return Redirect::route('/');
           } else {
              \Session::put('error', 'حدث خطأ');
              return Redirect::route('/');
           }
      }
      
     foreach ($payment->getLinks() as $link) {
        if ($link->getRel() == 'approval_url') {
           $redirect_url = $link->getHref();
           break;
        }
      }
      
      /** إضافة معرف الدفع إلى الجلسة **/
      \Session::put('paypal_payment_id', $payment->getId());
if (isset($redirect_url)) {
         /** redirect to paypal **/
         return Redirect::away($redirect_url);
      }
  
      \Session::put('error', 'حدث خطأ');
      return Redirect::route('/');
    }
    
  
    public function getPaymentStatus(Request $request)
    {
      /** جلب معرف العملية من الجلسة **/
      $payment_id = Session::get('paypal_payment_id');
      
      /** حذف المعرف من الجلسة **/
      Session::forget('paypal_payment_id');
      
      if (empty($request->PayerID) || empty($request->token)) {
         session()->flash('error', 'فشل الدفع');
         return Redirect::route('/');
      }
      
      $payment = Payment::get($payment_id, $this->_api_context);
      
      $execution = new PaymentExecution();
      
      $execution->setPayerId($request->PayerID);
      
      /**تنفيذ العملية **/
      $result = $payment->execute($execution, $this->_api_context);
      
      if ($result->getState() == 'approved') {
         session()->flash('success', 'نجح الدفع');
         return Redirect::route('/');
      }
      
      session()->flash('error', 'فشل الدفع');
      
      return Redirect::route('/');
    }
}

و بالطبع فإننا سنحتاج تعريف مسارين : 

  • واحد للدفع .
  • واحد لتتبع مسار أو حالة الدفع .

و ليكن : 


Route::post('/payment', ['as' => 'payment', 'uses' => 'PaymentController@payWithpaypal']);
Route::get('/payment/status',['as' => 'status', 'uses' => 'PaymentController@getPaymentStatus']);

حيث يتم إرسال طلب POST بمعلومات العنصر + تفاصيل عملية الدفع , ثم طلب GET لجلب حالة الدفع .

و هذا هو الشكل الأبسط لعملية الدفع عبر بيبال , و بالطبع فإنه يمكن تخصيصها على نطاق واسع و إضافة الكثير من التفاصيل , كأن نقوم بحفظ تفاصيل العملية في قواعد البيانات لدينا و هكذا . 

كما يمكن أيضا إستخدام أحد الحزم التي تلخص العملية أكثر , من مثل حزمة srmklive/laravel-paypal .

شكرا كثيرا لك ولكن هل من الممكن ان ترسل لي ايضا الخطوات عندما استخدم حزمةsrmklive/laravel-paypal

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
بتاريخ 7 ساعات قال Hafsa Aly:

شكرا كثيرا لك ولكن هل من الممكن ان ترسل لي ايضا الخطوات عندما استخدم حزمةsrmklive/laravel-paypal

خطوات لتثبيت الحزمة srmklive/laravel-paypal.

أولا تنصيبها في المشروع وذلك حسب إصدار لارافل:

For Laravel 5.1 to 5.8   قدمة
composer require srmklive/paypal:~2.0

							
For Laravel 6, 7, & 8    أحدث
composer require srmklive/paypal:~3.0

ثم الأمر: لنشر الملفات

php artisan vendor:publish --provider "Srmklive\PayPal\Providers\PayPalServiceProvider"

ثم نحدد إعدادات الاتصال مع خدمة باي بال حسب بيانات المستخدم المسجل في الخدمة ونضع البيانات في الملف env.

مثل نمط التشغيل (تجريبي أو حقيقي) ورقم العميل المعرف و كلمة السر (رموز الاشتراك بالخدمة)

 .env file

#PayPal API Mode
# Values: sandbox or live (Default: live)
PAYPAL_MODE=

#PayPal Setting & API Credentials - sandbox
PAYPAL_SANDBOX_CLIENT_ID=
PAYPAL_SANDBOX_CLIENT_SECRET=

#PayPal Setting & API Credentials - live
PAYPAL_LIVE_CLIENT_ID=
PAYPAL_LIVE_CLIENT_SECRET=

ثم في مجلد config folder نعدل الملف paypal.php لضبط الإعدادات أيضا نفس بيانات env  ولكن يمكن تحديد اللغة و العملية الافتراضية

<?php
return [
    'mode'    => env('PAYPAL_MODE', 'sandbox'), // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
    'sandbox' => [
        'client_id'         => env('PAYPAL_SANDBOX_CLIENT_ID', ''),
        'client_secret'     => env('PAYPAL_SANDBOX_CLIENT_SECRET', ''),
        'app_id'            => 'APP-80W284485P519543T',
    ],
    'live' => [
        'client_id'         => env('PAYPAL_LIVE_CLIENT_ID', ''),
        'client_secret'     => env('PAYPAL_LIVE_CLIENT_SECRET', ''),
        'app_id'            => '',
    ],

    'payment_action' => env('PAYPAL_PAYMENT_ACTION', 'Sale'), // Can only be 'Sale', 'Authorization' or 'Order'
    'currency'       => env('PAYPAL_CURRENCY', 'USD'),
    'notify_url'     => env('PAYPAL_NOTIFY_URL', ''), // Change this accordingly for your application.
    'locale'         => env('PAYPAL_LOCALE', 'en_US'), // force gateway language  i.e. it_IT, es_ES, en_US ... (for express checkout only)
    'validate_ssl'   => env('PAYPAL_VALIDATE_SSL', true), // Validate SSL when creating api client.
];

والاستخدام:

  • تضمين الصنف
  • إنشاء غرض
  • التشغيل
// Import the class namespaces first, before using it directly
use Srmklive\PayPal\Services\PayPal as PayPalClient;

$provider = new PayPalClient;

// Through facade. No need to import namespaces
$provider = \PayPal::setProvider();

ثم لضبط إعدادات API :

setApiCredentials

$config = [
    'mode'    => 'live',
    'live' => [
        'client_id'         => 'some-client-id',
        'client_secret'     => 'some-client-secret',
        'app_id'            => 'APP-80W284485P519543T',
    ],

    'payment_action' => 'Sale',
    'currency'       => 'USD',
    'notify_url'     => 'https://your-app.com/paypal/notify',
    'locale'         => 'en_US',
    'validate_ssl'   => true,
];

$provider->setApiCredentials($config);

لتغيير العملة:

$provider->setCurrency('EUR');

وللحصول على Token: 

$provider->getAccessToken();

وبنية الفاتورة كالتالي: تحوي العملة و قيمة المبلغ

$provider->createOrder([
  "intent"=> "CAPTURE",
  "purchase_units"=> [
      0 => [
          "amount"=> [
              "currency_code"=> "USD",
              "value"=> "100.00"
          ]
      ]
  ]
]);

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن