PHPackages                             riverslei/payment - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Payment Processing](/categories/payments)
4. /
5. riverslei/payment

ActiveLibrary[Payment Processing](/categories/payments)

riverslei/payment
=================

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

v5.1.0(6y ago)2.4k155.5k↓34.2%665[16 issues](https://github.com/helei112g/payment/issues)[8 PRs](https://github.com/helei112g/payment/pulls)1MITPHPPHP &gt;=7.0

Since Jun 16Pushed 3y ago162 watchersCompare

[ Source](https://github.com/helei112g/payment)[ Packagist](https://packagist.org/packages/riverslei/payment)[ Docs](http://helei112g.github.io/payment)[ RSS](/packages/riverslei-payment/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (2)Versions (49)Used By (1)

Payment使用文档
===========

[](#payment使用文档)

JetBrains OS licenses
=====================

[](#jetbrains-os-licenses)

`payment` had been being developed with PhpStorm under the free JetBrains Open Source license(s) granted by JetBrains s.r.o., hence I would like to express by thanks here.

[![Stargazers over time](./jetbrains-variant-4.svg)](https://www.jetbrains.com/?from=ABC)

[![Software license](https://camo.githubusercontent.com/3b83d6d1b3b377ba8f41c1e4ac197ad0dc056a760ec10c1f6484aa7b617fcc5a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f68656c6569313132672f7061796d656e742e737667)](LICENSE)[![Latest development](https://camo.githubusercontent.com/fbd0d64a834c65c0454f037d9012c00c63a4c836819b10a576b9273deac8923d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f767072652f7269766572736c65692f7061796d656e742e737667)](https://packagist.org/packages/riverslei/payment)[![Monthly installs](https://camo.githubusercontent.com/3535208b5d71d3a0168e83449a3dcc2e05763097b6efa38a72cbe8a864048c10/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646d2f7269766572736c65692f7061796d656e742e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/riverslei/payment/stats)

老版本文档：

新版本文档如下

Stargazers over time
--------------------

[](#stargazers-over-time)

[![Stargazers over time](https://camo.githubusercontent.com/69d4bcfe786c10d62e4d9ef3aa98995f1cca12834c7ed34c02918feeb5b320d6/68747470733a2f2f7374617263686172742e63632f68656c6569313132672f7061796d656e742e737667)](https://starchart.cc/helei112g/payment)

---

联系&amp;打赏
=========

[](#联系打赏)

[打赏名单](SUPPORT.md)

请大家使用时根据示例代码来，有bug直接提交 `issue`；**提供付费技术支持**。

[![](https://camo.githubusercontent.com/562c6fc48c1d82a28a7f58ec81f70ead050d6af17394f219d1c554521d186b44/68747470733a2f2f6461797574616c6b2e636e2f696d672f7075622d71722e6a7065673f763d313233)](https://camo.githubusercontent.com/562c6fc48c1d82a28a7f58ec81f70ead050d6af17394f219d1c554521d186b44/68747470733a2f2f6461797574616c6b2e636e2f696d672f7075622d71722e6a7065673f763d313233)

[![](https://camo.githubusercontent.com/a7e0697dda7d017b593773926d16cbfe726f0eb25dcfb7046444313dd6c6ef5d/68747470733a2f2f6461797574616c6b2e636e2f696d672f7061792d71722e6a706567)](https://camo.githubusercontent.com/a7e0697dda7d017b593773926d16cbfe726f0eb25dcfb7046444313dd6c6ef5d/68747470733a2f2f6461797574616c6b2e636e2f696d672f7061792d71722e6a706567)

目录
==

[](#目录)

- [公告](#%E5%85%AC%E5%91%8A)
    - [重要通知](#%E9%87%8D%E8%A6%81%E9%80%9A%E7%9F%A5)
    - [计划](#%E8%AE%A1%E5%88%92)
- [Payment解决什么问题](#Payment%E8%A7%A3%E5%86%B3%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98)
- [如何使用](#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8)
    - [安装](#%E5%AE%89%E8%A3%85)
    - [项目集成](#%E9%A1%B9%E7%9B%AE%E9%9B%86%E6%88%90)
    - [设计支付系统](#%E8%AE%BE%E8%AE%A1%E6%94%AF%E4%BB%98%E7%B3%BB%E7%BB%9F)
    - [支持的接口](#%E6%94%AF%E6%8C%81%E7%9A%84%E6%8E%A5%E5%8F%A3)
- [贡献指南](#%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)
    - [代码设计](#%E4%BB%A3%E7%A0%81%E8%AE%BE%E8%AE%A1)
    - [接入支付指南](#%E6%8E%A5%E5%85%A5%E6%94%AF%E4%BB%98%E6%8C%87%E5%8D%97)
- [第三方文档](#%E7%AC%AC%E4%B8%89%E6%96%B9%E6%96%87%E6%A1%A3)
- [License](#License)

公告
==

[](#公告)

第三方支付的一些重要更新提示，以及项目相关的计划信息。

重要通知
----

[](#重要通知)

1. 2019-04: **提醒：微信CA证书进行了更新，请更新项目到最新版本。否则5月29日后，将无法支付**

> 官方公告： [https://pay.weixin.qq.com/index.php/public/cms/content\_detail?lang=zh&amp;id=56602](https://pay.weixin.qq.com/index.php/public/cms/content_detail?lang=zh&id=56602)

计划
--

[](#计划)

1. 2019/3/28 开始重构整个项目，doing... ...

> 重构后的项目与 `4.x` 以前的版本不兼容，请使用者注意！

Payment解决什么问题
=============

[](#payment解决什么问题)

`Payment` 的目的是简化大家在对接主流第三方时需要频繁去阅读第三方文档，还经常遇到各种问题。`Payment` 将所有第三方的接口进行了合理的建模分类，对大家提供统一的接入入口，大家只需要关注自身业务并且支付系统设计上。

目前已经集成：支付宝、微信、招商绝大部分功能。也欢迎各位贡献代码。 [贡献指南](#%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)

如何使用
====

[](#如何使用)

安装
--

[](#安装)

当前 `Payment` 项目仅支持 `PHP version > 7.0` 的版本，并且仅支持通过 `composer` 进行安装。

**需要 `PHP` 安装以下扩展：**

```
- ext-curl
- ext-mbstring
- ext-bcmath
- package-Guzzle
```

**composer安装方式：**

直接在命令行下安装：

```
composer require "riverslei/payment:*"
```

通过项目配置文件方式安装：

```
"require": {
    "riverslei/payment": "*"
}
```

项目集成
----

[](#项目集成)

按照上面的步骤完成安装后，即可在项目中使用。

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

**APP支付demo**

```
$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 \Payment\Client(\Payment\Client::WECHAT, $wxConfig);
    $res    = $client->pay(\Payment\Client::WX_CHANNEL_APP, $payData);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
    exit;
} catch (\Payment\Exceptions\GatewayException $e) {
    echo $e->getMessage();
    var_dump($e->getRaw());
    exit;
} catch (\Payment\Exceptions\ClassNotFoundException $e) {
    echo $e->getMessage();
    exit;
} catch (Exception $e) {
    echo $e->getMessage();
    exit;
}
```

**异步/同步通知**

```
// 自己实现一个类，继承该接口
class TestNotify implements \Payment\Contracts\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 \Payment\Client(\Payment\Client::ALIPAY, $config);
    $xml = $client->notify($callback);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
    exit;
} catch (\Payment\Exceptions\GatewayException $e) {
    echo $e->getMessage();
    exit;
} catch (\Payment\Exceptions\ClassNotFoundException $e) {
    echo $e->getMessage();
    exit;
} catch (Exception $e) {
     echo $e->getMessage();
     exit;
 }
```

从上面的例子简单总结下，所有的支持的能力，通过 `\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',
];
```

#### APP支付请求参数

[](#app支付请求参数)

> 对应channel： \\Payment\\Client::ALI\_CHANNEL\_APP

字段解释必须amount订单总金额，单位为元，精确到小数点后两位，取值范围\[0.01,100000000\]Ygoods\_type商品主类型 :0-虚拟类商品,1-实物类商品Ybody对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。Ysubject商品的标题/交易标题/订单标题/订单关键字等。Yproduct\_code销售产品码，商家和支付宝签约的产品码Ntrade\_no商户网站唯一订单号Npromo\_params优惠参数 注：仅与支付宝协商后可用Nreturn\_params公用回传参数，如果请求时传递了该参数，则返回给商户时会回传该参数。Nextend\_params业务扩展参数Nstore\_id商户门店编号Next\_user\_info外部指定买家Nbusiness\_params商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式Ntime\_expire该笔订单允许的最晚付款时间，逾期将关闭交易。时间戳N#### 条码支付请求参数

[](#条码支付请求参数)

> 对应channel： \\Payment\\Client::ALI\_CHANNEL\_BAR

字段解释必须trade\_no商户订单号,64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复Yauth\_code支付授权码，2530开头的长度为1624位的数字，实际字符串长度以开发者获取的付款码长度为准Yamount订单总金额，单位为元Ysubject订单标题Ybody订单描述Yscene支付场景 条码支付，取值：bar\_code（默认）；声波支付，取值：wave\_codeNproduct\_code销售产品码Nbuyer\_id买家的支付宝用户 id，如果为空，会从传入的码值信息中获取买家 IDNseller\_id如果该值为空，则默认为商户签约账号对应的支付宝用户IDNsettle\_currency商户指定的结算币种，默认：CNYNdiscountable\_amount参与优惠计算的金额，单位为元Ngoods\_detail订单包含的商品列表信息，json格式，其它说明详见商品明细说明Noperator\_id商户操作员编号Nstore\_id商户门店编号Nterminal\_id商户机具终端编号Nextend\_params业务扩展参数Ntime\_expire该笔订单允许的最晚付款时间，逾期将关闭交易Nauth\_confirm\_mode预授权确认模式，授权转交易请求中传入，适用于预授权转交易业务使用，目前只支持PRE\_AUTH(预授权产品码)Nterminal\_params商户传入终端设备相关信息，具体值要和支付宝约定Npromo\_params优惠明细参数，通过此属性补充营销参数Nadvance\_payment\_type支付模式类型,若值为ENJOY\_PAY\_V2表示当前交易允许走先享后付2.0垫资N#### 查询对账单请求参数

[](#查询对账单请求参数)

字段解释必须bill\_type账单类型，默认是 tradeNbill\_date账单时间：日账单格式为yyyy-MM-ddY#### 扫码支付请求参数

[](#扫码支付请求参数)

> 对应channel： \\Payment\\Client::ALI\_CHANNEL\_QR

字段解释必须trade\_no商户订单号,64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复Yseller\_id如果该值为空，则默认为商户签约账号对应的支付宝用户IDNamount订单总金额，单位为元Ydiscountable\_amount参与优惠计算的金额，单位为元Nsubject订单标题Ygoods\_detail订单包含的商品列表信息，json格式，其它说明详见商品明细说明Nbody订单描述Yoperator\_id商户操作员编号Nstore\_id商户门店编号Nterminal\_id商户机具终端编号Nextend\_params业务扩展参数Ntime\_expire该笔订单允许的最晚付款时间，逾期将关闭交易Nsettle\_info描述结算信息，json格式，详见结算参数说明Nmerchant\_order\_no商户原始订单号，最大长度限制32位Nbusiness\_params商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式N#### 手机网站支付请求参数

[](#手机网站支付请求参数)

> 对应channel： \\Payment\\Client::ALI\_CHANNEL\_WAP

字段解释必须body对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。Ysubject商品的标题/交易标题/订单标题/订单关键字等。Ytrade\_no商户网站唯一订单号Ytime\_expire该笔订单允许的最晚付款时间，逾期将关闭交易，时间戳Namount订单总金额，单位为元，精确到小数点后两位，取值范围\[0.01,100000000\]Nauth\_token针对用户授权接口，获取用户相关数据时，用于标识用户授权关系注：若不属于支付宝业务经理提供签约服务的商户，暂不对外提供该功能，该参数使用无效Ngoods\_type商品主类型：0—虚拟类商品，1—实物类商品Yreturn\_params公用回传参数，如果请求时传递了该参数，则返回给商户时会回传该参数Nquit\_url添加该参数后在h5支付收银台会出现返回按钮，可用于用户付款中途退出并返回到该参数指定的商户网站地址。Npromo\_params优惠参数注：仅与支付宝协商后可用Nextend\_params业务扩展参数，详见下表的“业务扩展参数说明”Nstore\_id商户门店编号Nspecified\_channel指定渠道，目前仅支持传入pcredit若由于用户原因渠道不可用，用户可选择是否用其他渠道支付。Nbusiness\_params商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式Next\_user\_info外部指定买家N#### 电脑网站支付请求参数

[](#电脑网站支付请求参数)

> 对应channel： \\Payment\\Client::ALI\_CHANNEL\_WEB

字段解释必须trade\_no商户网站唯一订单号Yamount订单总金额，单位为元，精确到小数点后两位，取值范围\[0.01,100000000\]Nbody对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。Ysubject商品的标题/交易标题/订单标题/订单关键字等。Ytime\_expire该笔订单允许的最晚付款时间，逾期将关闭交易，时间戳Ngoods\_detailreturn\_params公用回传参数，如果请求时传递了该参数，则返回给商户时会回传该参数Nextend\_params业务扩展参数，详见下表的“业务扩展参数说明”Ngoods\_type商品主类型：0—虚拟类商品，1—实物类商品Ypromo\_params优惠参数注：仅与支付宝协商后可用Nroyalty\_info描述分账信息，json格式，详见分账参数说明Nsub\_merchant间连受理商户信息体，当前只对特殊银行机构特定场景下使用此字段Nstore\_id商户门店编号Nqr\_pay\_modePC扫码支付的方式，支持前置模式和，默认是2Nqrcode\_width商户自定义二维码宽度Nsettle\_info描述结算信息，json格式，详见结算参数说明Ninvoice\_info开票信息Nagreement\_sign\_params签约参数，支付后签约场景使用Nintegration\_type请求后页面的集成方式Nrequest\_from\_url请求来源地址。如果使用ALIAPP的集成方式，用户中途取消支付会返回该地址。Nbusiness\_params商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式Next\_user\_info外部指定买家N#### 交易查询请求参数

[](#交易查询请求参数)

字段解释必须trade\_no订单支付时传入的商户订单号,和支付宝交易号不能同时为空。trade\_no,transaction\_id如果同时存在优先取transaction\_idYtransaction\_id支付宝交易号，和商户订单号不能同时为空Yquery\_options查询选项，商户通过上送该字段来定制查询返回信息Norg\_pid银行间联模式下有用，其它场景请不要使用N#### 退款请求参数

[](#退款请求参数)

字段解释必须trade\_no订单支付时传入的商户订单号,和支付宝交易号不能同时为空。trade\_no,transaction\_id如果同时存在优先取transaction\_idYtransaction\_id支付宝交易号，和商户订单号不能同时为空Yrefund\_fee需要退款的金额，该金额不能大于订单金额,单位为元，支持两位小数Yrefund\_currency订单退款币种信息，默认 CNYNreason退款的原因说明Nrefund\_no标识一次退款请求，同一笔交易多次退款需要保证唯一，如需部分退款，则此参数必传。Yoperator\_id商户的操作员编号Nstore\_id商户的门店编号Nterminal\_id商户的终端编号Ngoods\_detail退款包含的商品列表信息，Json格式。其它说明详见：“商品明细说明”Nrefund\_royalty\_parameters退分账明细信息Norg\_pid银行间联模式下有用，其它场景请不要使用N#### 退款查询请求参数

[](#退款查询请求参数)

字段解释必须trade\_no订单支付时传入的商户订单号,和支付宝交易号不能同时为空。trade\_no,transaction\_id如果同时存在优先取transaction\_idYtransaction\_id支付宝交易号，和商户订单号不能同时为空Yrefund\_no请求退款接口时，传入的退款请求号，如果在退款请求时未传入，则该值为创建交易时的外部交易号Yorg\_pid银行间联模式下有用，其它场景请不要使用N#### 关闭交易请求参数

[](#关闭交易请求参数)

字段解释必须trade\_no订单支付时传入的商户订单号,和支付宝交易号不能同时为空Ytransaction\_id该交易在支付宝系统中的交易流水号。最短 16 位，最长 64 位。和transaction\_id不能同时为空，如果同时传了 transaction\_id和 trade\_no，则以 transaction\_id为准Yoperator\_id卖家端自定义的的操作员 IDN#### 取消交易请求参数

[](#取消交易请求参数)

字段解释必须trade\_no订单支付时传入的商户订单号,和支付宝交易号不能同时为空Ytransaction\_id该交易在支付宝系统中的交易流水号。最短 16 位，最长 64 位。和transaction\_id不能同时为空，如果同时传了 transaction\_id和 trade\_no，则以 transaction\_id为准Y> 这个接口与 关闭交易 测试了一下，效果是一样的。具体场景不太清楚，但是官方文档描述是在当面付的时候使用

#### 转账到支付宝请求参数

[](#转账到支付宝请求参数)

字段解释必须trans\_no商户转账唯一订单号Ypayee\_type收款方账户类型。默认：ALIPAY\_LOGONID [详见](https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer)Ypayee\_account收款方账户。与payee\_type配合使用Yamount转账金额，单位：元。Ypayer\_show\_name付款方姓名Npayee\_real\_name收款方真实姓名Nremark转账备注N#### 查询转账到支付宝请求参数

[](#查询转账到支付宝请求参数)

字段解释必须trans\_no商户转账唯一订单号Ytransaction\_id支付宝转账单据号：和商户转账唯一订单号不能同时为空。当和商户转账唯一订单号同时提供时，将用本参数进行查询，忽略商户转账唯一订单号。Y### 微信

[](#微信)

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

**配置文件模板**

```
$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支付，可以设置该值，返回到指定页面
];
```

#### 支付请求参数

[](#支付请求参数)

> 对应channel： \\Payment\\Client::WX\_CHANNEL\_APP、WX\_CHANNEL\_BAR、WX\_CHANNEL\_LITE、WX\_CHANNEL\_PUB、WX\_CHANNEL\_QR、WX\_CHANNEL\_WAP

字段解释必须subject商品简单描述，该字段须严格按照规范传递，具体请见[参数规定](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_2)Ybody单品优惠字段(暂未上线)Ytrade\_no商户系统内部的订单号,32个字符内、可包含字母, 其他说明见[商户订单号](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_2)Yamount订单总金额，单位为元Yclient\_ip必须传正确的用户端IP,支持ipv4、ipv6格式，获取方式详见[获取用户ip指引](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_5)Ydevice\_info终端设备号(门店号或收银设备ID)，注意：PC网页或公众号内支付请传"WEB"Nreturn\_param附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据Ntime\_expire订单失效时间，时间戳Ngoods\_tag商品标记，代金券或立减优惠功能的参数，说明详见[代金券或立减优惠](https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_1)Nscene\_info该字段用于上报支付的场景信息，具体见微信文档N使用时，自行使用上面的字段构建好一个数组，并传入到 `\Payment\Client` 实例对应的方法中。后面均是相同，不在重复。

#### 账单请求参数

[](#账单请求参数)

字段解释必须bill\_date对账单日期Ybill\_typeALL（默认值），返回当日所有订单信息（不含充值退款订单）SUCCESS，返回当日成功支付的订单（不含充值退款订单）REFUND，返回当日退款订单（不含充值退款订单） RECHARGE\_REFUND，返回当日充值退款订单N#### 关闭交易请求参数

[](#关闭交易请求参数-1)

字段解释必须trade\_no商户系统内部订单号，要求32个字符内，且在同一个商户号下唯一。Y#### 撤销交易请求参数

[](#撤销交易请求参数)

字段解释必须trade\_no商户系统内部的订单号,transaction\_id、trade\_no二选一，如果同时存在优先级：transaction\_id&gt; trade\_noYtransaction\_id微信的订单号，优先使用Y#### 退款请求参数

[](#退款请求参数-1)

字段解释必须transaction\_id微信生成的订单号，在支付通知中有返回Ytrade\_no商户系统内部订单号，要求32个字符内，且在同一个商户号下唯一。transaction\_id、trade\_no二选一，如果同时存在优先级：transaction\_id&gt; trade\_noYrefund\_no商户系统内部的退款单号，商户系统内部唯一 ，同一退款单号多次请求只退一笔。Ytotal\_fee订单总金额，单位为元Yrefund\_fee退款总金额，订单总金额，单位为元Yrefund\_desc若商户传入，会在下发给用户的退款消息中体现退款原因Nrefund\_account仅针对老资金流商户使用N#### 退款查询请求参数

[](#退款查询请求参数-1)

字段解释必须transaction\_id微信订单号查询的优先级是： refund\_id &gt; refund\_no &gt; transaction\_id &gt; trade\_noYtrade\_no商户系统内部订单号，要求32个字符内 ，且在同一个商户号下唯一。Yrefund\_no商户系统内部的退款单号，商户系统内部唯一，同一退款单号多次请求只退一笔。Yrefund\_id微信生成的退款单号，在申请退款接口有返回Yoffset偏移量，当部分退款次数超过10次时可使用，表示返回的查询结果从这个偏移量开始取记录N#### 资金账单请求参数

[](#资金账单请求参数)

字段解释必须bill\_date下载对账单的日期，格式：20140603Ybill\_type账单的资金来源账户：Basic 基本账户 Operation 运营账户 Fees 手续费账户Y#### 交易查询请求参数

[](#交易查询请求参数-1)

字段解释必须transaction\_id微信的订单号，建议优先使用Ytrade\_no商户系统内部订单号，要求32个字符内 ，且在同一个商户号下唯一Y#### 付款到零钱请求参数

[](#付款到零钱请求参数)

字段解释必须channel付款的渠道 bank:付款到银行；account:付款到账号Ydevice\_info微信支付分配的终端设备号Ntrans\_no商户订单号，需保持唯一性(只能是字母或者数字，不能包含有其它字符)Yopenid商户appid下，某用户的openidYcheck\_nameNO\_CHECK：不校验真实姓名;FORCE\_CHECK：强校验真实姓名Yre\_user\_name收款用户真实姓名。如果check\_name设置为FORCE\_CHECK，则必填用户真实姓名Yamount企业付款金额，单位为元Ydesc企业付款备注，必填。注意：备注中的敏感词会被转成字符\*Yclient\_ip该IP同在商户平台设置的IP白名单中的IP没有关联，该IP可传用户端或者服务端的IP。Y#### 付款到银行请求参数

[](#付款到银行请求参数)

字段解释必须channel付款的渠道 bank:付款到银行；account:付款到账号Ytrans\_no商户订单号，需保持唯一性(只能是字母或者数字，不能包含有其它字符)Yenc\_bank\_no收款方银行卡号（采用标准RSA算法，公钥由微信侧提供）,详见[获取RSA加密公钥API](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7)Yenc\_true\_name收款方用户名（采用标准RSA算法，公钥由微信侧提供）Ybank\_code银行卡所在开户行编号,详见[银行编号列表](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4)Yamount企业付款金额，单位为元Ydesc企业付款到银行卡付款说明,即订单备注N#### 付款到零钱/银行查询请求参数

[](#付款到零钱银行查询请求参数)

字段解释必须trans\_no商户订单号，需保持唯一（只允许数字\[09\]或字母\[AZ\]和\[a~z\]最短8位，最长32位）Y### 招商银行

[](#招商银行)

**配置文件模板**

```
$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支付，可以设置该值，返回到指定页面
];
```

#### 支付请求参数

[](#支付请求参数-1)

字段解释必须date订单的日期，时间戳Ytrade\_no订单号,6-32位的数字和字母组合，由商户生成Yamount格式：xxxx.xx 固定两位小数，最大11位整数Ytime\_expire过期时候的时间戳Yreturn\_param发送成功支付结果通知时，将原样返回商户Nbody显示在PC端扫码支付页面，pc支付才需要该参数Nclient\_ip商户取得的客户IP，如果有多个IP用逗号”,”分隔。Nsub\_mch\_id当前订单为商户的二级商户的订单时需要传送Nsub\_mch\_name当前订单为商户的二级商户的订单时需要传送Nsub\_mch\_tp\_code当前订单为商户的二级商户的订单时需要传送；必须为数字或字母Nsub\_mch\_tp\_name当前订单为商户的二级商户的订单时需要传送Nmode\_type默认不设限制，允许微信支付。Nagr\_no客户协议号Nmerchant\_serial\_no协议开通请求流水号，开通协议时必填。Nuser\_id用于标识商户用户的唯一IDNmobile手机号码Nlon经度Nlat纬度Nrisk\_level用户在商户系统内风险等级标识N#### 查询公钥请求参数

[](#查询公钥请求参数)

> 不需要参数，直接条用即可

#### 退款请求参数

[](#退款请求参数-2)

字段解释必须date商户订单日期，支付时的订单日期 格式：yyyyMMddYtrade\_no商户订单号，支付时的订单号Yrefund\_no退款流水号,商户生成，同一笔订单内，同一退款流水号只能退款一次。可用于防重复退款。Yrefund\_fee退款金额,格式xxxx.xx，单位元Yreason退款描述Noperator\_id商户结账系统的操作员号，选填，若填了则会对操作员号和密码进行校验，若不填则不校验。N#### 查询订单请求参数

[](#查询订单请求参数)

字段解释必须type查询类型，A：按银行订单流水号查询（默认） B：按商户订单日期和订单号查询Ntransaction\_id银行订单流水号,type=A时必填Ydate商户订单日期，格式：yyyyMMddYtrade\_notype=B时必填商户订单号Noperator\_id商户结账系统的操作员号N#### 已结账单请求参数

[](#已结账单请求参数)

字段解释必须mode查询模式， bank：按照银行日期查询，默认； mch：按照商户日期查询Ystart\_time开始日期，时间戳Yend\_time结束日期，时间戳Yoperator\_id操作员号,商户结账系统的操作员号Ynext\_key\_value续传键值,长度只能为0或40；首次查询填“空”；后续查询，按应答报文中返回的nextKeyValue值原样传入。N#### 退款查询请求参数

[](#退款查询请求参数-2)

字段解释必须type查询类型 A：按银行退款流水号查单笔（默认） B：按商户订单号+商户退款流水号查单笔 C: 按商户订单号查退款Ytrade\_no商户订单号Ydate商户订单日期，时间戳Yrefund\_no商户退款流水号长度不超过20位Ybank\_serial\_no银行退款流水号长度不超过20位Y#### 对账单查询请求参数

[](#对账单查询请求参数)

字段解释必须date商户订单日期，时间戳Ymessage\_key交易流水，合作方内部唯一流水Y设计支付系统
------

[](#设计支付系统)

`Payment` 解决了对接第三方渠道的各种问题，但是一个合理的支付完整系统该如何设计？估计大家还有很多疑问。关于支付系统的设计大家可以参考该项目：

这是我与小伙伴开源的另外一个关于电商的项目，里边对电商的各个模块设计进行了详细的描述。

支持的接口
-----

[](#支持的接口)

对应到第三方的具体接口

### 支付宝

[](#支付宝-1)

- [条码支付](https://docs.open.alipay.com/194/106039/)
- [扫码支付](https://docs.open.alipay.com/194/106078/)
- [APP支付](https://docs.open.alipay.com/204/105297/)
- [H5支付](https://docs.open.alipay.com/203/105285/)
- [电脑网站支付](https://docs.open.alipay.com/270/105899/)
- [退款](https://docs.open.alipay.com/api_1/alipay.trade.refund)
- [关闭交易](https://docs.open.alipay.com/api_1/alipay.trade.close)
- [撤销交易](https://docs.open.alipay.com/api_1/alipay.trade.cancel) 条码/扫码支付会用到
- [交易查询](https://docs.open.alipay.com/api_1/alipay.trade.query)
- [退款查询](https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query)
- [下载对账单](https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query)
- [转账到支付宝](https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer)
- [支付宝转账查询](https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query/)
- [交易创建](https://docs.open.alipay.com/api_1/alipay.trade.create) 条码/扫码支付会用到

### 微信

[](#微信-1)

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

- [付款码支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [JSAPI支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [Native支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [APP支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [H5支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [小程序支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1)
- [退款](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_4&index=4)
- [关闭交易](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_3&index=3)
- [撤销交易](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_11&index=3)
- [交易查询](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_2&index=2)
- [退款查询](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_5&index=5)
- [下载对账单](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_6&index=6)
- [下载资金账单](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_18&index=7)
- [转账到银行卡](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2) 该接口还有些问题待处理
- [转账到微信零钱](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)
- [银行转账查询](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3)
- [微信转账查询](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3)

### 招商

[](#招商)

- [APP支付](http://openhome.cmbchina.com/PayNew/pay/doc/cell/app/SDKPayAPI)
- [H5支付](http://openhome.cmbchina.com/PayNew/pay/doc/cell/H5/OneCardPayAPI)
- [PC扫码支付](http://openhome.cmbchina.com/PayNew/pay/doc/cell/pc/GeneratePayPageAPI)
- [二维码支付](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QRcodePayAPI)
- [退款](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/RefundAPI)
- [交易查询](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QuerySingleOrderAPI)
- [退款查询](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QuerySettledRefund)
- [查询协议](http://openhome.cmbchina.com/PayNew/pay/doc/cell/app/QueryProtocolAPI)
- [取消协议](http://openhome.cmbchina.com/PayNew/pay/doc/cell/app/CancelProtocolAPI)
- [查询入账明细](http://openhome.cmbchina.com/PayNew/pay/doc/cell/app/RecordedDetailsAPI)
- [下载退款对账单](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/RefundQueryAPI)
- [下载已结账单for商户](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QuerySettledOrderByMerchantDat)
- [下载已结账单for银行](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QuerySettledOrderByBankDate)
- [下载对账单](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/DownloadRecordedDetails)
- [查询招行公钥](http://openhome.cmbchina.com/PayNew/pay/doc/cell/QRcode/QueryKeyAPI)

贡献指南
====

[](#贡献指南)

代码设计
----

[](#代码设计)

整个代码结构的设计，待补充

开发指南
----

[](#开发指南)

接入一个新的能力该如何操作，待补充

第三方文档
=====

[](#第三方文档)

- [支付宝](https://docs.open.alipay.com/api_1)
- [微信](https://pay.weixin.qq.com/wiki/doc/api/index.html)
- [招商银行](http://openhome.cmbchina.com/paynew/pay/Home)

License
=======

[](#license)

The code for Payment is distributed under the terms of the MIT license (see [LICENSE](LICENSE)).

###  Health Score

50

—

FairBetter than 95% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity61

Solid adoption and visibility

Community36

Small or concentrated contributor base

Maturity71

Established project with proven stability

 Bus Factor1

Top contributor holds 96.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~30 days

Recently: every ~22 days

Total

48

Last Release

2197d ago

Major Versions

v2.7.3 → v3.0.02017-03-07

v3.1.1 → v4.0.02017-06-19

v3.1.4 → v4.0.12017-07-05

v3.1.5 → v4.x-dev2019-12-17

v4.x-dev → v5.0.02020-02-03

PHP version history (4 changes)v1.0PHP &gt;=5.5

v1.2PHP &gt;=5.4

v2.7.0PHP &gt;=5.6

v5.0.0PHP &gt;=7.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/63c4d9f7dc7843e87ec78f2523d57b998f5451075f32ba6eb35a7ff5b611314c?d=identicon)[helei112g](/maintainers/helei112g)

---

Top Contributors

[![helei112g](https://avatars.githubusercontent.com/u/10877127?v=4)](https://github.com/helei112g "helei112g (423 commits)")[![xzusoft](https://avatars.githubusercontent.com/u/12249515?v=4)](https://github.com/xzusoft "xzusoft (6 commits)")[![webxiaohua](https://avatars.githubusercontent.com/u/7285101?v=4)](https://github.com/webxiaohua "webxiaohua (2 commits)")[![daydaygo](https://avatars.githubusercontent.com/u/3986303?v=4)](https://github.com/daydaygo "daydaygo (1 commits)")[![hank789](https://avatars.githubusercontent.com/u/2181409?v=4)](https://github.com/hank789 "hank789 (1 commits)")[![chenkby](https://avatars.githubusercontent.com/u/13486227?v=4)](https://github.com/chenkby "chenkby (1 commits)")[![rocboss](https://avatars.githubusercontent.com/u/11001145?v=4)](https://github.com/rocboss "rocboss (1 commits)")[![shilcheng](https://avatars.githubusercontent.com/u/5350546?v=4)](https://github.com/shilcheng "shilcheng (1 commits)")[![sunnyalways](https://avatars.githubusercontent.com/u/29905063?v=4)](https://github.com/sunnyalways "sunnyalways (1 commits)")[![cuminlo](https://avatars.githubusercontent.com/u/4970189?v=4)](https://github.com/cuminlo "cuminlo (1 commits)")[![bolechen](https://avatars.githubusercontent.com/u/195015?v=4)](https://github.com/bolechen "bolechen (1 commits)")

---

Tags

alipayalipaysdkcmbpaymentwechat-payweixin-paysdkalipayweixin

###  Code Quality

TestsCodeception

### Embed Badge

![Health badge](/badges/riverslei-payment/health.svg)

```
[![Health](https://phpackages.com/badges/riverslei-payment/health.svg)](https://phpackages.com/packages/riverslei-payment)
```

###  Alternatives

[fantasystudio/easypay

Wechat and Alipay payment SDK

383.4k](/packages/fantasystudio-easypay)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
