# php-pay **Repository Path**: magein/php-pay ## Basic Information - **Project Name**: php-pay - **Description**: php支付中心 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-21 - **Last Updated**: 2024-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

PHP,PAY

[gitee](https://gitee.com/magein/php-pay) | [composer](https://packagist.org/packages/magein/pay) | [lastest version 1.0.0](https://gitee.com/magein/php-pay/tags) ### 简介 php代理支付 #### 为何使用代理模式 场景: 1. 企业下有多个项目 2. 多个项目都有支付模块 3. 多个项目下多个收款平台,如微信、支付宝、银联等 4. 多个项目下某个收款平台有多个账户 5. 多个项目使用同一个微信的收款账户(jsapi授权目录最多五个,H5支付域名最多5个) 6. 不同的项目使用的支付方式不同,如:移动网站支付、小程序支付、唤醒app支付 针对以上的场景在实际开发中,多个项目需要维护,需要花费大量的时间一个一个去维护,如新增收款平台、新增收款账户等等问题 使用代理模式解决: 1. 多个项目配置、维护等问题 2. 添加收款平台、添加收款账户只需要在代理支付中处理 3. 微信收款账户添加的域名限制问题 #### 基本流程 ![](flow.chart.png) ### 平台支持 1. 支付宝 2. 微信 > 后续开放将支持更多平台 ### 安装 ```shell composer require magein/pay:^1.0 -vvv -o ``` #### think ```shell composer require magein/think-pay ``` > thinkphp6 使用composer的extra参数进行加载服务,安装即用 更多[think-pay](https://gitee.com/magein/think-pay)用法 #### laravel ```shell composer require magein/laravel-pay ``` > laravel8 使用composer的extra参数进行加载服务,安装即用 更多[laravel-pay](https://gitee.com/magein/laravel-pay)用法 ### 使用 #### 基础配置 [配置列表](config.md) ```php // 配置使用单列模式进行设置、获取 PayConfig::instance()->setConfig(config('pay')); // 获取notify配置 PayConfig::notify(); // 获取渠道的配置 PayConfig::channel(); // 获取平台配置文件 PayConfig::platforms(); // 省略其他配置.... ``` #### 接口类配置 > 需要在配置文件中实现基础类 ```php 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 ], ] ``` #### 工厂类 > 可以通过工厂类获取支付业务中使用的扩展类 ```php // 获取平台 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 | 参数签名 | #### 参数签名 ```php // 不同渠道约定的秘钥 $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)); ``` #### 统一下单 ```php $payment=new \magein\pay\Payment(); $payment->unify($data); ``` #### 扫码下单 依赖 ```shell composer require endroid/qr-code:^3.8 ``` ```php $payment=new \magein\pay\Payment(); // 获取支付二维码 $payment->qrcode($data); // 扫码支付逻辑 $payment->scan($data); ``` #### 支付结果查询 ```php $payment=new \magein\pay\Payment(); // 根据支付编号查询订单支付结果 $type可选值 0=从系统和支付平台查询、 1=从系统查询、2=从支付平台查询 $payment->query($pay_no,$type); ``` ### 异常 执行的异常信息可以通过捕获PayException获取错误信息 #### 错误码 4001开始为各个配置文件等错误 4002开始为验证支付参数错误 4003开始为微信签名、授权等错误 4005开始为各种结果错误,如支付二维码超时、订单不存在等 #### 错误码对照表 ```php 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 => '二维码已经失效', ], ] ```