myttyy/hyperf-payment

支付宝支付、微信支付、招商一网通支付php SDK。方便快速接入,最完整的开源支付 php sdk

1.0.7 2021-04-22 07:49 UTC

This package is auto-updated.

Last update: 2024-09-22 15:36:25 UTC


README

  • 基于helei112g/payment改造后为hyperf编写的一个支付组件。感谢Leo dayugog@gmail.com大佬编写的优秀库类

  • 感谢helei112g/payment的改造参考,此版本重新适配swoole4.6.x+hyperf2.x

  • 微信支付目前使用V2接口,预计下一版全面更新为V3接口

项目集成

  • 安装
composer require myttyy/hyperf-payment
  • 发布配置

发布后的配置文件在 config/autoload/payment.php

php bin/hyperf.php vendor:publish hyperf/payment
  • 使用

按照上述步骤完成安装后,即可在项目中使用。

use \myttyy\Hyperf\Payment\Client;

对于整个过程,提供了唯一的入口类 \myttyy\Hyperf\Payment\Client,每个渠道都只介绍 APP支付异步/同步通知 如何接入。会重点说明每个请求支持的参数。

  • 开放库类映射表
  • APP支付示例
use \myttyy\Hyperf\Payment\Client;
use \myttyy\Hyperf\Payment\Contracts\IPayNotify;
use \myttyy\Hyperf\Payment\Exceptions\GatewayException;
use \myttyy\Hyperf\Payment\Exceptions\ClassNotFoundException;

$config = [
    // 配置信息,各个渠道的配置模板见对应子目录
];

// 请求参数,完整参数见具体表格
$payData = [
    'body'         => 'test body',
    'subject'      => 'test subject',
    'trade_no'     => 'trade no',// 自己实现生成
    'time_expire'  => time() + 600, // 表示必须 600s 内付款
    'amount'       => '5.52', // 微信沙箱模式,需要金额固定为3.01
    'return_param' => '123',
    'client_ip'    => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1', // 客户地址
];

// 使用
try {
    $client = new Client(Client::WECHAT, $wxConfig);
    $res    = $client->pay(Client::WX_CHANNEL_APP, $payData);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
    exit;
} catch (GatewayException $e) {
    echo $e->getMessage();
    var_dump($e->getRaw());
    exit;
} catch (ClassNotFoundException $e) {
    echo $e->getMessage();
    exit;
} catch (Exception $e) {
    echo $e->getMessage();
    exit;
}
  • 异步/同步通知
use \myttyy\Hyperf\Payment\Client;
use \myttyy\Hyperf\Payment\Contracts\IPayNotify;
use \myttyy\Hyperf\Payment\Exceptions\GatewayException;
use \myttyy\Hyperf\Payment\Exceptions\ClassNotFoundException;

// 自己实现一个类,继承该接口
class TestNotify implements IPayNotify
{
    /**
     * 处理自己的业务逻辑,如更新交易状态、保存通知数据等等
     * @param string $channel 通知的渠道,如:支付宝、微信、招商
     * @param string $notifyType 通知的类型,如:支付、退款
     * @param string $notifyWay 通知的方式,如:异步 async,同步 sync
     * @param array $notifyData 通知的数据
     * @return bool
     */
    public function handle(
        string $channel,
        string $notifyType,
        string $notifyWay,
        array $notifyData
    ) {
        //var_dump($channel, $notifyType, $notifyWay, $notifyData);exit;
        return true;
    }
}

// 配置信息,各个渠道的配置模板见对应子目录
$config = [
    
];

// 实例化继承了接口的类
$callback = new TestNotify();

try {
    $client = new Client(Client::ALIPAY, $config);
    $xml = $client->notify($callback);
} catch (\InvalidArgumentException $e) {
    echo $e->getMessage();
    exit;
} catch (GatewayException $e) {
    echo $e->getMessage();
    exit;
} catch (ClassNotFoundException $e) {
    echo $e->getMessage();
    exit;
} catch (\Exception $e) {
     echo $e->getMessage();
     exit;
}

从上面的例子简单总结,所有的支持功能都通过 \myttyy\Hyperf\Payment\Client 对外暴露方法;所有需要的常量也在这个类中进行了定义。其次需要一个 $config,关于config的模板,在每个渠道下面查看。最后一个传入请求的参数,完整的参数会在每个渠道中列出,需要说明的是这些参数名字根据第三方文档部分进行了修改。在使用时请注意。

参数选项说明:

  • Y: 必填
  • N: 非必须

支付宝

  • 配置文件模板
$config = [
    'use_sandbox' => true, // 是否使用沙盒模式

    'app_id'    => '2016073100130857',
    'sign_type' => 'RSA2', // RSA  RSA2


    // 支付宝公钥字符串
    'ali_public_key' => '',

    // 自己生成的密钥字符串
    'rsa_private_key' => '',

    'limit_pay' => [
        //'balance',// 余额
        //'moneyFund',// 余额宝
        //'debitCardExpress',// 	借记卡快捷
        //'creditCard',//信用卡
        //'creditCardExpress',// 信用卡快捷
        //'creditCardCartoon',//信用卡卡通
        //'credit_group',// 信用支付类型(包含信用卡卡通、信用卡快捷、花呗、花呗分期)
    ], // 用户不可用指定渠道支付当有多个渠道时用“,”分隔

    // 与业务相关参数
    'notify_url' => 'https://dayutalk.cn/notify/ali',
    'return_url' => 'https://dayutalk.cn',
];
  • 目前实现的支付渠道

