PHP code example of kode / pays
1. Go to this page and download the library: Download kode/pays library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
kode / pays example snippets
use Kode\Pays\Facade\Pay;
// 微信支付
$wechat = Pay::wechat([
'app_id' => 'wx1234567890abcdef',
'mch_id' => '1234567890',
'api_key' => 'your-api-key-here',
]);
$result = $wechat->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_fee' => 100,
'body' => '测试商品',
'trade_type' => 'NATIVE',
'notify_url' => 'https://your-domain.com/notify/wechat',
]);
// 获取支付二维码链接
$codeUrl = $result['code_url'] ?? '';
use Kode\Pays\Facade\Pay;
// 1) 统一下单:标准方法也能用一个入口发起
$result = Pay::call('wechat', 'createOrder', [
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_fee' => 100,
'body' => '测试商品',
'trade_type' => 'NATIVE',
]);
// 2) 语义化快捷方法(等价于 call)
$result = Pay::createOrder('alipay', [/* ... */]);
$result = Pay::refund('wechat', [/* ... */]);
// 3) 各平台「特色方法」同样可直接调用
$result = Pay::call('wechat', 'someWechatSpecificMethod', $arg1, $arg2);
// 4) 拿到强类型实例,自由调用
$wechat = Pay::gateway('wechat', $config);
$wechat->createOrder([/* ... */]);
// 5) 安全校验回调(先过 NotifyGuard 再走平台级验签)
$ok = Pay::verify('wechat', $_POST, [
'timestamp' => (int) ($_POST['timestamp'] ?? 0),
'nonce' => $_POST['nonce'] ?? null,
'seen_nonces' => $alreadySeenNonces, // 由调用方维护,防重放
]);
// 6) 查询平台能力 / 域名(无需创建实例)
if (Pay::supports('wechat', \Kode\Pays\Core\GatewayManifest::CAP_PROFIT_SHARING)) {
// 该平台支持分账
}
$domain = Pay::baseUrl('wechat'); // 生产域名
use Kode\Pays\Core\GatewayManifest;
use Kode\Pays\Facade\Pay;
Pay::extend('mypay', [
'label' => 'MyPay',
'region' => GatewayManifest::REGION_DOMESTIC,
'signature' => GatewayManifest::SIGN_MD5,
'base_url' => 'https://api.mypay.com/',
'sandbox_url' => 'https://sandbox.mypay.com/',
'capabilities' => [GatewayManifest::CAP_PROFIT_SHARING => true],
], MyPayGateway::class, MyPayConfig::class);
// 登记后即可通过统一入口调用
Pay::createOrder('mypay', [/* ... */]);
use Kode\Pays\Facade\Pay;
$alipay = Pay::alipay([
'app_id' => '2024XXXXXXXXXXXX',
'private_key' => '-----BEGIN RSA PRIVATE KEY-----\n...',
'public_key' => '-----BEGIN PUBLIC KEY-----\n...',
]);
$result = $alipay->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '0.01',
'subject' => '测试商品',
'notify_url' => 'https://your-domain.com/notify/alipay',
'return_url' => 'https://your-domain.com/return',
]);
// 跳转到支付宝收银台
header('Location: ' . $result['url']);
use Kode\Pays\Facade\Pay;
$paypal = Pay::paypal([
'client_id' => 'YOUR_CLIENT_ID',
'client_secret' => 'YOUR_CLIENT_SECRET',
]);
$result = $paypal->createOrder([
'intent' => 'CAPTURE',
'purchase_units' => [
[
'amount' => [
'currency_code' => 'USD',
'value' => '10.00',
],
],
],
]);
use Kode\Pays\Facade\Pay;
$stripe = Pay::stripe([
'secret_key' => 'sk_test_...',
]);
// PaymentIntent 方式
$result = $stripe->createOrder([
'amount' => 1000,
'currency' => 'usd',
'metadata' => ['order_id' => 'ORDER_001'],
]);
// Checkout Session 方式
$session = $stripe->createCheckoutSession([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => '测试商品'],
'unit_amount' => 1000,
],
'quantity' => 1,
]],
'mode' => 'payment',
'success_url' => 'https://your-domain.com/success',
'cancel_url' => 'https://your-domain.com/cancel',
]);
use Kode\Pays\Facade\Pay;
$square = Pay::square([
'access_token' => 'EAAA...',
'environment' => 'sandbox',
]);
$result = $square->createOrder([
'amount' => 100,
'currency' => 'USD',
'note' => '测试商品',
'source_id' => 'cnon:card-nonce-ok',
]);
use Kode\Pays\Facade\Pay;
$adyen = Pay::adyen([
'api_key' => 'AQE1hmfxJ...',
'merchant_account' => 'YourMerchantAccount',
'environment' => 'test',
]);
$result = $adyen->createOrder([
'amount' => [
'value' => 1000,
'currency' => 'USD',
],
'reference' => 'ORDER_001',
'returnUrl' => 'https://your-domain.com/return',
'countryCode' => 'US',
]);
use Kode\Pays\Facade\Pay;
$meituan = Pay::meituan([
'app_id' => 'mt123456',
'app_secret' => 'your-app-secret',
'merchant_id' => 'M123456',
]);
$result = $meituan->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_fee' => 100,
'body' => '美团外卖订单',
'notify_url' => 'https://your-domain.com/notify/meituan',
'trade_type' => 'APP',
]);
$payUrl = $result['pay_url'] ?? '';
use Kode\Pays\Facade\Pay;
$jd = Pay::jd([
'merchant_no' => 'JD123456',
'des_key' => 'your-des-key',
'md5_key' => 'your-md5-key',
]);
$result = $jd->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '10.00',
'subject' => '京东商品',
'notify_url' => 'https://your-domain.com/notify/jd',
'trade_type' => 'APP',
]);
use Kode\Pays\Facade\Pay;
$kuaishou = Pay::kuaishou([
'app_id' => 'ks123456',
'app_secret' => 'your-app-secret',
'merchant_id' => 'M123456',
]);
$result = $kuaishou->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => 100,
'subject' => '快手小店商品',
'notify_url' => 'https://your-domain.com/notify/kuaishou',
'trade_type' => 'MINI_PROGRAM',
]);
use Kode\Pays\Facade\Pay;
$apple = Pay::apple([
'merchant_identifier' => 'merchant.com.yourdomain',
'merchant_certificate' => file_get_contents('/path/to/cert.pem'),
'merchant_certificate_key' => file_get_contents('/path/to/key.pem'),
'apple_pay_merchant_id' => 'your_apple_merchant_id',
'domain_name' => 'your-domain.com',
]);
$result = $apple->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '10.00',
'currency' => 'CNY',
'payment_token' => $frontendPaymentToken,
]);
use Kode\Pays\Facade\Pay;
$google = Pay::google([
'merchant_id' => 'BCR2DN4T7ZTLKJ3H',
'merchant_name' => 'Your Store Name',
'gateway_merchant_id' => 'your_gateway_merchant_id',
'environment' => 'TEST',
]);
$result = $google->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '10.00',
'currency' => 'USD',
'payment_token' => $frontendPaymentToken,
]);
use Kode\Pays\Facade\Pay;
$amazon = Pay::amazon([
'merchant_id' => 'A2QEXAMPLE123',
'access_key' => 'AKIA...',
'secret_key' => 'your-secret-key',
'client_id' => 'amzn1.application-oa2-client.xxx',
'region' => 'na',
]);
$result = $amazon->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '10.00',
'currency' => 'USD',
'amazon_order_reference_id' => 'S01-1234567-1234567',
]);
use Kode\Pays\Facade\Pay;
$klarna = Pay::klarna([
'username' => 'PK12345_abc123...',
'password' => 'your-api-password',
'region' => 'eu',
]);
$result = $klarna->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => 100.00,
'currency' => 'EUR',
'country' => 'DE',
'items' => [
['name' => 'T-Shirt', 'quantity' => 1, 'price' => 50.00],
['name' => 'Jeans', 'quantity' => 1, 'price' => 50.00],
],
]);
use Kode\Pays\Facade\Pay;
$alipayGlobal = Pay::alipayGlobal([
'app_id' => '2024xxxxxx',
'private_key' => file_get_contents('/path/to/private_key.pem'),
'public_key' => file_get_contents('/path/to/public_key.pem'),
'sign_type' => 'RSA2',
]);
$result = $alipayGlobal->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => '10.00',
'currency' => 'USD',
'subject' => '跨境商品',
'notify_url' => 'https://your-domain.com/notify/alipay_global',
]);
use Kode\Pays\Facade\Pay;
$wise = Pay::wise([
'api_key' => 'your-api-key',
'profile_id' => '12345678',
]);
$result = $wise->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'source_currency' => 'GBP',
'target_currency' => 'EUR',
'amount' => 100.00,
'recipient' => [
'currency' => 'EUR',
'type' => 'iban',
'accountHolderName' => 'John Doe',
'details' => [
'iban' => 'DE89370400440532013000',
],
],
]);
use Kode\Pays\Facade\Pay;
$revolut = Pay::revolut([
'api_key' => 'your-api-key',
'merchant_id' => 'your-merchant-id',
]);
$result = $revolut->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_amount' => 10.00,
'currency' => 'EUR',
'description' => 'Revolut 商品',
'customer_email' => '[email protected] ',
'redirect_url' => 'https://your-domain.com/success',
]);
use Kode\Pays\Facade\Pay;
$payoneer = Pay::payoneer([
'api_key' => 'your-api-key',
'api_secret' => 'your-api-secret',
'program_id' => 'your-program-id',
]);
$result = $payoneer->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'amount' => 100.00,
'currency' => 'USD',
'payee_id' => 'payee_123456',
'description' => 'Payoneer 付款',
]);
use Kode\Pays\Facade\Pay;
$aggregate = Pay::aggregate([
'channels' => [
[
'gateway' => 'wechat',
'priority' => 1,
'config' => [
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'key',
],
],
[
'gateway' => 'alipay',
'priority' => 2,
'config' => [
'app_id' => '2024...',
'private_key' => '...',
'public_key' => '...',
],
],
],
]);
// 自动选择可用渠道
$result = $aggregate->createOrder([
'out_trade_no' => 'ORDER_001',
'total_fee' => 100,
'body' => '测试商品',
]);
// 返回结果包含实际使用的渠道
$channel = $result['_channel']; // wechat 或 alipay
use Kode\Pays\Core\SandboxManager;
use Kode\Pays\Facade\Pay;
// 全局开启沙箱(所有网关)
SandboxManager::enableGlobal();
// 仅对微信开启沙箱
SandboxManager::enable('wechat');
// 检查当前环境
if (SandboxManager::isSandbox('wechat')) {
echo '当前为微信沙箱环境' . PHP_EOL;
}
// 获取沙箱 URL
$url = SandboxManager::getBaseUrl('wechat');
// 沙箱模式下创建订单不会扣真实资金
$wechat = Pay::wechat([...]);
$result = $wechat->createOrder([...]);
use Kode\Pays\Facade\Pay;
use Kode\Pays\Event\Events;
// 注册支付成功监听器
Pay::on(Events::PAYMENT_SUCCESS, function (array $payload) {
$orderId = $payload['order_id'];
$amount = $payload['amount'];
// 发送支付成功通知(邮件/短信/站内信)
// 与支付逻辑完全解耦
});
// 注册异常监听器
Pay::on(Events::EXCEPTION_OCCURRED, function (array $payload) {
$exception = $payload['exception'];
// 上报监控(Sentry/钉钉/企业微信)
});
// 注册请求日志监听器
Pay::on(Events::REQUEST_SENDING, function (array $payload) {
// 记录请求参数
return $payload;
});
use Kode\Pays\Facade\Pay;
// 获取通知数据
$data = $_POST;
// 创建对应网关
$gateway = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
// 验证签名
if ($gateway->verifyNotify($data)) {
// 处理业务逻辑
$orderId = $data['out_trade_no'];
// 返回成功响应
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>';
} else {
echo '<xml><return_code><![CDATA[FAIL]]></return_code></xml>';
}
use Kode\Pays\Async\AsyncNotifyHandler;
use Kode\Pays\Facade\Pay;
$handler = new AsyncNotifyHandler();
// 批量并发处理通知
$tasks = [
['gateway' => Pay::wechat($config1), 'data' => $notify1],
['gateway' => Pay::alipay($config2), 'data' => $notify2],
['gateway' => Pay::paypal($config3), 'data' => $notify3],
];
$results = $handler->handleConcurrent($tasks, function ($data) {
// 处理业务逻辑
return true;
});
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\ProfitSharingPlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new ProfitSharingPlugin($wechat);
// 添加分账接收方
$plugin->addReceiver([
'type' => 'MERCHANT_ID',
'account' => '1234567890',
'name' => '供应商A',
]);
// 创建分账
$result = $plugin->create([
'transaction_id' => '4200000000000000',
'out_order_no' => 'SHARE_' . date('YmdHis'),
'receivers' => [
['type' => 'MERCHANT_ID', 'account' => '1234567890', 'amount' => 100, 'description' => '供应商分账'],
['type' => 'PERSONAL_OPENID', 'account' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o', 'amount' => 50, 'description' => '推广者分账'],
],
]);
// 查询分账结果
$result = $plugin->query('SHARE_20240425000001');
// 分账回退
$result = $plugin->return([
'out_order_no' => 'SHARE_20240425000001',
'out_return_no' => 'RETURN_' . date('YmdHis'),
'return_amount' => 100,
]);
// 解冻剩余资金
$result = $plugin->unfreeze('4200000000000000');
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\SubscriptionPlugin;
$stripe = Pay::stripe(['secret_key' => 'sk_test_...']);
$plugin = new SubscriptionPlugin($stripe);
// 创建订阅计划
$plan = $plugin->createPlan([
'name' => '月度会员',
'amount' => 9900,
'currency' => 'usd',
'interval' => 'month',
]);
// 创建订阅
$subscription = $plugin->createSubscription([
'customer_id' => 'cus_xxx',
'plan_id' => $plan['id'],
]);
// 暂停订阅
$plugin->pauseSubscription($subscription['id']);
// 恢复订阅
$plugin->resumeSubscription($subscription['id']);
// 取消订阅
$plugin->cancelSubscription($subscription['id']);
// 支付宝周期扣款:签约 → 代扣(金额单位为元)
$alipay = Pay::alipay([...]);
$sign = Pay::call('alipay', 'createSubscription', [
'customer_id' => 'AGREEMENT_001', // 商户侧协议号
'plan_id' => 'plan_monthly',
'amount' => 19.9,
'interval' => 'month',
'notify_url' => 'https://example.com/sign-notify',
]);
// $sign['url'] 引导用户完成签约,回调拿到 agreement_no 后按周期扣款
Pay::call('alipay', 'payWithAgreement', [
'out_trade_no' => 'SUB_202608_001',
'total_amount' => 19.9,
'subject' => '月度会员续费',
'agreement_no' => '20260810000000000001',
]);
// 微信委托代扣:模板 ID 需在商户平台后台配置
Pay::call('wechat', 'createSubscription', [
'customer_id' => 'CONTRACT_001',
'plan_id' => '100001',
'notify_url' => 'https://example.com/sign-notify',
]);
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\TransferPlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new TransferPlugin($wechat);
// 单笔转账到零钱
$result = $plugin->single([
'out_biz_no' => 'TRANSFER_' . date('YmdHis'),
'amount' => 100,
'recipient' => ['type' => 'openid', 'account' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o', 'name' => '张三'],
'description' => '佣金提现',
]);
// 批量转账
$result = $plugin->batch([
'out_biz_no' => 'BATCH_' . date('YmdHis'),
'transfer_detail_list' => [
['out_detail_no' => 'D001', 'amount' => 100, 'recipient' => ['account' => 'openid1', 'name' => '张三'], 'remark' => '佣金'],
['out_detail_no' => 'D002', 'amount' => 200, 'recipient' => ['account' => 'openid2', 'name' => '李四'], 'remark' => '奖励'],
],
]);
// 查询转账结果
$result = $plugin->query('TRANSFER_20240425000001');
// 获取电子回单
$result = $plugin->receipt('TRANSFER_20240425000001');
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\ReconciliationPlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new ReconciliationPlugin($wechat);
// 下载交易对账单
$bill = $plugin->downloadBill([
'bill_date' => '20240425',
'bill_type' => 'ALL',
]);
// 下载资金账单
$fundFlow = $plugin->downloadFundFlow([
'bill_date' => '20240425',
'account_type' => 'Basic',
]);
// 解析对账单
$records = $plugin->parseBill($rawCsvData);
// 系统订单与对账单差异比对
$diff = $plugin->diff($systemOrders, $records);
if ($diff['is_consistent']) {
echo '对账一致';
} else {
print_r($diff['only_in_system']);
print_r($diff['amount_mismatch']);
}
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\RefundPlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new RefundPlugin($wechat);
// 申请退款
$result = $plugin->apply([
'out_trade_no' => 'ORDER_001',
'out_refund_no' => 'REFUND_001',
'total_fee' => 100,
'refund_fee' => 50,
'refund_desc' => '商品质量问题',
]);
// 查询退款
$result = $plugin->query('REFUND_001');
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\RedPacketPlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new RedPacketPlugin($wechat);
// 发放普通红包
$result = $plugin->send([
'mch_billno' => 'REDPACK_' . date('YmdHis'),
'send_name' => '某某公司',
're_openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
'total_amount' => 100,
'total_num' => 1,
'wishing' => '恭喜发财',
'act_name' => '新年活动',
'remark' => '参与活动领取红包',
]);
// 发放裂变红包
$result = $plugin->group([
'mch_billno' => 'GROUP_' . date('YmdHis'),
'send_name' => '某某公司',
're_openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
'total_amount' => 300,
'total_num' => 3,
'wishing' => '裂变红包',
'act_name' => '分享活动',
'remark' => '分享给好友领取',
]);
// 查询红包记录
$result = $plugin->query('REDPACK_20240425000001');
use Kode\Pays\Facade\Pay;
use Kode\Pays\Plugin\PersonalReceivePlugin;
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new PersonalReceivePlugin($wechat);
// 生成个人收款码
$result = $plugin->createQrCode([
'amount' => 100,
'description' => '商品付款',
'attach' => ['product_id' => '123'],
]);
// 查询收款记录
$records = $plugin->queryRecords([
'start_time' => '2024-04-01 00:00:00',
'end_time' => '2024-04-25 23:59:59',
]);
// 提现到银行卡
$result = $plugin->withdraw([
'amount' => 5000,
'bank_card_no' => '622202************',
'real_name' => '张三',
'out_biz_no' => 'WITHDRAW_' . date('YmdHis'),
]);
// 查询提现结果
$result = $plugin->queryWithdraw('WITHDRAW_20240425000001');
use Kode\Pays\Core\OrderMonitorDaemon;
use Kode\Pays\Core\UnifiedQrRouter;
// 1. 配置各通道网关,生成统一入口码(一个二维码兼容多通道)
$router = new UnifiedQrRouter([
'wechat' => ['app_id' => 'wx1', 'mch_id' => 'm1', 'api_key' => 'k1'],
'alipay' => ['app_id' => 'a1', 'private_key' => '...', 'alipay_public_key' => '...'],
]);
$entry = $router->createEntry(['wechat', 'alipay'], 100, '商品付款');
// $entry['qr_content'] 用于渲染二维码图片
// 2. 用户扫码进入 H5 选择通道后,路由下单生成动态订单码
$order = $router->route($entry['router_id'], 'wechat');
// $order['code_url'] 是微信 Native 扫码支付链接
// 3. 注册后台监控,进程内持续抓取收款状态
$daemon = new OrderMonitorDaemon($router);
$daemon->register($entry['router_id'], 'wechat', [
'out_trade_no' => $order['out_trade_no'],
'total_fee' => 100,
], [
'interval' => 5,
'timeout' => 600,
'on_success' => function ($paymentData, $routerId) {
// 通知业务系统、自动发货、推送前端...
},
]);
$pid = $daemon->runInBackground();
use Kode\Pays\Facade\Pay;
use Kode\Pays\Core\WalletManager;
use Kode\Pays\Plugin\AutoSettlementPlugin;
$walletManager = new WalletManager();
// 绑定微信零钱账户(自动结算)
$walletManager->bind('user_001', 'wechat_wallet', [
'account' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
'real_name' => '张三',
'auto_settlement' => true,
'min_amount' => 100,
'settlement_type' => 'realtime',
]);
// 绑定银行卡(备用结算方式)
$walletManager->bind('user_001', 'bank_card', [
'account' => '622202************',
'real_name' => '张三',
'bank_code' => 'ICBC',
'auto_settlement' => true,
'min_amount' => 5000,
'settlement_type' => 'daily',
'settlement_time' => '02:00',
]);
$wechat = Pay::wechat([
'app_id' => 'wx123456',
'mch_id' => '123456',
'api_key' => 'your-api-key',
]);
$plugin = new AutoSettlementPlugin($wechat, $walletManager);
// 支付成功后自动触发结算
$order = $wechat->createOrder([
'out_trade_no' => 'ORDER_' . date('YmdHis'),
'total_fee' => 1000,
'body' => '商品购买',
]);
$result = $plugin->settle('user_001', [
'transaction_id' => $order['transaction_id'],
'amount' => $order['total_fee'],
'out_biz_no' => 'SETTLE_' . date('YmdHis'),
'description' => '订单自动结算',
]);
// 批量结算
$results = $plugin->settleBatch([
['user_id' => 'user_001', 'transaction_id' => 'T001', 'amount' => 1000, 'out_biz_no' => 'S001'],
['user_id' => 'user_002', 'transaction_id' => 'T002', 'amount' => 2000, 'out_biz_no' => 'S002'],
]);
use Kode\Pays\Core\FundConstraintValidator;
use Kode\Pays\Plugin\TransferPlugin;
$validator = new FundConstraintValidator();
// 配置转账约束
$validator->setTransferConstraints([
'min_amount' => 100,
'max_amount' => 200000,
'daily_limit' => 1000000,
'daily_count_limit' => 100,
'allowed_hours' => [9, 22],
'blacklist' => ['blocked_user_001'],
]);
// 配置红包约束
$validator->setRedPacketConstraints([
'min_amount' => 100,
'max_amount' => 200000,
'max_total_num' => 100,
'daily_limit' => 500000,
'daily_count_limit' => 50,
]);
// 创建带约束验证的转账插件
$transferPlugin = new TransferPlugin($wechatGateway, $validator);
// 以下转账将触发约束验证
$result = $transferPlugin->single([
'out_biz_no' => 'TRANSFER_001',
'amount' => 50000,
'recipient' => ['account' => 'openid_xxx', 'name' => '张三'],
'user_id' => 'user_001',
]);
use Kode\Pays\Exception\ConfigException;
use Kode\Pays\Exception\NetworkException;
use Kode\Pays\Exception\SignException;
use Kode\Pays\Exception\GatewayException;
use Kode\Pays\Exception\InvalidArgumentException;
try {
$result = $gateway->createOrder($params);
} catch (ConfigException $e) {
// 配置缺失或错误,需检查配置文件
} catch (NetworkException $e) {
// 网络超时或连接失败,可重试
} catch (SignException $e) {
// 签名验证失败,可能密钥错误或数据被篡改
} catch (InvalidArgumentException $e) {
// 业务参数错误,需返回给用户
} catch (GatewayException $e) {
// 网关返回业务错误
echo '网关错误码:' . ($e->getGatewayCode() ?? '无') . PHP_EOL;
echo '网关错误信息:' . ($e->getGatewayMessage() ?? '无') . PHP_EOL;
}
bash
composer bench # 等价于 php scripts/bench.php