Wallogit.com
2017 © Pedro Peláez
a easy of chinese payment php sdk
集成支付宝、微信、云闪付、抖音、快手、京东、拼多多、美团、苹果、华为支付的Composer包, (*1)
本项目支持多环境配置,通过配置文件和环境变量来管理不同环境的支付参数。, (*2)
本项目的Docker环境包含以下服务: 1. php-fpm: PHP 5.6运行环境 2. nginx: Web服务器 3. mysql: MySQL 5.7数据库服务, (*3)
在项目根目录执行以下命令构建Docker镜像:, (*4)
docker-compose build
docker-compose up -d
docker-compose down
docker-compose ps
docker-compose logs -f
服务启动后,可以通过以下方式访问项目: - 项目首页: http://localhost:8000 - 支付宝示例: http://localhost:8000/examples/alipay/alipay_demo.php - 微信支付示例: http://localhost:8000/examples/wxpay/wxpay_demo.php - 云闪付示例: http://localhost:8000/examples/cmbpay/cmbpay_demo.php - 抖音支付示例: http://localhost:8000/examples/douyinpay/douyinpay_demo.php - 快手支付示例: http://localhost:8000/examples/kuaishoupay/kuaishoupay_demo.php - 京东支付示例: http://localhost:8000/examples/jdpay/jdpay_demo.php - 拼多多支付示例: http://localhost:8000/examples/pinduoduopay/pinduoduopay_demo.php - 美团支付示例: http://localhost:8000/examples/meituanpay/meituanpay_demo.php - 苹果支付示例: http://localhost:8000/examples/applepay/applepay_demo.php - 华为支付示例: http://localhost:8000/examples/huaweipay/huawei_demo.php, (*5)
MySQL服务默认配置: - 端口: 3306 - 数据库名: easypay - 用户名: easypay - 密码: easypay - 根密码: root, (*6)
本系统为所有支付方式提供了完整的异步处理支持,确保支付回调能够快速响应并可靠处理。, (*7)
| 支付方式 | 异步支持 | 配置示例 |
|---|---|---|
| 支付宝 (alipay) | ✅ | start alipay |
| 微信支付 (wxpay) | ✅ | start wxpay |
| 华为支付 (huaweipay) | ✅ | start huaweipay |
| 苹果支付 (applepay) | ✅ | start applepay |
| 抖音支付 (douyinpay) | ✅ | start douyinpay |
| 快手支付 (kuaishoupay) | ✅ | start kuaishoupay |
| 京东支付 (jdpay) | ✅ | start jdpay |
| 拼多多支付 (pinduoduopay) | ✅ | start pinduoduopay |
| 美团支付 (meituanpay) | ✅ | start meituanpay |
| 云闪付 (cmbpay) | ✅ | start cmbpay |
前提条件 - 已安装Docker和Docker Compose, (*8)
启动步骤, (*9)
启动完整环境, (*10)
./docker-start.sh
查看状态, (*11)
./docker-status.sh
查看日志, (*12)
./docker-logs.sh
停止服务, (*13)
./docker-stop.sh
访问地址 - Web服务: http://localhost:8000 - MySQL: localhost:3306 (root/root) - Redis: localhost:6379, (*14)
macOS安装PHP, (*15)
# 使用Homebrew安装PHP brew install php # 验证安装 php -v
启动步骤
1. 安装依赖
bash
composer install, (*16)
启动异步处理, (*17)
./start_async.sh install ./start_async.sh start all
监控状态, (*18)
./start_async.sh monitor
编辑 config/async.php 配置文件:, (*19)
// 文件队列 (默认)
'queue_type' => 'file',
'file_queue' => [
'directory' => __DIR__ . '/../queue',
'max_size' => 100 * 1024 * 1024, // 100MB
],
// Redis队列
'queue_type' => 'redis',
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'database' => 0,
],
// 数据库队列
'queue_type' => 'database',
'database' => [
'host' => '127.0.0.1',
'port' => 3306,
'name' => 'easypay',
'user' => 'root',
'pass' => '',
'charset' => 'utf8mb4',
],
'retry' => [
'max_retries' => 3,
'delay_base' => 1,
'delay_multiplier' => 2,
'max_delay' => 300,
],
# 查看所有队列状态 php monitor_async.php # 查看特定支付方式状态 php monitor_async.php status wxpay # 清理失败任务 php monitor_async.php cleanup
# 查看异步处理日志 tail -f logs/async_queue/async.log # 查看特定支付方式日志 tail -f logs/alipay_async_error.log
# 测试所有支付方式 php tests/test_async_processor.php # 测试特定支付方式 php tests/test_async_processor.php alipay
easypay/ ├── callbacks/ # 支付回调处理器(已更新为异步) ├── src/Common/Payment/ # 异步处理器核心 │ └── AsyncProcessor.php # 通用异步处理器 ├── config/async.php # 异步处理配置 ├── queue/ # 文件队列存储 ├── logs/async_queue/ # 异步处理日志 ├── async_processor.php # 异步处理主脚本 ├── monitor_async.php # 监控脚本 ├── install_async.php # 安装脚本 ├── start_async.sh # 启动管理脚本 └── tests/ # 测试脚本
项目根目录下的config目录包含以下文件:, (*20)
config/ ├── config_loader.php # 配置加载器 ├── dev.php # 开发环境配置 ├── uat.php # 测试环境配置 └── prod.php # 生产环境配置
config_loader.php提供了一个简单的配置加载机制,可以根据当前环境自动加载对应的配置文件。, (*21)
// 引入配置加载器
require_once __DIR__ . '/config/config_loader.php';
// 获取配置项
$appId = config('alipay.app_id');
$notifyUrl = config('wxpay.notify_url');
// 获取所有配置
$allConfig = config()->getAll();
// 切换环境
config()->setEnv('prod');
默认情况下,配置加载器会使用dev环境的配置。你可以通过以下方式切换环境:, (*22)
APP_ENV:export APP_ENV=prod
config()->setEnv('uat');
配置文件中包含以下类型的参数:, (*23)
app_name: 应用名称debug: 是否开启调试模式app_id: 支付宝APPIDmerchant_private_key: 商户私钥alipay_public_key: 支付宝公钥notify_url: 异步回调URLreturn_url: 同步回调URLsign_type: 签名类型gateway_url: 支付宝网关URLapp_id: 微信公众号APPIDmch_id: 商户号key: API密钥cert_path: 证书路径key_path: 密钥路径notify_url: 支付回调URLgateway_url: 微信支付网关URL使用 Composer 安装:, (*24)
composer require ankewk/easypay
微信支付需要以下配置参数:, (*25)
$config = [
'app_id' => 'your-app-id', // 微信公众号APPID
'mch_id' => 'your-mch-id', // 商户号
'key' => 'your-api-key', // API密钥
'notify_url' => 'https://your-domain.com/callbacks/wxpay/wxpay_notify.php', // 支付回调URL
];
use Wxpay\Payment\WxPayService; $payService = new WxPayService($config);
$order = [
'out_trade_no' => 'TEST' . date('YmdHis'), // 商户订单号
'total_fee' => 1, // 订单金额,单位:分
'body' => '测试商品', // 商品描述
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], // 客户端IP
'trade_type' => 'JSAPI', // 支付类型
'openid' => 'user-openid', // 用户openid
];
$result = $payService->generatePayParams($order);
if ($result['success']) {
$payParams = $result['data']; // 支付参数,用于前端调起微信支付
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data']; // 订单信息
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "错误:" . $result['error'];
}
创建 callbacks/wxpay/wxpay_notify.php 文件处理微信支付回调:, (*26)
use Wxpay\Payment\WxPayService;
$payService = new WxPayService($config);
$result = $payService->handleNotify();
if ($result['success']) {
$response = $result['data'];
$response->send(); // 向微信支付平台发送成功响应
} else {
// 处理失败
file_put_contents('pay_notify_error.log', '错误:' . $result['error'] . '\n', FILE_APPEND);
}
微信支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*27)
# 启动微信支付异步处理 ./start_async.sh start wxpay # 查看微信支付状态 ./start_async.sh status wxpay
examples/wxpay/wxpay_demo.php 文件提供了微信支付的使用示例,你可以修改配置参数后直接运行测试。, (*28)
使用 Composer 安装:, (*29)
composer require ankewk/easypay
支付宝支付需要以下配置参数:, (*30)
$config = [
'app_id' => 'your-app-id', // 支付宝APPID
'private_key' => 'your-private-key', // 商户私钥
'alipay_public_key' => 'alipay-public-key', // 支付宝公钥
'notify_url' => 'https://your-domain.com/callbacks/alipay/alipay_notify.php', // 异步回调URL
'mode' => 'sandbox', // 可选,沙箱环境,正式环境请删除此参数
];
use Alipay\Payment\AlipayService; $payService = new AlipayService($config);
$order = [
'out_trade_no' => 'TEST' . date('YmdHis'), // 商户订单号
'total_amount' => 0.01, // 订单金额,单位:元
'subject' => '测试商品', // 商品标题
'body' => '测试商品描述', // 商品描述
'timeout_express' => '1h', // 订单超时时间
'return_url' => 'https://your-domain.com/return.php', // 同步回调URL
];
$result = $payService->pagePay($order);
if ($result['success']) {
// 支付页面重定向
echo $result['data'];
} else {
// 支付失败
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data']; // 订单信息
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "错误:" . $result['error'];
}
创建 callbacks/alipay/alipay_notify.php 文件处理支付宝支付回调:, (*31)
use Alipay\Payment\AlipayService;
$config = [
'app_id' => 'your-app-id', // 支付宝APPID
'private_key' => 'your-private-key', // 商户私钥
'alipay_public_key' => 'alipay-public-key', // 支付宝公钥
'notify_url' => 'https://your-domain.com/callbacks/alipay/alipay_notify.php', // 异步回调URL
];
$payService = new AlipayService($config);
// 获取回调数据
$data = $_POST;
$sign = $data['sign'];
unset($data['sign'], $data['sign_type']);
// 验证签名
$verifyResult = $payService->verifyNotify($data, $sign);
if ($verifyResult) {
// 签名验证成功
if ($data['trade_status'] == 'TRADE_SUCCESS') {
// 交易成功,处理订单
echo 'success';
} else {
echo 'success';
}
} else {
// 签名验证失败
file_put_contents('alipay_notify_error.log', '签名验证失败: ' . json_encode($data) . '\n', FILE_APPEND);
echo 'fail';
}
支付宝支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*32)
# 启动支付宝支付异步处理 ./start_async.sh start alipay # 查看支付宝支付状态 ./start_async.sh status alipay
examples/alipay/alipay_demo.php 文件提供了支付宝支付的使用示例,你可以修改配置参数后直接运行测试。, (*33)
使用 Composer 安装:, (*34)
composer require ankewk/easypay
抖音支付需要以下配置参数:, (*35)
$config = [
'app_id' => 'your-app-id', // 抖音应用APPID
'merchant_id' => 'your-merchant-id', // 商户号
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 抖音公钥
'notify_url' => 'https://your-domain.com/callbacks/douyinpay/douyin_notify.php', // 支付回调URL
'gateway_url' => 'https://pay-api.douyin.com', // 抖音支付网关URL
];
use Douyinpay\Payment\DouyinPayService; $payService = new DouyinPayService($config);
$order = [
'out_trade_no' => 'DY' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '抖音支付测试商品描述', // 订单描述
'time_expire' => date('Y-m-d H:i:s', strtotime('+30 minutes')), // 订单过期时间
'product_id' => '123456', // 商品ID
];
$result = $payService->unifiedOrder($order);
if ($result['code'] === 0) {
echo "下单成功";
$qrCode = $result['data']['qr_code']; // 二维码链接
$prepayId = $result['data']['prepay_id']; // 预支付交易会话标识
} else {
echo "下单失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['code'] === 0) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_state'];
} else {
echo "查询失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->closeOrder($outTradeNo);
if ($result['code'] === 0) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['message'];
}
抖音支付的异步通知处理请参考:callbacks/douyinpay/douyin_notify.php, (*36)
抖音支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*37)
# 启动抖音支付异步处理 ./start_async.sh start douyinpay # 查看抖音支付状态 ./start_async.sh status douyinpay
examples/douyinpay/douyinpay_demo.php 文件提供了抖音支付的使用示例,你可以修改配置参数后直接运行测试。, (*38)
使用 Composer 安装:, (*39)
composer require ankewk/easypay
快手支付需要以下配置参数:, (*40)
$config = [
'app_id' => 'your-app-id', // 快手应用APPID
'merchant_id' => 'your-merchant-id', // 商户号
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 快手公钥
'notify_url' => 'https://your-domain.com/callbacks/kuaishoupay/kuaishou_notify.php', // 支付回调URL
'gateway_url' => 'https://pay-api.kuaishou.com', // 快手支付网关URL
];
快手支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*41)
快手支付的异步通知处理已集成异步处理系统,请查看:callbacks/kuaishoupay/kuaishou_notify.php, (*42)
# 启动快手支付异步处理 ./start_async.sh start kuaishoupay # 查看快手支付状态 ./start_async.sh status kuaishoupay
use Kuaishoupay\Payment\KuaishouPayService; $payService = new KuaishouPayService($config);
$order = [
'out_trade_no' => 'KS' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '快手支付测试商品描述', // 订单描述
'timeout_express' => '30m', // 订单过期时间
];
$result = $payService->generatePayParams($order);
if ($result['success']) {
$payParams = $result['data']; // 支付参数,用于前端调起快手支付
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_status'];
} else {
echo "查询失败:" . $result['error'];
}
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['error'];
}
快手支付的异步通知处理请参考:callbacks/kuaishoupay/kuaishoupay_notify.php, (*43)
examples/kuaishoupay/kuaishoupay_demo.php 文件提供了快手支付的使用示例,你可以修改配置参数后直接运行测试。, (*44)
使用 Composer 安装:, (*45)
composer require ankewk/easypay
京东支付需要以下配置参数:, (*46)
$config = [
'merchant_no' => 'your-merchant-no', // 商户号
'des_key' => 'your-des-key', // DES密钥
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 京东公钥
'notify_url' => 'https://your-domain.com/callbacks/jdpay/jdpay_notify.php', // 支付回调URL
'gateway_url' => 'https://wepay.jd.com/jdpay/saveOrder', // 京东支付网关URL
];
京东支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*47)
# 启动京东支付异步处理 ./start_async.sh start jdpay # 查看京东支付状态 ./start_async.sh status jdpay
use Jdpay\Payment\JdPayService; $payService = new JdPayService($config);
$order = [
'out_trade_no' => 'JD' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '京东支付测试商品描述', // 订单描述
'timeout_express' => '30m', // 订单过期时间
];
$result = $payService->generatePayParams($order);
if ($result['success']) {
$payParams = $result['data']; // 支付参数,用于前端调起京东支付
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_status'];
} else {
echo "查询失败:" . $result['error'];
}
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['error'];
}
京东支付的异步通知处理请参考:callbacks/jdpay/jdpay_notify.php, (*48)
examples/jdpay/jdpay_demo.php 文件提供了京东支付的使用示例,你可以修改配置参数后直接运行测试。, (*49)
使用 Composer 安装:, (*50)
composer require ankewk/easypay
拼多多支付需要以下配置参数:, (*51)
$config = [
'client_id' => 'your-client-id', // 拼多多应用Client ID
'client_secret' => 'your-client-secret', // 拼多多应用Client Secret
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 拼多多公钥
'notify_url' => 'https://your-domain.com/callbacks/pinduoduopay/pinduoduopay_notify.php', // 支付回调URL
'gateway_url' => 'https://open-api.pinduoduo.com/gateway', // 拼多多支付网关URL
];
use Pinduoduopay\Payment\PinduoduoPayService; $payService = new PinduoduoPayService($config);
$order = [
'out_trade_no' => 'PDD' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '拼多多支付测试商品描述', // 订单描述
'timeout_express' => '30m', // 订单过期时间
];
$result = $payService->generatePayParams($order);
if ($result['success']) {
$payParams = $result['data']; // 支付参数,用于前端调起拼多多支付
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_status'];
} else {
echo "查询失败:" . $result['error'];
}
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['error'];
}
拼多多支付的异步通知处理请参考:callbacks/pinduoduopay/pinduoduopay_notify.php, (*52)
拼多多支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*53)
# 启动拼多多支付异步处理 ./start_async.sh start pinduoduopay # 查看拼多多支付状态 ./start_async.sh status pinduoduopay
examples/pinduoduopay/pinduoduopay_demo.php 文件提供了拼多多支付的使用示例,你可以修改配置参数后直接运行测试。, (*54)
使用 Composer 安装:, (*55)
composer require ankewk/easypay
美团支付需要以下配置参数:, (*56)
$config = [
'merchant_id' => 'your-merchant-id', // 美团商户号
'app_key' => 'your-app-key', // 美团应用App Key
'app_secret' => 'your-app-secret', // 美团应用App Secret
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 美团公钥
'notify_url' => 'https://your-domain.com/callbacks/meituanpay/meituanpay_notify.php', // 支付回调URL
'gateway_url' => 'https://api.meituan.com/gateway', // 美团支付网关URL
];
use Meituanpay\Payment\MeituanPayService; $payService = new MeituanPayService($config);
$order = [
'out_trade_no' => 'MT' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '美团支付测试商品描述', // 订单描述
'timeout_express' => '30m', // 订单过期时间
];
$result = $payService->generatePayParams($order);
if ($result['success']) {
$payParams = $result['data']; // 支付参数,用于前端调起美团支付
} else {
echo "错误:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['success']) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_status'];
} else {
echo "查询失败:" . $result['error'];
}
$result = $payService->closeOrder($outTradeNo);
if ($result['success']) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['error'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$refundAmount = 0.01; // 退款金额
$outRefundNo = 'RF' . date('YmdHis') . rand(1000, 9999); // 商户退款单号
$reason = '测试退款'; // 退款原因
$result = $payService->refund($outTradeNo, $refundAmount, $outRefundNo, $reason);
if ($result['success']) {
echo "退款申请成功";
} else {
echo "退款失败:" . $result['error'];
}
美团支付的异步通知处理请参考:callbacks/meituanpay/meituanpay_notify.php, (*57)
美团支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*58)
# 启动美团支付异步处理 ./start_async.sh start meituanpay # 查看美团支付状态 ./start_async.sh status meituanpay
examples/meituanpay/meituanpay_demo.php 文件提供了美团支付的使用示例,你可以修改配置参数后直接运行测试。, (*59)
使用 Composer 安装:, (*60)
composer require ankewk/easypay
苹果支付需要以下配置参数:, (*61)
$config = [
'merchant_id' => 'your-merchant-id', // Apple Pay商户ID
'merchant_cert_path' => '/path/to/merchant-cert.pem', // 商户证书路径
'merchant_key_path' => '/path/to/merchant-key.pem', // 商户私钥路径
'merchant_key_password' => 'your-key-password', // 私钥密码
'notify_url' => 'https://your-domain.com/callbacks/applepay/applepay_notify.php', // 支付回调URL
'gateway_url' => 'https://apple-pay-gateway.apple.com/payments', // Apple Pay网关URL
'display_name' => 'EasyPay', // 显示名称
];
苹果支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*62)
苹果支付的异步通知处理已集成异步处理系统,请查看:callbacks/applepay/applepay_notify.php, (*63)
# 启动苹果支付异步处理 ./start_async.sh start applepay # 查看苹果支付状态 ./start_async.sh status applepay
use Applepay\Payment\ApplePayService; $payService = new ApplePayService($config);
$order = [
'out_trade_no' => 'AP' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'currency_code' => 'CNY', // 货币代码
'subject' => '测试商品', // 订单标题
'country_code' => 'CN', // 国家代码
'domain_name' => $_SERVER['HTTP_HOST'], // 域名
];
$sessionData = $payService->createPaymentSession($order);
$validationUrl = 'https://apple-pay-gateway.apple.com/paymentservices/startSession';
$result = $payService->validateMerchant($validationUrl);
if ($result['code'] === 0) {
$merchantSession = $result['data'];
// 用于前端Apple Pay会话
} else {
echo "验证失败:" . $result['message'];
}
$paymentData = [
'payment' => [
'token' => [
'paymentData' => $paymentToken, // 从前端获取的支付令牌
]
]
];
$result = $payService->processPayment($paymentData, $order);
if ($result['code'] === 0) {
echo "支付成功";
$transactionId = $result['data']['transaction_id'];
} else {
echo "支付失败:" . $result['message'];
}
$transactionId = 'your-transaction-id';
$result = $payService->queryOrderStatus($transactionId);
if ($result['code'] === 0) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['status'];
} else {
echo "查询失败:" . $result['message'];
}
$transactionId = 'your-transaction-id'; // Apple Pay交易ID
$refundAmount = 0.01; // 退款金额
$reason = '测试退款'; // 退款原因
$result = $payService->refund($transactionId, $refundAmount, $reason);
if ($result['code'] === 0) {
echo "退款申请成功";
$refundId = $result['data']['refund_id'];
} else {
echo "退款失败:" . $result['message'];
}
<!DOCTYPE html>
<html>
<head>
<title>Apple Pay 支付示例</title>
<script src="https://applepay.cdn-apple.com/jsapi/v1/apple-pay-sdk.js"></script>
</head>
<body>
<apple-pay-button
buttonstyle="black"
type="plain"
locale="zh-CN">
</apple-pay-button>
<script>
const session = new ApplePaySession(3, {
countryCode: 'CN',
currencyCode: 'CNY',
supportedNetworks: ['visa', 'masterCard', 'chinaUnionPay'],
merchantCapabilities: ['supports3DS', 'supportsCredit', 'supportsDebit'],
total: {
label: '测试商品',
amount: '0.01'
}
});
session.onvalidatemerchant = async (event) => {
try {
const response = await fetch('/validate-merchant.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
validationURL: event.validationURL
})
});
const merchantSession = await response.json();
session.completeMerchantValidation(merchantSession);
} catch (error) {
console.error('商户验证失败:', error);
session.abort();
}
};
session.onpaymentauthorized = (event) => {
fetch('/process-payment.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
payment: event.payment
})
})
.then(response => response.json())
.then(result => {
if (result.success) {
session.completePayment(ApplePaySession.STATUS_SUCCESS);
} else {
session.completePayment(ApplePaySession.STATUS_FAILURE);
}
});
};
document.querySelector('apple-pay-button').addEventListener('click', () => {
session.begin();
});
</script>
</body>
</html>
苹果支付的异步通知处理请参考:callbacks/applepay/applepay_notify.php, (*64)
苹果支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*65)
# 启动苹果支付异步处理 ./start_async.sh start applepay # 查看苹果支付状态 ./start_async.sh status applepay
examples/applepay/applepay_demo.php 文件提供了苹果支付的使用示例,你可以修改配置参数后直接运行测试。, (*66)
苹果支付需要配置商户证书,请按照以下步骤操作:, (*67)
使用 Composer 安装:, (*68)
composer require ankewk/easypay
云闪付需要以下配置参数:, (*69)
$config = [
'merchant_id' => 'your-merchant-id', // 云闪付商户号
'app_key' => 'your-app-key', // 云闪付应用App Key
'app_secret' => 'your-app-secret', // 云闪付应用App Secret
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 云闪付公钥
'notify_url' => 'https://your-domain.com/callbacks/cmbpay/cmbpay_notify.php', // 支付回调URL
'gateway_url' => 'https://api.95516.com/gateway', // 云闪付支付网关URL
];
use Cmbpay\Payment\CmbPayService; $payService = new CmbPayService($config);
$order = [
'out_trade_no' => 'CMB' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '云闪付测试商品描述', // 订单描述
'time_expire' => date('Y-m-d H:i:s', strtotime('+30 minutes')), // 订单过期时间
'product_id' => '123456', // 商品ID
];
$result = $payService->unifiedOrder($order);
if ($result['code'] === 0) {
echo "下单成功";
$qrCode = $result['data']['qr_code']; // 二维码链接
$prepayId = $result['data']['prepay_id']; // 预支付交易会话标识
} else {
echo "下单失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['code'] === 0) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_state'];
} else {
echo "查询失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->closeOrder($outTradeNo);
if ($result['code'] === 0) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['message'];
}
云闪付的异步通知处理请参考:callbacks/cmbpay/cmbpay_notify.php, (*70)
云闪付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*71)
# 启动云闪付异步处理 ./start_async.sh start cmbpay # 查看云闪付状态 ./start_async.sh status cmbpay
examples/cmbpay/cmbpay_demo.php 文件提供了云闪付的使用示例,你可以修改配置参数后直接运行测试。, (*72)
使用 Composer 安装:, (*73)
composer require ankewk/easypay
华为支付需要以下配置参数:, (*74)
$config = [
'app_id' => 'your-app-id', // 华为应用APPID
'merchant_id' => 'your-merchant-id', // 商户号
'private_key' => 'your-private-key', // 商户私钥
'public_key' => 'your-public-key', // 华为公钥
'notify_url' => 'https://your-domain.com/callbacks/huaweipay/huawei_notify.php', // 支付回调URL
'gateway_url' => 'https://pay-api.cloud.huawei.com', // 华为支付网关URL
];
华为支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*75)
华为支付的异步通知处理已集成异步处理系统,请查看:callbacks/huaweipay/huawei_notify.php, (*76)
# 启动华为支付异步处理 ./start_async.sh start huaweipay # 查看华为支付状态 ./start_async.sh status huaweipay
use Huaweipay\Payment\HuaweiPayService; $payService = new HuaweiPayService($config);
$order = [
'out_trade_no' => 'HW' . date('YmdHis') . rand(1000, 9999), // 商户订单号
'total_amount' => 0.01, // 订单金额(元)
'subject' => '测试商品', // 订单标题
'body' => '测试商品描述', // 订单描述
'time_expire' => date('Y-m-d H:i:s', strtotime('+30 minutes')), // 订单过期时间
'product_id' => '123456', // 商品ID
];
$result = $payService->unifiedOrder($order);
if ($result['code'] === 0) {
echo "下单成功";
$qrCode = $result['data']['qr_code']; // 二维码链接
$prepayId = $result['data']['prepay_id']; // 预支付交易会话标识
} else {
echo "下单失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->queryOrder($outTradeNo);
if ($result['code'] === 0) {
$orderInfo = $result['data'];
echo "订单状态:" . $orderInfo['trade_state'];
} else {
echo "查询失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$result = $payService->closeOrder($outTradeNo);
if ($result['code'] === 0) {
echo "订单关闭成功";
} else {
echo "关闭失败:" . $result['message'];
}
$outTradeNo = 'your-out-trade-no'; // 商户订单号
$refundAmount = 0.01; // 退款金额
$reason = '测试退款'; // 退款原因
$outRefundNo = 'RF' . date('YmdHis') . rand(1000, 9999); // 商户退款单号
$result = $payService->refund($outTradeNo, $refundAmount, $reason, $outRefundNo);
if ($result['code'] === 0) {
echo "退款申请成功";
$refundId = $result['data']['refund_id'];
} else {
echo "退款失败:" . $result['message'];
}
$outRefundNo = 'your-out-refund-no'; // 商户退款单号
$result = $payService->queryRefund($outRefundNo);
if ($result['code'] === 0) {
$refundInfo = $result['data'];
echo "退款状态:" . $refundInfo['refund_state'];
} else {
echo "查询失败:" . $result['message'];
}
$prepayId = 'your-prepay-id'; // 预支付交易会话标识
$params = $payService->generatePayParams($prepayId);
// 返回给前端的支付参数
// {
// "appId": "应用ID",
// "partnerId": "商户号",
// "prepayId": "预支付会话标识",
// "package": "Sign=WXPay",
// "nonceStr": "随机字符串",
// "timeStamp": "时间戳",
// "sign": "签名"
// }
$data = $_POST; // 回调数据
$isValid = $payService->verifySign($data);
if ($isValid) {
echo "签名验证成功";
// 处理业务逻辑
} else {
echo "签名验证失败";
}
华为支付的异步通知处理请参考:callbacks/huaweipay/huawei_notify.php, (*77)
examples/huaweipay/huawei_demo.php 文件提供了华为支付的使用示例,你可以修改配置参数后直接运行测试。, (*78)
华为支付需要配置商户密钥,请按照以下步骤操作:, (*79)
华为支付支持异步处理订单状态更新,适用于高并发场景。, (*80)
在配置文件中添加异步处理相关配置:, (*81)
'huaweipay' => [
// ...其他配置...
// 异步处理配置
'queue_type' => 'file', // 可选:file, redis, database
// Redis配置(当queue_type=redis时)
'redis_host' => '127.0.0.1',
'redis_port' => 6379,
'redis_password' => '',
// 数据库配置(当queue_type=database时)
'db_host' => 'localhost',
'db_port' => 3306,
'db_name' => 'easypay',
'db_user' => 'root',
'db_pass' => '',
// 重试配置
'max_retries' => 3,
'retry_delay' => 5, // 秒
],
use Huaweipay\Payment\AsyncProcessor; // 创建异步处理器 $asyncProcessor = new AsyncProcessor($config); // 处理异步通知 $result = $asyncProcessor->processAsyncNotify($notifyData); // 处理任务队列(定时任务) $results = $asyncProcessor->processTaskQueue(10);
# 每5分钟处理一次任务队列 */5 * * * * /usr/bin/php /path/to/easypay/callbacks/huaweipay/async_processor.php --action=process --limit=10
华为支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。, (*82)
# 启动华为支付异步处理 ./start_async.sh start huaweipay # 查看华为支付状态 ./start_async.sh status huaweipay
完整示例请参考:examples/huaweipay/async_config.php, (*83)