截至2021年3月16日 09:41:13

APP支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::ALI_CHANNEL_APP

条码支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::ALI_CHANNEL_BAR

查询对账单请求参数

扫码支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::ALI_CHANNEL_QR

手机网站支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::ALI_CHANNEL_WAP

电脑网站支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::ALI_CHANNEL_WEB

交易查询请求参数

退款请求参数

退款查询请求参数

关闭交易请求参数

取消交易请求参数

此接口与关闭交易进行了测试,效果相同。具体场景不太清楚,但是官方文档描述是在当面付时使用

转账到支付宝请求参数

查询转账到支付宝请求参数

微信

对于每个微信支持的能力,并不是所有参数都支持了,有些参数在大多数场景下并不需要使用。如果确实需要,请自行对源码进行修改。

配置文件模板

$config = [
    'use_sandbox' => false, // 是否使用 微信支付仿真测试系统

    'app_id'       => 'wxxxxxxxx',  // 公众账号ID
    'sub_appid'    => 'wxxxxxxxx',  // 公众子商户账号ID
    'mch_id'       => '123123123', // 商户id
    'sub_mch_id'   => '123123123', // 子商户id
    'md5_key'      => '23423423dsaddasdas', // md5 秘钥
    'app_cert_pem' => 'apiclient_cert.pem',
    'app_key_pem'  => 'apiclient_key.pem',
    'sign_type'    => 'MD5', // MD5  HMAC-SHA256
    'limit_pay'    => [
        //'no_credit',
    ], // 指定不能使用信用卡支付   不传入,则均可使用
    'fee_type' => 'CNY', // 货币类型  当前仅支持该字段

    'notify_url' => 'https://dayutalk.cn/v1/notify/wx',

    'redirect_url' => 'https://dayutalk.cn/', // 如果是h5支付,可以设置该值,返回到指定页面
];

支付请求参数

对应渠道: \myttyy\Hyperf\Payment\Client::WX_CHANNEL_APP、WX_CHANNEL_BAR、WX_CHANNEL_LITE、WX_CHANNEL_PUB、WX_CHANNEL_QR、WX_CHANNEL_WAP

使用时,自行使用上述字段构建一个数组,并传入到 \myttyy\Hyperf\Payment\Client 实例对应的方法中。后面均是相同,不再重复。

账单请求参数

关闭交易请求参数

撤销交易请求参数

退款请求参数

退款查询请求参数

资金账单请求参数

交易查询请求参数

付款到零钱请求参数

  • 伪代码
  $orderInfo = [
    'channel' => 'account',
    'trans_no' => '',
    'openid' => '',
    'check_name' => 'NO_CHECK',
    're_user_name' => '',
    'amount' => '', // 企业付款金额,单位为元
    'desc' => '',
    'client_ip' => '',
    'device_info' => '',
  ];
  $client = new Client(Client::);
  $client->transfer($orderInfo);

付款到银行请求参数

付款到零钱/银行查询请求参数

招商银行

配置文件模板

$config = [
    'use_sandbox' => true, // 是否使用 招商测试系统

    'branch_no' => 'xxx',  // 商户分行号,4位数字
    'mch_id'    => 'xxxx', // 商户号,6位数字
    'mer_key'   => 'xxxxxx', // 秘钥16位,包含大小写字母 数字

    // 招商的公钥,建议每天凌晨2:15发起查询招行公钥请求更新公钥。
    'cmb_pub_key' => 'xxxxx',

    'op_pwd'    => 'xxxxx', // 操作员登录密码。
    'sign_type' => 'SHA-256', // 签名算法,固定为“SHA-256”
    'limit_pay' => 'A', // 允许支付的卡类型,默认对支付卡种不做限制,储蓄卡和信用卡均可支付   A:储蓄卡支付,即禁止信用卡支付

    'notify_url' => 'https://dayutalk.cn/notify/cmb', // 支付成功的回调

    'sign_notify_url' => 'https://dayutalk.cn/notify/cmb', // 成功签约结果通知地址
    'sign_return_url' => 'https://dayutalk.cn', // 成功签约结果通知地址

    'return_url' => 'https://dayutalk.cn', // 如果是h5支付,可以设置该值,返回到指定页面
];

支付请求参数

查询公钥请求参数

不需要参数,直接调用即可

退款请求参数

查询订单请求参数

已结账单请求参数

退款查询请求参数

对账单查询请求参数

支持的接口

对应到支付原生的具体接口

支付宝

微信

支持 普通商户与服务商两个版本

招商

原始服务文档

许可证

Payment代码在MIT许可证的条款下分发(见 LICENSE)。