تكامل SDK Ping++ مع إطار عمل CodeIgniter | أصلي، ترجم بواسطة AI
مقدمة
يقدم هذا المثال الكامل، خطوة بخطوة، كيفية دمج Pingpp (Ping++)، SDK معالجة الدفع، في تطبيق PHP باستخدام إطار عمل CodeIgniter بناءً على فئة BaseController
المقدمة. يركز هذا الدليل على دمج Pingpp لمعالجة الدفع، مثل السماح للمستخدمين بالدفع عبر Alipay PC Direct (بإمكانك تعديلها لغيرها من القنوات).
متطلبات مسبقة
- حساب Pingpp: سجل في Ping++ واحصل على مفتاح API و معرف التطبيق. ستحصل على مفتاح اختبار (
sk_test_...
) للتنمية ومفتاح حيّ (sk_live_...
) للإنتاج. - SDK PHP Pingpp: قم بتثبيت SDK PHP Pingpp عبر Composer:
composer require pingplusplus/pingpp-php
تأكد من تحميل SDK تلقائيًا في تطبيق CodeIgniter (على سبيل المثال، وضعه في
application/libraries
أو تكوين تحميل Composer). - إعداد 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();
}
}
- استبدل
'sk_test_your_test_key_here'
و'sk_live_your_live_key_here'
بمفتاحات API Pingpp الفعلية. - تأكد من أن
UserDao
وChargeDao
تم تنفيذها لتسيير تصديق المستخدم و تخزين الشحنات (انظر الخطوة 2).
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(); // معرف فريد بسيط؛ استبدل بمولد أكثر قوة إذا لزم الأمر
}
- استبدل
'app_your_test_app_id'
و'app_your_live_app_id'
بمعرفات تطبيق Pingpp. - قم بتعديل
'success_url'
إلى URL صفحة النجاح الخاصة بك.
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);
}
- أضف طريقة
updateStatus
إلىChargeDao
لتحديث حالة الشحن. - قم بتكوين URL الويب هووك في لوحة تحكم Pingpp (على سبيل المثال،
http://yourdomain.com/payment/webhook
).
استخدام مثال كامل
- عملية المستخدم: يقوم المستخدم بتسجيل الدخول ويبدأ عملية الدفع عبر طلب POST إلى
/payment/checkout
. - رد الخادم: يخلق الخادم شحنًا ويعيد كائن JSON مع تفاصيل الدفع.
- معالجة العميل: يعيد توجيه العميل إلى صفحة الدفع Alipay.
- إكمال الدفع: بعد الدفع، يُعاد توجيه المستخدم إلى URL النجاح.
- تحديث الويب هووك: يبعث Pingpp إلى نقطة نهاية الويب هووك الخاصة بك وتحديث حالة الشحن.
ملاحظات إضافية
- قنوات الدفع: استبدل
'alipay_pc_direct'
بغيرها من القنوات (على سبيل المثال،'wx'
لـ WeChat) حسب الحاجة. راجع توثيق Pingpp للحصول على متطلباتextra
الخاصة بالقنوات. - معالجة الأخطاء: تحسين معالجة الأخطاء للإنتاج (على سبيل المثال، منطق إعادة المحاولة، رسائل خطأ مفصلة).
- الأمن: تحقق من إدخال المستخدم (
$amount
، إلخ.) و تأمين نقاط نهاية API الخاصة بك.
يقدم هذا المثال أساسًا صلبًا لتكامل Pingpp في تطبيق CodeIgniter الخاص بك، قابل للتكيف مع مختلف الحالات مثل التجارة الإلكترونية أو التبرعات.