# 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. 微信收款账户添加的域名限制问题
#### 基本流程

### 平台支持
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 => '二维码已经失效',
],
]
```