اذهب إلى المحتوى
  • 0

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

Hafsa Aly

السؤال

السلام عليكم

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

تم التعديل في بواسطة Adnane Kadri
توضيح السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 24 دقائق مضت قال Ziyad Hasan:

لم افهم .. والرابط لايعمل

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

  • 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

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

  • 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"
          ]
      ]
  ]
]);

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...