SDK Thanh Toán (V3)
Địa chỉ dự án
https://github.com/yansongda/pay
Cài đặt
composer require yansongda/pay ~3.0
Sử dụng
Lưu ý: Tài liệu này được viết dựa trên môi trường thử nghiệm của Alipay, nếu có vấn đề gì, hãy phản hồi kịp thời nhé!
Tệp cấu hình
Giả sử có tệp cấu hình sau config/payment.php
<?php
/**
* @desc Tệp cấu hình thanh toán
* @author Tinywan(ShaoBo Wan)
* @date 2022/03/11 20:15
*/
return [
'_force' => true, // Lưu ý, điều này phải là true
'alipay' => [
'default' => [
// Bắt buộc - app_id được phân phối bởi Alipay
'app_id' => '20160909004708941',
// Bắt buộc - khóa bí mật của ứng dụng, chuỗi hoặc đường dẫn
'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
// Bắt buộc - đường dẫn đến chứng chỉ công khai của ứng dụng
'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
// Bắt buộc - đường dẫn đến chứng chỉ công khai của Alipay
'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
// Bắt buộc - đường dẫn đến chứng chỉ gốc của Alipay
'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
// Tùy chọn - địa chỉ gọi lại đồng bộ
'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
// Tùy chọn - địa chỉ gọi lại bất đồng bộ
'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
// Tùy chọn - ID nhà cung cấp trong chế độ nhà cung cấp, khi mode là Pay::MODE_SERVICE
'service_provider_id' => '',
// Tùy chọn - mặc định là chế độ bình thường. Có thể chọn: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'wechat' => [
'default' => [
// Bắt buộc - mã thương gia, trong chế độ nhà cung cấp là mã thương gia của nhà cung cấp
'mch_id' => '',
// Bắt buộc - khóa bí mật của thương gia
'mch_secret_key' => '',
// Bắt buộc - khóa bí mật của thương gia, chuỗi hoặc đường dẫn
'mch_secret_cert' => '',
// Bắt buộc - đường dẫn đến chứng chỉ công khai của thương gia
'mch_public_cert_path' => '',
// Bắt buộc
'notify_url' => 'https://yansongda.cn/wechat/notify',
// Tùy chọn - app_id của tài khoản công khai
'mp_app_id' => '2016082000291234',
// Tùy chọn - app_id của mini program
'mini_app_id' => '',
// Tùy chọn - app_id của ứng dụng
'app_id' => '',
// Tùy chọn - app_id của hợp nhất
'combine_app_id' => '',
// Tùy chọn - mã thương gia của hợp nhất
'combine_mch_id' => '',
// Tùy chọn - app_id của tài khoản công khai con trong chế độ nhà cung cấp
'sub_mp_app_id' => '',
// Tùy chọn - app_id của app con trong chế độ nhà cung cấp
'sub_app_id' => '',
// Tùy chọn - app_id của mini program con trong chế độ nhà cung cấp
'sub_mini_app_id' => '',
// Tùy chọn - ID thương gia con trong chế độ nhà cung cấp
'sub_mch_id' => '',
// Tùy chọn - đường dẫn đến chứng chỉ công khai của WeChat, tùy chọn, rất khuyến nghị cấu hình tham số này trong chế độ php-fpm
'wechat_public_cert_path' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
],
// Tùy chọn - mặc định là chế độ bình thường. Có thể chọn: MODE_NORMAL, MODE_SERVICE
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
]
],
'logger' => [
'enable' => false,
'file' => runtime_path().'/logs/alipay.log',
'level' => 'debug', // Khuyến nghị điều chỉnh cấp độ thành info trong môi trường sản xuất, debug trong môi trường phát triển
'type' => 'single', // tùy chọn, có thể chọn daily.
'max_file' => 30, // tùy chọn, có hiệu lực khi type là daily, mặc định 30 ngày
],
'http' => [ // tùy chọn
'timeout' => 5.0,
'connect_timeout' => 5.0,
// Vui lòng tham khảo thêm các tùy chọn cấu hình tại [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
]
];
Lưu ý: Thư mục chứng chỉ không quy định, ví dụ trên được đặt trong thư mục
payment
của framework
├── payment
│ ├── alipayCertPublicKey_RSA2.crt
│ ├── alipayRootCert.crt
│ └── appCertPublicKey_2016090900470841.crt
Khởi tạo
Gọi trực tiếp phương thức config
để khởi tạo
// Lấy tệp cấu hình config/payment.php
$config = config('payment');
Pay::config($config);
Lưu ý: Nếu là chế độ thử nghiệm của Alipay, nhất định phải nhớ bật tùy chọn cấu hình
'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
, tùy chọn này mặc định là chế độ bình thường.
Thanh toán (trang web)
use support\Request;
use Yansongda\Pay\Pay;
/**
* @param Request $request
* @return string
*/
public function payment(Request $request)
{
// 1. Khởi tạo cấu hình
Pay::config(config('payment'));
// 2. Thanh toán trên trang web
$order = [
'out_trade_no' => time(),
'total_amount' => '8888.88',
'subject' => 'thanh toán webman',
'_method' => 'get' // Sử dụng phương thức get để chuyển hướng
];
return Pay::alipay()->web($order)->getBody()->getContents();
}
Gọi lại bất đồng bộ
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Thông báo bất đồng bộ từ 『Alipay』
* @param Request $request
* @return Response
*/
public function alipayNotify(Request $request): Response
{
// 1. Khởi tạo cấu hình
Pay::config(config('payment'));
// 2. Xử lý gọi lại từ Alipay
$result = Pay::alipay()->callback($request->post());
// ===================================================================================================
// Vui lòng tự xác thực trade_status và các logic khác, chỉ khi trạng thái thông báo giao dịch là TRADE_SUCCESS hoặc TRADE_FINISHED, Alipay mới xác định là người mua đã thanh toán thành công.
// 1、Thương gia cần xác thực dữ liệu thông báo có out_trade_no có phải là mã đơn hàng được tạo trong hệ thống của thương gia hay không;
// 2、Xác định total_amount có thực sự là số tiền thực tế của đơn hàng đó (tức là số tiền khi thương gia tạo đơn hàng);
// 3、Kiểm tra seller_id (hoặc seller_email) trong thông báo có phải là bên thực hiện giao dịch tương ứng với out_trade_no này hay không;
// 4、Xác thực app_id có phải là của thương gia này hay không.
// 5、Các trường hợp logic nghiệp vụ khác
// ===================================================================================================
// 5. Xử lý gọi lại từ Alipay
return new Response(200, [], 'success');
}
Lưu ý: Không thể sử dụng chính plugin
return Pay::alipay()->success();
để phản hồi khi Alipay gọi lại, nếu bạn sử dụng middleware sẽ gặp phải vấn đề với middleware. Vì vậy, để phản hồi Alipay, cần sử dụng lớp phản hồi của webmansupport\Response;
Gọi lại đồng bộ
use support\Request;
use Yansongda\Pay\Pay;
/**
* @desc: Thông báo đồng bộ từ 『Alipay』
* @param Request $request
* @author Tinywan(ShaoBo Wan)
*/
public function alipayReturn(Request $request)
{
Log::info('Thông báo đồng bộ từ 『Alipay』'.json_encode($request->get()));
return 'success';
}
Thêm nội dung
Truy cập tài liệu chính thức tại https://pay.yansongda.cn/docs/v3/