تكامل SDK Ping++ مع إطار عمل CodeIgniter | أصلي، ترجم بواسطة AI

Home PDF

مقدمة

يقدم هذا المثال الكامل، خطوة بخطوة، كيفية دمج Pingpp (Ping++)، SDK معالجة الدفع، في تطبيق PHP باستخدام إطار عمل CodeIgniter بناءً على فئة BaseController المقدمة. يركز هذا الدليل على دمج Pingpp لمعالجة الدفع، مثل السماح للمستخدمين بالدفع عبر Alipay PC Direct (بإمكانك تعديلها لغيرها من القنوات).


متطلبات مسبقة

  1. حساب Pingpp: سجل في Ping++ واحصل على مفتاح API و معرف التطبيق. ستحصل على مفتاح اختبار (sk_test_...) للتنمية ومفتاح حيّ (sk_live_...) للإنتاج.
  2. SDK PHP Pingpp: قم بتثبيت SDK PHP Pingpp عبر Composer:
    composer require pingplusplus/pingpp-php
    

    تأكد من تحميل SDK تلقائيًا في تطبيق CodeIgniter (على سبيل المثال، وضعه في application/libraries أو تكوين تحميل Composer).

  3. إعداد CodeIgniter: يجب أن يكون لديك تطبيق CodeIgniter يعمل مع محكم ونماذج قاعدة البيانات للمستخدمين والشحنات.

دمج خطوة بخطوة

1. إعداد المحكم

إنشاء محكم (على سبيل المثال، PaymentController.php) يمدد محكمًا أساسيًا مشابهًا لـ BaseController. قم بتكوين مفتاح API Pingpp في البناء بناءً على بيئتك (التنمية أو الإنتاج).

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require_once APPPATH . '/libraries/REST_Controller.php';
require_once APPPATH . '/vendor/autoload.php'; // افترض تحميل Composer

class PaymentController extends REST_Controller {

    public $userDao;
    public $chargeDao;

    public function __construct() {
        parent::__construct();

        // تعيين مفتاح API Pingpp بناءً على البيئة
        $isLocalDebug = ENVIRONMENT === 'development'; // بيئة CodeIgniter
        if ($isLocalDebug) {
            \Pingpp\Pingpp::setApiKey('sk_test_your_test_key_here'); // استبدال بمفتاح الاختبار الخاص بك
        } else {
            \Pingpp\Pingpp::setApiKey('sk_live_your_live_key_here'); // استبدال بمفتاح الإنتاج الخاص بك
        }

        // تحميل النماذج
        $this->load->model('UserDao');
        $this->userDao = new UserDao();
        $this->load->model('ChargeDao');
        $this->chargeDao = new ChargeDao();
    }
}

2. إنشاء النماذج الداعمة

ستمحتك نماذج لإدارة جلسات المستخدم و تخزين تفاصيل الشحن.

UserDao.php (مثال مبسط):

<?php
class UserDao extends CI_Model {
    public function findUserBySessionToken($token) {
        $query = $this->db->get_where('users', ['session_token' => $token]);
        return $query->row(); // يعيد كائن المستخدم أو `null`
    }
}

ChargeDao.php (مثال مبسط):

<?php
class ChargeDao extends CI_Model {
    public function add($orderNo, $amount, $userId, $ipAddress) {
        $data = [
            'order_no' => $orderNo,
            'amount' => $amount,
            'user_id' => $userId,
            'client_ip' => $ipAddress,
            'status' => 'pending',
            'created_at' => date('Y-m-d H:i:s')
        ];
        $this->db->insert('charges', $data);
    }
}

إنشاء جداول قاعدة البيانات (users و charges) مع الحقول المناسبة.

3. تنفيذ طريقة إنشاء الشحن

أضف طريقة لإنشاء شحن Pingpp و إرجاعه إلى العميل. يستخدم هذا المثال Alipay PC Direct كقناة الدفع.

public function createChargeThenResponse($amount, $subject, $body, $metaData, $user) {
    // إنشاء رقم طلب فريد
    $orderNo = $this->generateOrderNo();

    // تعيين معرف التطبيق بناءً على البيئة
    $isLocalDebug = ENVIRONMENT === 'development';
    $appId = $isLocalDebug ? 'app_your_test_app_id' : 'app_your_live_app_id';

    // الحصول على عنوان IP العميل
    $ipAddress = $this->input->ip_address();
    if ($ipAddress === '::1') { // معالجة حالة الاختبار المحلي
        $ipAddress = '127.0.0.1';
    }

    // إنشاء الشحن
    try {
        $charge = \Pingpp\Charge::create([
            'order_no' => $orderNo,
            'app' => ['id' => $appId],
            'channel' => 'alipay_pc_direct', // استبدل هذا لغيره من القنوات (على سبيل المثال، `'wx'` لـ WeChat)
            'amount' => $amount, // بالسنتمات (على سبيل المثال، 1000 = 10 CNY)
            'client_ip' => $ipAddress,
            'currency' => 'cny',
            'subject' => $subject,
            'body' => $body,
            'metadata' => $metaData,
            'extra' => [
                'success_url' => 'http://yourdomain.com/payment/success' // استبدل بURL الصفحة الناجحة الخاصة بك
            ]
        ]);

        // تخزين تفاصيل الشحن في قاعدة البيانات
        $this->chargeDao->add($orderNo, $amount, $user->id, $ipAddress);

        // إرجاع كائن الشحن كJSON
        $this->output
            ->set_status_header(200)
            ->set_content_type('application/json', 'utf-8')
            ->set_output(json_encode($charge));
    } catch (\Pingpp\Error\Base $e) {
        log_message('error', 'فشل شحن Pingpp: ' . $e->getMessage());
        $this->response(['error' => 'فشل إنشاء الدفع'], 500);
    }
}

