magein / pay
php统一支付中心
v1.0.0
2024-08-02 18:50 UTC
Requires
- php: >=7.2.5
- ext-json: *
- alipaysdk/easysdk: ~2.2
- guzzlehttp/guzzle: ^7.8
- magein/utils: ^2.0.0
- overtrue/wechat: ~5.0
Requires (Dev)
- phpunit/phpunit: 7.0
This package is auto-updated.
Last update: 2024-12-02 20:57:07 UTC
README
gitee | composer | lastest version 1.0.0
简介
php代理支付
为何使用代理模式
场景:
- 企业下有多个项目
- 多个项目都有支付模块
- 多个项目下多个收款平台,如微信、支付宝、银联等
- 多个项目下某个收款平台有多个账户
- 多个项目使用同一个微信的收款账户(jsapi授权目录最多五个,H5支付域名最多5个)
- 不同的项目使用的支付方式不同,如:移动网站支付、小程序支付、唤醒app支付
针对以上的场景在实际开发中,多个项目需要维护,需要花费大量的时间一个一个去维护,如新增收款平台、新增收款账户等等问题
使用代理模式解决:
- 多个项目配置、维护等问题
- 添加收款平台、添加收款账户只需要在代理支付中处理
- 微信收款账户添加的域名限制问题
基本流程
平台支持
- 支付宝
- 微信
后续开放将支持更多平台
安装
composer require magein/pay:^1.0 -vvv -o
think
composer require magein/think-pay
thinkphp6 使用composer的extra参数进行加载服务,安装即用
更多think-pay用法
laravel
composer require magein/laravel-pay
laravel8 使用composer的extra参数进行加载服务,安装即用
更多laravel-pay用法
使用
基础配置
// 配置使用单列模式进行设置、获取
PayConfig::instance()->setConfig(config('pay'));
// 获取notify配置
PayConfig::notify();
// 获取渠道的配置
PayConfig::channel();
// 获取平台配置文件
PayConfig::platforms();
// 省略其他配置....
接口类配置
需要在配置文件中实现基础类
return [
// 省略其他配置项....
/**
* 扩展类
*/
'extension' => [
// 创建、获取订单类 需要继承 magein\pay\extension\PayOrderInterface
'pay_order' => \magein\pay\PayOrder::class,
// 支付结果通知 需要继承 magein\pay\PayNotice
'pay_notice' => \magein\pay\PayNotice::class,
// 日志类 需要继承 magein\pay\PayLog
'pay_log' => \magein\pay\PayLog::class,
// 签名类 需要继承 magein\pay\PaySigner
'pay_singer' => \magein\pay\PaySigner::class,
// 扫码支付使用的二维码类 需要继承 magein\pay\extension\PayQrcodeOrderInterface
'pay_qrcode' => \magein\pay\PayQrcode::class,
// 微信授权类 需要继承 magein\pay\extension\WxOauthInterface
'wx_oauth' => \magein\pay\PayWxOauth::class
],
]
工厂类
可以通过工厂类获取支付业务中使用的扩展类
// 获取平台
PayFactory::platform();
// 获取订单类
PayFactory::order();
// 获取通知类
PayFactory::notice();
// 获取日志类类
PayFactory::log();
// 获取签名类
PayFactory::singer();
// 扫码下单处理类
PayFactory::qrcode();
// 获取微信授权相关信息
PayFactory::wxOauth();
请求支付参数
参数键 | 参数值 | 是否必填 | 参数说明 |
---|---|---|---|
channel_id | 999 | true | 渠道编号 自定义的值,需要再配置文件中添加 |
platform_id | wx | true | 支付平台 如wx、ali等约定的值 |
trade_type | h5 | true | 交易类型 如wx的jsapi,navite等 |
total_amount | 100 | true | 支付金额,单位分 |
subject | 支付标题 | true | 下单、充值等自定义 |
order_no | 订单编号 | true | 202401010101000 |
scene | 支付场景 | true | 1 |
account | 使用的收款账号 | false | wx123 |
open_id | 125112 | false | 微信支付必填 |
notify_url | https:// | true | 异步通知地址 |
return_url | https:// | false | 同步通知地址 |
coupon_amount | 100 | false | 优惠的金额 |
coupon_info | false | 优惠说明 | |
user_id | 123 | false | 用户信息 |
sign | 20a6f426ff2e5851073ea828808130a1 | true | 参数签名 |
参数签名
// 不同渠道约定的秘钥
$secret ='20a6f426ff2e5851073ea828808130a1';
foreach ($params as $key => $val) {
if (is_object($val) || is_array($val) || strlen($val) > 10000) {
unset($params[$key]);
}
}
ksort($params);
$plain_text = '';
foreach ($params as $key => $val) {
$plain_text .= $key . $val;
}
$signature= md5(strtolower($secret . $plain_text));
统一下单
$payment=new \magein\pay\Payment();
$payment->unify($data);
扫码下单
依赖
composer require endroid/qr-code:^3.8
$payment=new \magein\pay\Payment();
// 获取支付二维码
$payment->qrcode($data);
// 扫码支付逻辑
$payment->scan($data);
支付结果查询
$payment=new \magein\pay\Payment();
// 根据支付编号查询订单支付结果 $type可选值 0=从系统和支付平台查询、 1=从系统查询、2=从支付平台查询
$payment->query($pay_no,$type);
异常
执行的异常信息可以通过捕获PayException获取错误信息
错误码
4001开始为各个配置文件等错误
4002开始为验证支付参数错误
4003开始为微信签名、授权等错误
4005开始为各种结果错误,如支付二维码超时、订单不存在等
错误码对照表
return [
'codes' => [
\magein\pay\PayCode::CONFIG_NULL => '配置文件错误',
\magein\pay\PayCode::CHANNEL_NULL => '订单渠道配置错误',
\magein\pay\PayCode::PLATFORM_NULL => '支付平台配置错误',
\magein\pay\PayCode::PLATFORM_CLASS_NULL => '支付平台实例化错误',
\magein\pay\PayCode::PLATFORM_ACCOUNT_NULL => '支付平台收款账号错误',
// 支付参数验证错误代码
400201=>'支付参数为空',
400203=>'签名错误',
400205=>'渠道错误',
400207=>'支付平台错误',
400209=>'支付平台交易类型错误',
400211=>'支付金额错误',
400213=>'订单编号错误',
400215=>'支付回调地址错误',
// 微信支付错误代码
400301 => '微信签名错误',
400303 => '微信支付参数错误',
400305 => '微信支付参数错误',
400307 => '微信授权通知地址错误',
400503 => '支付订单不存在',
400505 => '二维码已经失效',
],
]