magein/pay

php统一支付中心

v1.0.0 2024-08-02 18:50 UTC

This package is auto-updated.

Last update: 2024-12-02 20:57:07 UTC


README

gitee | composer | lastest version 1.0.0

简介

php代理支付

为何使用代理模式

场景:

  1. 企业下有多个项目
  2. 多个项目都有支付模块
  3. 多个项目下多个收款平台,如微信、支付宝、银联等
  4. 多个项目下某个收款平台有多个账户
  5. 多个项目使用同一个微信的收款账户(jsapi授权目录最多五个,H5支付域名最多5个)
  6. 不同的项目使用的支付方式不同,如:移动网站支付、小程序支付、唤醒app支付

针对以上的场景在实际开发中,多个项目需要维护,需要花费大量的时间一个一个去维护,如新增收款平台、新增收款账户等等问题

使用代理模式解决:

  1. 多个项目配置、维护等问题
  2. 添加收款平台、添加收款账户只需要在代理支付中处理
  3. 微信收款账户添加的域名限制问题

基本流程

平台支持

  1. 支付宝
  2. 微信

后续开放将支持更多平台

安装

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_id999true渠道编号 自定义的值,需要再配置文件中添加
platform_idwxtrue支付平台 如wx、ali等约定的值
trade_typeh5true交易类型 如wx的jsapi,navite等
total_amount100true支付金额,单位分
subject支付标题true下单、充值等自定义
order_no订单编号true202401010101000
scene支付场景true1
account使用的收款账号falsewx123
open_id125112false微信支付必填
notify_urlhttps://true异步通知地址
return_urlhttps://false同步通知地址
coupon_amount100false优惠的金额
coupon_infofalse优惠说明
user_id123false用户信息
sign20a6f426ff2e5851073ea828808130a1true参数签名

参数签名


// 不同渠道约定的秘钥
$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 => '二维码已经失效',
],
]