SDK الدفع (V3)

عنوان المشروع

https://github.com/yansongda/pay

التثبيت

composer require yansongda/pay ~3.0

الاستخدام

ملاحظة: يتم كتابة الوثائق بناءً على بيئة sandbox الخاصة بـ Alipay، إذا كان هناك أي مشكلة، يرجى إبلاغنا بذلك!

ملف الإعداد

افترض وجود ملف الإعداد التالي config/payment.php

<?php
/**
 * @desc ملف إعدادات الدفع
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '_force' => true, // ملاحظة، يجب أن تكون هذه true
    'alipay' => [
        'default' => [
            // مطلوب - app_id المخصص من Alipay
            'app_id' => '20160909004708941',
            // مطلوب - مفتاح التطبيق الخاص، سلسلة أو مسار
            'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
            // مطلوب - مسار شهادة المفتاح العام للتطبيق
            'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
            // مطلوب - مسار شهادة المفتاح العام لـ Alipay
            'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
            // مطلوب - مسار شهادة الجذر لـ Alipay
            'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
            // اختياري - عنوان رد الاتصال المتزامن
            'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
            // اختياري - عنوان رد الاتصال غير المتزامن
            'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
            // اختياري - معرف مزود الخدمة في وضع مزود الخدمة، يتم استخدام هذا المعامل عند وجود mode كـ Pay::MODE_SERVICE
            'service_provider_id' => '',
            // اختياري - الوضع الافتراضي هو الوضع العادي. الخيارات المتاحة: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // مطلوب - رقم التاجر، في وضع مزود الخدمة يكون رقم تاجر المزود
            'mch_id' => '',
            // مطلوب - مفتاح التاجر
            'mch_secret_key' => '',
            // مطلوب - مفتاح التاجر الخاص، سلسلة أو مسار
            'mch_secret_cert' => '',
            // مطلوب - مسار شهادة المفتاح العام للتاجر
            'mch_public_cert_path' => '',
            // مطلوب
            'notify_url' => 'https://yansongda.cn/wechat/notify',
            // اختياري - app_id لميني برانش
            'mp_app_id' => '2016082000291234',
            // اختياري - app_id لميني برانش
            'mini_app_id' => '',
            // اختياري - app_id للتطبيق
            'app_id' => '',
            // اختياري - app_id للدمج
            'combine_app_id' => '',
            // اختياري - رقم التاجر للدمج
            'combine_mch_id' => '',
            // اختياري - app_id لفرع الميني برانش في وضع مزود الخدمة
            'sub_mp_app_id' => '',
            // اختياري - app_id لفرع التطبيق في وضع مزود الخدمة
            'sub_app_id' => '',
            // اختياري - app_id لفرع الميني برانش في وضع مزود الخدمة
            'sub_mini_app_id' => '',
            // اختياري - ID التاجر الفرعي في وضع مزود الخدمة
            'sub_mch_id' => '',
            // اختياري - مسار شهادة المفتاح العام لـ WeChat، اختياري، يُنصح بشدة بتكوين هذه المعلمة في وضع php-fpm
            'wechat_public_cert_path' => [
                '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
            ],
            // اختياري - الوضع الافتراضي هو الوضع العادي. الخيارات المتاحة: MODE_NORMAL, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'logger' => [
        'enable' => false,
        'file' => runtime_path().'/logs/alipay.log',
        'level' => 'debug', // يُنصح بتعديل مستوى الإنتاج إلى info، ولبيئة التطوير إلى debug
        'type' => 'single', // اختياري، يمكن أن تكون daily.
        'max_file' => 30, // اختياري، ساري المفعول عند استخدام type كـ daily، الافتراضي هو 30 يوم
    ],
    'http' => [ // اختياري
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // لمزيد من خيارات الإعداد، يرجى الرجوع إلى [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
    ]
];

ملاحظة: ليس هناك قاعدة محددة لمجلد الشهادات، المثال أعلاه يضعها في مجلد payment الخاص بالإطار

├── payment
│   ├── alipayCertPublicKey_RSA2.crt
│   ├── alipayRootCert.crt
│   └── appCertPublicKey_2016090900470841.crt

التهيئة

قم باستدعاء طريقة config مباشرةً للتهيئة

// الحصول على ملف الإعدادات config/payment.php
$config = config('payment');
Pay::config($config);

ملاحظة: إذا كنت تستخدم وضع sandbox الخاص بـ Alipay، تأكد من تفعيل ملف الإعدادات 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,، تكون هذه الخيار الافتراضي هو الوضع العادي.

الدفع (الويب)

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @param Request $request
 * @return string
 */
public function payment(Request $request)
{
    // 1. تهيئة الإعدادات
    Pay::config(config('payment'));

    // 2. الدفع عبر الويب
    $order = [
        'out_trade_no' => time(),
        'total_amount' => '8888.88',
        'subject' => 'دفع ويبمان',
        '_method' => 'get' // استخدام طريقة get للانتقال
    ];
    return Pay::alipay()->web($order)->getBody()->getContents();
}

رد الاتصال غير المتزامن

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @desc: إشعار غير متزامن لـ『Alipay』
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. تهيئة الإعدادات
    Pay::config(config('payment'));

    // 2. معالجة رد الاتصال لـ Alipay
    $result = Pay::alipay()->callback($request->post());

    // ===================================================================================================
    // يرجى التحقق من trade_status وكذلك أي منطق آخر، فقط عندما يكون حالة إشعار المعاملة TRADE_SUCCESS أو TRADE_FINISHED، ستعترف Alipay بأن المشتري قد قام بالدفع بنجاح.
    // 1. يحتاج التاجر للتحقق مما إذا كانت بيانات الإشعار تحتوي على out_trade_no الذي تم إنشاؤه في نظام التاجر؛
    // 2. تحقق مما إذا كان total_amount هو فعلاً المبلغ الفعلي لهذه المعاملة (أي المبلغ عند إنشاء الطلب من قبل التاجر)؛
    // 3. تحقق من seller_id (أو seller_email) في الإشعار للتأكد من أنها تتوافق مع الطرف المشغل لـ out_trade_no؛
    // 4. تحقق مما إذا كانت app_id هي نفسها الخاصة بالتاجر.
    // 5. حالات منطق العمل الأخرى
    // ===================================================================================================

    // 5. معالجة رد الاتصال لـ Alipay
    return new Response(200, [], 'success');
}

ملاحظة: لا يمكنك استخدام مكون الإضافة نفسه return Pay::alipay()->success(); للرد على رد الاتصال من Alipay، إذا كنت تستخدم الوسطاء، قد يحدث مشاكل. لذلك، تحتاج للرد على Alipay من خلال فئة الاستجابة الخاصة بـ webman support\Response;

رد الاتصال المتزامن

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @desc: إشعار متزامن لـ『Alipay』
 * @param Request $request
 * @author Tinywan(ShaoBo Wan)
 */
public function alipayReturn(Request $request)
{
    Log::info('إشعار متزامن لـ『Alipay』'.json_encode($request->get()));
    return 'success';
}

المزيد من المحتوى

زيارة الوثائق الرسمية https://pay.yansongda.cn/docs/v3/