private function generateOrderNo() {
    return uniqid(); // معرف فريد بسيط؛ استبدل بمولد أكثر قوة إذا لزم الأمر
}

4. إنشاء طريقة الدفع

أضف طريقة عامة لتسيير عملية الدفع للمستخدم، مع استدعاء طريقة إنشاء الشحن.

public function checkout_post() {
    // التحقق من تسجيل الدخول للمستخدم
    $user = $this->getSessionUser();
    if (!$user) {
        $this->response(['error' => 'المستخدم غير مسجل الدخول'], 401);
        return;
    }

    // تفاصيل الطلب المثالية
    $amount = 1000; // 10 CNY (مثال؛ حسبها ديناميكيًا في تطبيق حقيقي)
    $subject = 'دفع الطلب';
    $body = 'دفع للطلب #123';
    $metaData = ['order_id' => '123']; // ملحق بيانات محددة بالطلب

    // إنشاء الشحن وإرجاع الرد
    $this->createChargeThenResponse($amount, $subject, $body, $metaData, $user);
}

private function getSessionUser() {
    $token = $this->input->get_request_header('Authorization', TRUE); // تعديل بناءً على طريقة تصديقك
    if ($token) {
        return $this->userDao->findUserBySessionToken($token);
    }
    return null;
}

5. معالجة الرد من جانب العميل

تعود طريقة createChargeThenResponse كائن charge JSON. بالنسبة لـ alipay_pc_direct، يتضمن حقل credential مع URL الدفع. قم بمعالجته من جانب العميل (على سبيل المثال، باستخدام JavaScript).

مثال (JavaScript من جانب العميل):

fetch('/payment/checkout', {
    method: 'POST',
    headers: { 'Authorization': 'your-session-token' }
})
.then(response => response.json())
.then(charge => {
    if (charge.credential && charge.credential.alipay_pc_direct) {
        window.location.href = charge.credential.alipay_pc_direct; // إعادة توجيه إلى Alipay
    } else {
        console.error('خطأ في الدفع:', charge);
    }
})
.catch(error => console.error('خطأ:', error));

6. صفحة النجاح

إنشاء صفحة النجاح (على سبيل المثال، payment/success) لعرض تأكيد بعد الدفع. قم بتحديث حالة الطلب يدويًا هنا إذا لزم الأمر، على الرغم من أن توصيات الويب هووك هي أفضل (انظر الخطوة 7).

public function success_get() {
    // التحقق من حالة الدفع هنا (اختياري)
    $this->load->view('payment_success'); // تحميل عرض
}

7. (اختياري) معالجة الويب هووك

يرسل Pingpp تحديثات حالة الدفع بشكل غير متزامن عبر الويب هووك. قم بإنشاء نقطة نهاية لاستقبال هذه الإشعارات وتحديث قاعدة البيانات.

public function webhook_post() {
    $rawData = file_get_contents('php://input');
    $event = json_decode($rawData, true);

    if ($event['type'] === 'charge.succeeded') {
        $charge = $event['data']['object'];
        $orderNo = $charge['order_no'];
        $this->chargeDao->updateStatus($orderNo, 'paid');
    }

    $this->response(['status' => 'ok'], 200);
}

استخدام مثال كامل

  1. عملية المستخدم: يقوم المستخدم بتسجيل الدخول ويبدأ عملية الدفع عبر طلب POST إلى /payment/checkout.
  2. رد الخادم: يخلق الخادم شحنًا ويعيد كائن JSON مع تفاصيل الدفع.
  3. معالجة العميل: يعيد توجيه العميل إلى صفحة الدفع Alipay.
  4. إكمال الدفع: بعد الدفع، يُعاد توجيه المستخدم إلى URL النجاح.
  5. تحديث الويب هووك: يبعث Pingpp إلى نقطة نهاية الويب هووك الخاصة بك وتحديث حالة الشحن.

ملاحظات إضافية

يقدم هذا المثال أساسًا صلبًا لتكامل Pingpp في تطبيق CodeIgniter الخاص بك، قابل للتكيف مع مختلف الحالات مثل التجارة الإلكترونية أو التبرعات.


Back 2025.04.02 Donate