集成支付宝、微信、云闪付、抖音、快手、京东、拼多多、美团、苹果、华为支付的Composer包
本项目支持多环境配置,通过配置文件和环境变量来管理不同环境的支付参数。
- PHP >= 5.6.0
- Composer
- Docker(可选,用于容器化部署)
本项目的Docker环境包含以下服务:
- php-fpm: PHP 5.6运行环境
- nginx: Web服务器
- mysql: MySQL 5.7数据库服务
在项目根目录执行以下命令构建Docker镜像:
docker-compose builddocker-compose up -ddocker-compose downdocker-compose psdocker-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
MySQL服务默认配置:
- 端口: 3306
- 数据库名: easypay
- 用户名: easypay
- 密码: easypay
- 根密码: root
- 首次启动服务时,会自动安装项目依赖。
- 如需要修改PHP版本或安装其他扩展,请修改Dockerfile。
- 如需要修改Nginx配置,请修改nginx/conf.d/default.conf文件。
- 代码修改后会自动同步到容器中,但如果修改了composer.json,需要重新构建镜像或进入容器执行composer install。
本系统为所有支付方式提供了完整的异步处理支持,确保支付回调能够快速响应并可靠处理。
| 支付方式 | 异步支持 | 配置示例 |
|---|---|---|
| 支付宝 (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
启动步骤
-
启动完整环境
./docker-start.sh
-
查看状态
./docker-status.sh
-
查看日志
./docker-logs.sh
-
停止服务
./docker-stop.sh
访问地址
- Web服务: http://localhost:8000
- MySQL: localhost:3306 (root/root)
- Redis: localhost:6379
macOS安装PHP
# 使用Homebrew安装PHP
brew install php
# 验证安装
php -v启动步骤
-
安装依赖
composer install
-
启动异步处理
./start_async.sh install ./start_async.sh start all
-
监控状态
./start_async.sh monitor
编辑 config/async.php 配置文件:
// 文件队列 (默认)
'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 alipayeasypay/
├── 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目录包含以下文件:
config/
├── config_loader.php # 配置加载器
├── dev.php # 开发环境配置
├── uat.php # 测试环境配置
└── prod.php # 生产环境配置
config_loader.php提供了一个简单的配置加载机制,可以根据当前环境自动加载对应的配置文件。
// 引入配置加载器
require_once __DIR__ . '/config/config_loader.php';
// 获取配置项
$appId = config('alipay.app_id');
$notifyUrl = config('wxpay.notify_url');
// 获取所有配置
$allConfig = config()->getAll();
// 切换环境
config()->setEnv('prod');默认情况下,配置加载器会使用dev环境的配置。你可以通过以下方式切换环境:
- 设置环境变量
APP_ENV:
export APP_ENV=prod- 直接在代码中设置:
config()->setEnv('uat');配置文件中包含以下类型的参数:
app_name: 应用名称debug: 是否开启调试模式
app_id: 支付宝APPIDmerchant_private_key: 商户私钥alipay_public_key: 支付宝公钥notify_url: 异步回调URLreturn_url: 同步回调URLsign_type: 签名类型gateway_url: 支付宝网关URL
app_id: 微信公众号APPIDmch_id: 商户号key: API密钥cert_path: 证书路径key_path: 密钥路径notify_url: 支付回调URLgateway_url: 微信支付网关URL
使用 Composer 安装:
composer require ankewk/easypay微信支付需要以下配置参数:
$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 文件处理微信支付回调:
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);
}微信支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动微信支付异步处理
./start_async.sh start wxpay
# 查看微信支付状态
./start_async.sh status wxpayexamples/wxpay/wxpay_demo.php 文件提供了微信支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay支付宝支付需要以下配置参数:
$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 文件处理支付宝支付回调:
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';
}支付宝支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动支付宝支付异步处理
./start_async.sh start alipay
# 查看支付宝支付状态
./start_async.sh status alipayexamples/alipay/alipay_demo.php 文件提供了支付宝支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay抖音支付需要以下配置参数:
$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
抖音支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动抖音支付异步处理
./start_async.sh start douyinpay
# 查看抖音支付状态
./start_async.sh status douyinpayexamples/douyinpay/douyinpay_demo.php 文件提供了抖音支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay快手支付需要以下配置参数:
$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
];快手支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
快手支付的异步通知处理已集成异步处理系统,请查看:callbacks/kuaishoupay/kuaishou_notify.php
# 启动快手支付异步处理
./start_async.sh start kuaishoupay
# 查看快手支付状态
./start_async.sh status kuaishoupayuse 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
examples/kuaishoupay/kuaishoupay_demo.php 文件提供了快手支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay京东支付需要以下配置参数:
$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
];京东支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动京东支付异步处理
./start_async.sh start jdpay
# 查看京东支付状态
./start_async.sh status jdpayuse 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
examples/jdpay/jdpay_demo.php 文件提供了京东支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay拼多多支付需要以下配置参数:
$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
拼多多支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动拼多多支付异步处理
./start_async.sh start pinduoduopay
# 查看拼多多支付状态
./start_async.sh status pinduoduopayexamples/pinduoduopay/pinduoduopay_demo.php 文件提供了拼多多支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay美团支付需要以下配置参数:
$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
美团支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动美团支付异步处理
./start_async.sh start meituanpay
# 查看美团支付状态
./start_async.sh status meituanpayexamples/meituanpay/meituanpay_demo.php 文件提供了美团支付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay苹果支付需要以下配置参数:
$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', // 显示名称
];苹果支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
苹果支付的异步通知处理已集成异步处理系统,请查看:callbacks/applepay/applepay_notify.php
# 启动苹果支付异步处理
./start_async.sh start applepay
# 查看苹果支付状态
./start_async.sh status applepayuse 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
苹果支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动苹果支付异步处理
./start_async.sh start applepay
# 查看苹果支付状态
./start_async.sh status applepayexamples/applepay/applepay_demo.php 文件提供了苹果支付的使用示例,你可以修改配置参数后直接运行测试。
苹果支付需要配置商户证书,请按照以下步骤操作:
- 登录 Apple Developer Portal
- 创建 Apple Pay 商户ID
- 生成并下载商户证书
- 将证书和私钥放置在配置指定的路径
- 确保服务器可以访问证书文件
- 苹果支付仅支持HTTPS环境
- 需要在苹果开发者后台配置正确的域名
- 证书有效期为1年,需要定期更新
- 测试环境使用Apple Pay沙箱环境
使用 Composer 安装:
composer require ankewk/easypay云闪付需要以下配置参数:
$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
云闪付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动云闪付异步处理
./start_async.sh start cmbpay
# 查看云闪付状态
./start_async.sh status cmbpayexamples/cmbpay/cmbpay_demo.php 文件提供了云闪付的使用示例,你可以修改配置参数后直接运行测试。
使用 Composer 安装:
composer require ankewk/easypay华为支付需要以下配置参数:
$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
];华为支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
华为支付的异步通知处理已集成异步处理系统,请查看:callbacks/huaweipay/huawei_notify.php
# 启动华为支付异步处理
./start_async.sh start huaweipay
# 查看华为支付状态
./start_async.sh status huaweipayuse 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
examples/huaweipay/huawei_demo.php 文件提供了华为支付的使用示例,你可以修改配置参数后直接运行测试。
华为支付需要配置商户密钥,请按照以下步骤操作:
- 登录 华为开发者联盟
- 进入"开发者中心" > "支付服务"
- 创建应用并获取App ID和商户ID
- 生成RSA密钥对(推荐使用2048位)
- 将公钥上传到华为开发者后台
- 将私钥配置到项目中
- 华为支付支持多种支付方式:华为应用内支付、华为钱包支付等
- 需要在华为开发者后台配置正确的包名和签名
- 密钥需要妥善保管,不要泄露给第三方
- 测试环境使用华为沙箱环境
- 确保服务器时间准确,否则可能导致签名验证失败
华为支付支持异步处理订单状态更新,适用于高并发场景。
在配置文件中添加异步处理相关配置:
'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华为支付已完全支持异步处理,回调处理器已更新为异步模式,确保快速响应和高可靠性。
# 启动华为支付异步处理
./start_async.sh start huaweipay
# 查看华为支付状态
./start_async.sh status huaweipay完整示例请参考:examples/huaweipay/async_config.php