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 program
            '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 ของ mini program ย่อยในโหมดบริการ
            'sub_mini_app_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 เท่านั้น อลิเพย์จะถือว่าผู้ซื้อชำระเงินสำเร็จ
    // 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 หากคุณใช้ middleware จะเกิดปัญหาเกี่ยวกับ middleware ดังนั้นการตอบสนองต่อ 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/