1. 维护代码健壮

2. 更新项目结构文档
This commit is contained in:
技术老胡
2026-04-27 16:20:41 +08:00
parent 9a16a88640
commit 0e5de50337
198 changed files with 21038 additions and 702 deletions

14
doc/api/legacy/epay.md Normal file
View File

@@ -0,0 +1,14 @@
# ePay 兼容协议归档
这里是 ePay 兼容协议的总入口索引。
## 版本列表
- [ePay V1 文档](./epay_v1.md)
- [ePay V2 文档](./epay_v2.md)
## 说明
- `epay_v1.md` 对应原站点旧版 `doc_old.html`,协议以 `MD5` 为主。
- `epay_v2.md` 对应原站点新版 `doc/index.html`,协议以 `RSA` 为主。
- 其他文档仍可继续引用这个索引页,避免入口分散。

332
doc/api/legacy/epay_v1.md Normal file
View File

@@ -0,0 +1,332 @@
# ePay V1 接口文档整理
> 本文件整理自原版文档 [https://epay.qcjy.cc/doc_old.html](https://epay.qcjy.cc/doc_old.html)
>
> 用途:作为 V1 兼容层和老接口迁移时的协议参考,不包含本项目当前实现细节。
## 1. 协议规则
| 项目 | 值 |
| --- | --- |
| 请求数据格式 | `application/x-www-form-urlencoded` |
| 返回数据格式 | `JSON` |
| 签名算法 | `MD5` |
| 字符编码 | `UTF-8` |
## 2. 接口总览
| 入口 | 说明 |
| --- | --- |
| `submit.php` | 页面跳转支付 |
| `mapi.php` | API 接口支付 |
| `api.php?act=query` | 查询商户信息 |
| `api.php?act=settle` | 查询结算记录 |
| `api.php?act=order` | 查询单个订单 |
| `api.php?act=orders` | 批量查询订单 |
| `api.php?act=refund` | 提交订单退款 |
## 3. 页面跳转支付
### 3.1 接口说明
- 用途:用户前台直接发起支付
- 常见调用方式:`form` 表单提交,或拼成跳转链接
- URL`http://epay.qcjy.cc/submit.php`
- 请求方式:`POST``GET`
- 推荐方式:`POST`
- `type` 不传时,默认进入收银台流程
### 3.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 支付方式 | `type` | 否 | `String` | `alipay` | 支付方式列表 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 异步通知地址 | `notify_url` | 是 | `String` | `http://www.pay.com/notify_url.php` | 服务器异步通知地址 |
| 跳转通知地址 | `return_url` | 是 | `String` | `http://www.pay.com/return_url.php` | 页面跳转通知地址 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 超过 127 个字节会自动截取 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 单位:元,最多 2 位小数 |
| 业务扩展参数 | `param` | 否 | `String` | `没有请留空` | 支付后原样返回 |
| 签名字符串 | `sign` | 是 | `String` | `202cb962ac59075b964b07152d234b70` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `MD5` | 默认为 `MD5` |
### 3.3 说明
- `notify_url` 用于异步通知
- `return_url` 用于支付完成后的前端跳转
- `param` 会在支付完成后原样返回
## 4. API 接口支付
### 4.1 接口说明
- 用途:服务器后端发起支付请求
- URL`http://epay.qcjy.cc/mapi.php`
- 请求方式:`POST`
- 响应通常返回跳转链接、二维码链接或小程序跳转链接中的一种
### 4.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 支付方式 | `type` | 是 | `String` | `alipay` | 支付方式列表 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 异步通知地址 | `notify_url` | 是 | `String` | `http://www.pay.com/notify_url.php` | 服务器异步通知地址 |
| 跳转通知地址 | `return_url` | 否 | `String` | `http://www.pay.com/return_url.php` | 页面跳转通知地址 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 超过 127 个字节会自动截取 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 单位:元,最多 2 位小数 |
| 用户IP地址 | `clientip` | 是 | `String` | `192.168.1.100` | 用户发起支付的 IP |
| 设备类型 | `device` | 否 | `String` | `pc` | 根据 UA 判断,默认 `pc` |
| 业务扩展参数 | `param` | 否 | `String` | `没有请留空` | 支付后原样返回 |
| 签名字符串 | `sign` | 是 | `String` | `202cb962ac59075b964b07152d234b70` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `MD5` | 默认为 `MD5` |
### 4.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | | 失败时返回原因 |
| 订单号 | `trade_no` | `String` | `20160806151343349` | 支付订单号 |
| 支付跳转url | `payurl` | `String` | `http://epay.qcjy.cc/pay/wxpay/202010903/` | 直接跳转该 URL 支付 |
| 二维码链接 | `qrcode` | `String` | `weixin://wxpay/bizpayurl?pr=04IPMKM` | 按链接生成二维码 |
| 小程序跳转url | `urlscheme` | `String` | `weixin://dl/business/?ticket=xxx` | 使用 JS 跳转该 URL |
### 4.4 说明
- `payurl``qrcode``urlscheme` 三者只会返回其中一个
- `device` 和支付方式会影响最终返回值类型
- 返回值为 JSON由调用方自行决定跳转、展示二维码或拉起小程序
## 5. 支付结果通知
### 5.1 通知类型
- 服务器异步通知:`notify_url`
- 页面跳转通知:`return_url`
### 5.2 请求方式
- `GET`
### 5.3 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 易支付订单号 | `trade_no` | 是 | `String` | `20160806151343349021` | 平台订单号 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 支付方式 | `type` | 是 | `String` | `alipay` | 支付方式列表 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 商品金额 |
| 支付状态 | `trade_status` | 是 | `String` | `TRADE_SUCCESS` | 只有 `TRADE_SUCCESS` 才表示成功 |
| 业务扩展参数 | `param` | 否 | `String` | | 业务参数 |
| 签名字符串 | `sign` | 是 | `String` | `202cb962ac59075b964b07152d234b70` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `MD5` | 默认为 `MD5` |
### 5.4 回调响应
- 收到异步通知后,需返回 `success`
- 页面跳转通知主要用于前端展示,不代表后台最终确认逻辑
## 6. MD5 签名算法
1. 将发送或接收到的所有参数按照参数名 ASCII 码从小到大排序。
2. `sign``sign_type` 和空值不参与签名。
3. 将排序后的参数拼接成 `a=b&c=d&e=f` 的形式,参数值不要进行 URL 编码。
4. 将拼接字符串与商户密钥 `KEY` 进行 MD5 加密,得到签名。
```text
sign = md5(a=b&c=d&e=f + KEY)
```
说明:
- `+` 代表字符串拼接,不是字符本身
- MD5 结果为小写
- 具体示例以 SDK 为准
## 7. 支付方式列表
| 调用值 | 描述 |
| --- | --- |
| `alipay` | 支付宝 |
| `wxpay` | 微信支付 |
| `qqpay` | QQ 钱包 |
## 8. 设备类型列表
| 调用值 | 描述 |
| --- | --- |
| `pc` | 电脑浏览器 |
| `mobile` | 手机浏览器 |
| `qq` | 手机 QQ 内浏览器 |
| `wechat` | 微信内浏览器 |
| `alipay` | 支付宝客户端 |
| `jump` | 仅返回支付跳转 URL |
## 9. [API]查询商户信息
### 9.1 接口说明
- URL`http://epay.qcjy.cc/api.php?act=query&pid={商户ID}&key={商户密钥}`
- 操作类型:`query`
### 9.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 操作类型 | `act` | 是 | `String` | `query` | 固定值 |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | 是 | `String` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
### 9.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 商户ID | `pid` | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | `String(32)` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
| 商户状态 | `active` | `Int` | `1` | `1` 为正常,`0` 为封禁 |
| 商户余额 | `money` | `String` | `0.00` | 商户所拥有的余额 |
| 结算方式 | `type` | `Int` | `1` | `1:支付宝,2:微信,3:QQ,4:银行卡` |
| 结算账号 | `account` | `String` | `admin@pay.com` | 结算账号 |
| 结算姓名 | `username` | `String` | `张三` | 结算姓名 |
| 订单总数 | `orders` | `Int` | `30` | 订单总数统计 |
| 今日订单 | `order_today` | `Int` | `15` | 今日订单数量 |
| 昨日订单 | `order_lastday` | `Int` | `15` | 昨日订单数量 |
## 10. [API]查询结算记录
### 10.1 接口说明
- URL`http://epay.qcjy.cc/api.php?act=settle&pid={商户ID}&key={商户密钥}`
- 操作类型:`settle`
### 10.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 操作类型 | `act` | 是 | `String` | `settle` | 固定值 |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | 是 | `String` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
### 10.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `查询结算记录成功!` | 提示信息 |
| 结算记录 | `data` | `Array` | 结算记录列表 | 结算记录数组 |
> 原版文档对 `data` 内部结构只给出“结算记录列表”的说明,没有展开逐字段定义。
## 11. [API]查询单个订单
### 11.1 接口说明
- URL`http://epay.qcjy.cc/api.php?act=order&pid={商户ID}&key={商户密钥}&out_trade_no={商户订单号}`
- 操作类型:`order`
### 11.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 操作类型 | `act` | 是 | `String` | `order` | 固定值 |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | 是 | `String` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
| 系统订单号 | `trade_no` | 选择 | `String` | `20160806151343312` | 平台订单号 |
| 商户订单号 | `out_trade_no` | 选择 | `String` | `20160806151343349` | 商户自定义订单号 |
说明:
- `trade_no``out_trade_no` 二选一即可
- 如果都传入,以 `trade_no` 为准
### 11.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `查询订单号成功!` | 提示信息 |
| 易支付订单号 | `trade_no` | `String` | `2016080622555342651` | 平台订单号 |
| 商户订单号 | `out_trade_no` | `String` | `20160806151343349` | 商户系统内部订单号 |
| 第三方订单号 | `api_trade_no` | `String` | `20160806151343349` | 支付渠道订单号 |
| 支付方式 | `type` | `String` | `alipay` | 支付方式列表 |
| 商户ID | `pid` | `Int` | `1001` | 发起支付的商户ID |
| 创建订单时间 | `addtime` | `String` | `2016-08-06 22:55:52` | 创建时间 |
| 完成交易时间 | `endtime` | `String` | `2016-08-06 22:55:52` | 完成时间 |
| 商品名称 | `name` | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | `String` | `1.00` | 商品金额 |
| 支付状态 | `status` | `Int` | `0` | `1` 表示支付成功,`0` 表示未支付 |
| 业务扩展参数 | `param` | `String` | | 默认留空 |
| 支付者账号 | `buyer` | `String` | | 默认留空 |
## 12. [API]批量查询订单
### 12.1 接口说明
- URL`http://epay.qcjy.cc/api.php?act=orders&pid={商户ID}&key={商户密钥}`
- 操作类型:`orders`
### 12.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 操作类型 | `act` | 是 | `String` | `orders` | 固定值 |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | 是 | `String` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
| 查询订单数量 | `limit` | 否 | `Int` | `20` | 返回订单数量,最大 `50` |
| 页码 | `page` | 否 | `Int` | `1` | 当前查询页码 |
### 12.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `查询结算记录成功!` | 提示信息 |
| 订单列表 | `data` | `Array` | 订单列表 | 订单数组 |
> `data` 中每一项与“查询单个订单”返回结构基本一致。
## 13. [API]提交订单退款
### 13.1 接口说明
- 需要先在商户后台开启订单退款 API 接口开关
- URL`http://epay.qcjy.cc/api.php?act=refund`
- 请求方式:`POST`
### 13.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 商户密钥 | `key` | 是 | `String` | `89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i` | 商户密钥 |
| 易支付订单号 | `trade_no` | 特殊可选 | `String` | `20160806151343349021` | 平台订单号 |
| 商户订单号 | `out_trade_no` | 特殊可选 | `String` | `20160806151343349` | 下单时传入的商户订单号 |
| 退款金额 | `money` | 是 | `String` | `1.50` | 少数通道需要与原订单金额一致 |
说明:
- `trade_no``out_trade_no` 不能同时为空
- 如果都传了,以 `trade_no` 为准
### 13.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `1` | `1` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `退款成功` | 提示信息 |
## 14. SDK 下载
- 下载地址:[`SDK.zip`](https://epay.qcjy.cc/assets/files/SDK.zip?_v=1.3)
- 版本:`V1.3`
## 15. 备注
- 原版文档页面还包含“产品”“关于我们”“联系我们”等站点导航内容,这里不做展开
- 如果需要继续对照更多说明,优先以原站点文档为准

518
doc/api/legacy/epay_v2.md Normal file
View File

@@ -0,0 +1,518 @@
# ePay V2 接口文档整理
> 本文件整理自原版文档 [https://epay.qcjy.cc/doc/index.html](https://epay.qcjy.cc/doc/index.html)
>
> 用途:作为 V2 兼容层和新接口迁移时的协议参考,不包含本项目当前实现细节。
## 1. 协议规则
| 项目 | 值 |
| --- | --- |
| 请求数据格式 | `application/x-www-form-urlencoded` |
| 返回数据格式 | `JSON` |
| 签名算法 | `SHA256WithRSA` |
| 字符编码 | `UTF-8` |
## 2. V2 升级说明
1. V2 全面使用 RSA 签名V1 保留 MD5 签名。
2. V2 改用新的接口地址,支持退款、代付等能力。
3. V2 增加 `timestamp` 参数和返回值,用于时间戳校验。
## 3. RSA 密钥对
- 在商户后台的 API 信息页面生成商户 RSA 密钥对。
- 商户需要妥善保管私钥。
- 对接时通常会同时使用平台公钥和商户私钥。
## 4. 签名规则
### 4.1 请求签名
1. 取所有非空参数。
2. 排除 `sign``sign_type`
3. 排除数组、文件、二进制等非普通字段。
4. 按参数名 ASCII 升序排序。
5.`k=v&k2=v2...` 的方式拼接原文。
6. 使用商户私钥进行 `SHA256WithRSA` 签名。
### 4.2 验签规则
1. 按相同规则整理原文。
2. 使用平台公钥验证签名。
3. 请求和响应都应做签名校验。
## 5. 支付方式列表
| 调用值 | 描述 |
| --- | --- |
| `alipay` | 支付宝 |
| `wxpay` | 微信支付 |
| `qqpay` | QQ 钱包 |
## 6. 设备类型列表
| 调用值 | 描述 |
| --- | --- |
| `pc` | 电脑浏览器 |
| `mobile` | 手机浏览器 |
| `qq` | 手机 QQ 内浏览器 |
| `wechat` | 微信内浏览器 |
| `alipay` | 支付宝客户端 |
## 7. 接口总览
| 入口 | 说明 |
| --- | --- |
| `submit.php` / `/api/pay/submit` | 页面跳转支付 |
| `/api/pay/create` | API 创建订单 |
| `/api/pay/query` | 查询订单 |
| `/api/pay/notify` | 支付结果通知 |
| `/api/pay/refund` | 退款 |
| `/api/pay/refundquery` | 退款查询 |
| `/api/pay/close` | 关闭订单 |
| `/api/merchant/info` | 查询商户信息 |
| `/api/merchant/orders` | 查询商户订单 |
| `/api/transfer/submit` | 提交转账 |
| `/api/transfer/query` | 查询转账 |
| `/api/transfer/balance` | 查询转账余额 |
## 8. 页面跳转支付
### 8.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/submit`
- 用途:前台页面跳转支付
- 请求方式:`POST`
- `type` 可不传,不传时进入收银台
### 8.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 支付方式 | `type` | 否 | `String` | `alipay` | 支付方式列表 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 异步通知地址 | `notify_url` | 是 | `String` | `http://www.pay.com/notify_url.php` | 异步通知地址 |
| 跳转通知地址 | `return_url` | 是 | `String` | `http://www.pay.com/return_url.php` | 页面跳转通知地址 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 单位:元 |
| 业务扩展参数 | `param` | 否 | `String` | | 支付后原样返回 |
| 渠道ID | `channel_id` | 否 | `String` | `1001` | 指定支付渠道 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
## 9. API 创建订单
### 9.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/create`
- 用途:服务器端统一创建订单
- 请求方式:`POST`
### 9.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 接口类型 | `method` | 是 | `String` | `web` | `web``jump``jsapi``app``scan``applet` |
| 设备类型 | `device` | 否 | `String` | `pc` | `pc``mobile``qq``wechat``alipay` |
| 支付方式 | `type` | 是 | `String` | `alipay` | 支付方式列表 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 异步通知地址 | `notify_url` | 是 | `String` | `http://www.pay.com/notify_url.php` | 异步通知地址 |
| 跳转通知地址 | `return_url` | 否 | `String` | `http://www.pay.com/return_url.php` | 页面跳转通知地址 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 单位:元 |
| 用户IP地址 | `clientip` | 否 | `String` | `127.0.0.1` | 用户发起支付的 IP |
| 业务扩展参数 | `param` | 否 | `String` | | 支付后原样返回 |
| 授权码 | `auth_code` | 否 | `String` | | JSAPI / 刷脸类场景使用 |
| 子用户 OPENID | `sub_openid` | 否 | `String` | | 微信相关场景使用 |
| 子应用 APPID | `sub_appid` | 否 | `String` | | 微信相关场景使用 |
| 渠道ID | `channel_id` | 否 | `String` | `1001` | 指定通道 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 9.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 平台订单号 | `trade_no` | `String` | `2016080622555342651` | 易支付订单号 |
| 返回类型 | `pay_type` | `String` | `qrcode` | 返回内容类型 |
| 支付内容 | `pay_info` | `Mixed` | | 跳转链接、二维码内容或 JSAPI 参数 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
### 9.4 `pay_type` 说明
| 值 | 说明 |
| --- | --- |
| `jump` | 跳转链接 |
| `html` | HTML 片段 |
| `qrcode` | 二维码内容 |
| `urlscheme` | 小程序 URL Scheme |
| `jsapi` | JSAPI 参数 |
| `app` | APP 调起参数 |
| `scan` | 扫码支付结果信息 |
| `wxplugin` | 小程序插件参数 |
| `wxapp` | APP 拉起小程序参数 |
## 10. 订单查询
### 10.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/query`
- 请求方式:`POST`
### 10.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 平台订单号 | `trade_no` | 二选一 | `String` | `2016080622555342651` | 易支付订单号 |
| 商户订单号 | `out_trade_no` | 二选一 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 10.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 平台订单号 | `trade_no` | `String` | | 平台订单号 |
| 商户订单号 | `out_trade_no` | `String` | | 商户订单号 |
| 第三方订单号 | `api_trade_no` | `String` | | 渠道订单号 |
| 支付方式 | `type` | `String` | `alipay` | 支付方式 |
| 支付状态 | `status` | `Int` | `1` | `0` 未支付,`1` 已支付,`2` 已退款,`3` 已冻结,`4` 预授权 |
| 商户ID | `pid` | `Int` | `1001` | 商户ID |
| 创建时间 | `addtime` | `String` | `2016-08-06 22:55:52` | 创建时间 |
| 完成时间 | `endtime` | `String` | `2016-08-06 22:55:52` | 完成时间 |
| 商品名称 | `name` | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | `String` | `1.00` | 商品金额 |
| 退款金额 | `refundmoney` | `String` | `0.00` | 已退款金额 |
| 业务扩展参数 | `param` | `String` | | 扩展参数 |
| 支付者账号 | `buyer` | `String` | | 支付者账号 |
| 用户IP | `clientip` | `String` | | 下单 IP |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 11. 支付通知
### 11.1 通知类型
- 异步通知:`notify_url`
- 页面跳转通知:`return_url`
### 11.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 平台订单号 | `trade_no` | 是 | `String` | `2016080622555342651` | 易支付订单号 |
| 商户订单号 | `out_trade_no` | 是 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 支付方式 | `type` | 是 | `String` | `alipay` | 支付方式 |
| 支付状态 | `trade_status` | 是 | `String` | `TRADE_SUCCESS` | 成功状态固定为该值 |
| 创建时间 | `addtime` | 否 | `String` | `2016-08-06 22:55:52` | 创建时间 |
| 完成时间 | `endtime` | 否 | `String` | `2016-08-06 22:55:52` | 完成时间 |
| 商品名称 | `name` | 是 | `String` | `VIP会员` | 商品名称 |
| 商品金额 | `money` | 是 | `String` | `1.00` | 商品金额 |
| 业务扩展参数 | `param` | 否 | `String` | | 业务参数 |
| 支付者账号 | `buyer` | 否 | `String` | | 支付者账号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 11.3 回调响应
- 收到异步通知后,返回 `success`
- 通知时要校验签名,并确认 `trade_status == TRADE_SUCCESS`
## 12. 退款
### 12.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/refund`
- 请求方式:`POST`
### 12.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 平台订单号 | `trade_no` | 二选一 | `String` | `2016080622555342651` | 易支付订单号 |
| 商户订单号 | `out_trade_no` | 二选一 | `String` | `20160806151343349` | 商户系统内部订单号 |
| 退款金额 | `money` | 是 | `String` | `1.50` | 退款金额 |
| 商户退款单号 | `out_refund_no` | 否 | `String` | `R202604210001` | 商户侧退款流水号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 12.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 退款单号 | `refund_no` | `String` | `202604210001` | 平台退款单号 |
| 商户退款单号 | `out_refund_no` | `String` | `R202604210001` | 商户退款单号 |
| 平台订单号 | `trade_no` | `String` | `2016080622555342651` | 易支付订单号 |
| 退款金额 | `money` | `String` | `1.50` | 退款金额 |
| 已退金额 | `reducemoney` | `String` | `1.50` | 累计退款金额 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 13. 退款查询
### 13.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/refundquery`
- 请求方式:`POST`
### 13.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 退款单号 | `refund_no` | 二选一 | `String` | `202604210001` | 平台退款单号 |
| 商户退款单号 | `out_refund_no` | 二选一 | `String` | `R202604210001` | 商户退款单号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 13.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 退款单号 | `refund_no` | `String` | `202604210001` | 平台退款单号 |
| 商户退款单号 | `out_refund_no` | `String` | `R202604210001` | 商户退款单号 |
| 平台订单号 | `trade_no` | `String` | `2016080622555342651` | 易支付订单号 |
| 商户订单号 | `out_trade_no` | `String` | `20160806151343349` | 商户订单号 |
| 退款金额 | `money` | `String` | `1.50` | 退款金额 |
| 已退金额 | `reducemoney` | `String` | `1.50` | 累计退款金额 |
| 退款状态 | `status` | `Int` | `1` | `0` 失败,`1` 成功 |
| 创建时间 | `addtime` | `String` | `2016-08-06 22:55:52` | 创建时间 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 14. 关闭订单
### 14.1 接口说明
- URL`http://epay.qcjy.cc/api/pay/close`
- 请求方式:`POST`
- 仅支持部分支付插件
### 14.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 平台订单号 | `trade_no` | 二选一 | `String` | `2016080622555342651` | 易支付订单号 |
| 商户订单号 | `out_trade_no` | 二选一 | `String` | `20160806151343349` | 商户订单号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 14.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 15. 商户信息
### 15.1 接口说明
- URL`http://epay.qcjy.cc/api/merchant/info`
- 请求方式:`POST`
### 15.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 15.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 商户ID | `pid` | `Int` | `1001` | 商户ID |
| 商户状态 | `status` | `Int` | `1` | 商户状态 |
| 支付状态 | `pay_status` | `Int` | `1` | 支付开关 |
| 结算状态 | `settle_status` | `Int` | `1` | 结算开关 |
| 商户余额 | `money` | `String` | `0.00` | 可用余额 |
| 结算类型 | `settle_type` | `Int` | `1` | `1` 支付宝,`2` 微信,`3` QQ`4` 银行卡 |
| 结算账号 | `settle_account` | `String` | `admin@pay.com` | 结算账号 |
| 结算姓名 | `settle_name` | `String` | `张三` | 结算姓名 |
| 订单总数 | `order_num` | `Int` | `30` | 订单总数 |
| 今日订单 | `order_num_today` | `Int` | `15` | 今日订单数量 |
| 昨日订单 | `order_num_lastday` | `Int` | `15` | 昨日订单数量 |
| 今日交易额 | `order_money_today` | `String` | `100.00` | 今日交易金额 |
| 昨日交易额 | `order_money_lastday` | `String` | `90.00` | 昨日交易金额 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 16. 商户订单
### 16.1 接口说明
- URL`http://epay.qcjy.cc/api/merchant/orders`
- 请求方式:`POST`
### 16.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 偏移量 | `offset` | 否 | `Int` | `0` | 起始偏移 |
| 数量 | `limit` | 否 | `Int` | `20` | 返回条数 |
| 状态 | `status` | 否 | `Int` | `1` | 订单状态筛选 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 16.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 订单数据 | `data` | `Array` | 订单列表 | 订单数组 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 17. 转账提交
### 17.1 接口说明
- URL`http://epay.qcjy.cc/api/transfer/submit`
- 请求方式:`POST`
### 17.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 转账类型 | `type` | 是 | `String` | `alipay` | `alipay``wxpay``qqpay``bank` |
| 收款账号 | `account` | 是 | `String` | `admin@pay.com` | 收款账号 |
| 收款姓名 | `name` | 是 | `String` | `张三` | 收款姓名 |
| 金额 | `money` | 是 | `String` | `1.00` | 转账金额 |
| 备注 | `remark` | 否 | `String` | `测试转账` | 转账备注 |
| 商户转账单号 | `out_biz_no` | 否 | `String` | `T202604210001` | 商户侧流水号 |
| 书签 ID | `bookid` | 否 | `String` | `1` | 账本或预设项标识 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 17.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 转账状态 | `status` | `Int` | `0` | `0` 待处理,后续查询 |
| 平台业务号 | `biz_no` | `String` | `202604210001` | 平台转账业务号 |
| 商户转账单号 | `out_biz_no` | `String` | `T202604210001` | 商户侧流水号 |
| 订单号 | `orderid` | `String` | `202604210001` | 平台订单号 |
| 支付时间 | `paydate` | `String` | `2016-08-06 22:55:52` | 完成时间 |
| 手续费 | `cost_money` | `String` | `0.10` | 扣除费用 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 18. 转账查询
### 18.1 接口说明
- URL`http://epay.qcjy.cc/api/transfer/query`
- 请求方式:`POST`
### 18.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 平台业务号 | `biz_no` | 二选一 | `String` | `202604210001` | 平台转账业务号 |
| 商户转账单号 | `out_biz_no` | 二选一 | `String` | `T202604210001` | 商户侧流水号 |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 18.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 转账状态 | `status` | `Int` | `1` | `0` 处理中,`1` 成功,`2` 失败 |
| 错误信息 | `errmsg` | `String` | | 失败原因 |
| 平台业务号 | `biz_no` | `String` | `202604210001` | 平台转账业务号 |
| 商户转账单号 | `out_biz_no` | `String` | `T202604210001` | 商户侧流水号 |
| 订单号 | `orderid` | `String` | `202604210001` | 平台订单号 |
| 支付时间 | `paydate` | `String` | `2016-08-06 22:55:52` | 完成时间 |
| 金额 | `amount` | `String` | `1.00` | 转账金额 |
| 手续费 | `cost_money` | `String` | `0.10` | 扣除费用 |
| 备注 | `remark` | `String` | `测试转账` | 备注信息 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 19. 转账余额
### 19.1 接口说明
- URL`http://epay.qcjy.cc/api/transfer/balance`
- 请求方式:`POST`
### 19.2 请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- | --- |
| 商户ID | `pid` | 是 | `Int` | `1001` | 商户ID |
| 时间戳 | `timestamp` | 是 | `String` | `1713660000` | 用于时间校验 |
| 签名字符串 | `sign` | 是 | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | 是 | `String` | `SHA256WithRSA` | 签名类型 |
### 19.3 返回结果
| 字段名 | 变量名 | 类型 | 示例值 | 描述 |
| --- | --- | --- | --- | --- |
| 返回状态码 | `code` | `Int` | `0` | `0` 为成功,其它值为失败 |
| 返回信息 | `msg` | `String` | `success` | 提示信息 |
| 可用余额 | `available_money` | `String` | `100.00` | 可转账余额 |
| 转账费率 | `transfer_rate` | `String` | `0.01` | 转账费率 |
| 时间戳 | `timestamp` | `String` | `1713660000` | 返回时间戳 |
| 签名字符串 | `sign` | `String` | `...` | 签名结果 |
| 签名类型 | `sign_type` | `String` | `SHA256WithRSA` | 签名类型 |
## 20. SDK 下载
- 下载地址:[`SDK_2.0.zip`](https://epay.qcjy.cc/assets/files/SDK_2.0.zip)
- 版本:`V2.0`
## 21. 备注
- V2 文档页面还包含更细的接口说明、页面示例和菜单导航,这里只整理对接最关键的协议信息。
- 如果后续需要补充每个接口的示例请求与返回样例,可以继续在本目录补充,但建议保持版本归档方式一致。

View File

@@ -0,0 +1,60 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>正在为您跳转到支付页面,请稍候...</title>
<style type="text/css">
body{margin:0;padding:0}
p{position:absolute;left:50%;top:50%;height:35px;margin:-35px 0 0 -160px;padding:20px;font:bold 16px/30px "宋体",Arial;text-indent:40px;border:1px solid #c5d0dc}
#waiting{font-family:Arial}
</style>
</head>
<body>
<?php
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
/**************************请求参数**************************/
$notify_url = "http://127.0.0.1/SDK/notify_url.php";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//页面跳转同步通知页面路径
$return_url = "http://127.0.0.1/SDK/return_url.php";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//商户订单号
$out_trade_no = $_POST['WIDout_trade_no'];
//商户网站订单系统中唯一订单号,必填
//支付方式可传入alipay,wxpay,qqpay,bank,jdpay
$type = $_POST['type'];
//商品名称
$name = $_POST['WIDsubject'];
//付款金额
$money = $_POST['WIDtotal_fee'];
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array(
"pid" => $epay_config['pid'],
"type" => $type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"out_trade_no" => $out_trade_no,
"name" => $name,
"money" => $money,
);
//建立请求
$epay = new EpayCore($epay_config);
$html_text = $epay->pagePay($parameter);
echo $html_text;
?>
<p>正在为您跳转到支付页面,请稍候...</p>
</body>
</html>

View File

@@ -0,0 +1,205 @@
<?php
/* *
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>彩虹易支付接口测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
*{
margin:0;
padding:0;
}
ul,ol{
list-style:none;
}
.title{
color: #ADADAD;
font-size: 14px;
font-weight: bold;
padding: 8px 16px 5px 10px;
}
.hidden{
display:none;
}
.new-btn-login-sp{
border:1px solid #D74C00;
padding:1px;
display:inline-block;
}
.new-btn-login{
background-color: #ff8c00;
color: #FFFFFF;
font-weight: bold;
border: medium none;
width:82px;
height:28px;
}
.new-btn-login:hover{
background-color: #ffa300;
width: 82px;
color: #FFFFFF;
font-weight: bold;
height: 28px;
}
.bank-list{
overflow:hidden;
margin-top:5px;
}
.bank-list li{
float:left;
width:153px;
margin-bottom:5px;
}
#main{
width:750px;
margin:0 auto;
font-size:14px;
font-family:'宋体';
}
#logo{
background-color: transparent;
background-image: url("images/new-btn-fixed.png");
border: medium none;
background-position:0 0;
width:166px;
height:35px;
float:left;
}
.red-star{
color:#f00;
width:10px;
display:inline-block;
}
.null-star{
color:#fff;
}
.content{
margin-top:5px;
}
.content dt{
width:160px;
display:inline-block;
text-align:right;
float:left;
}
.content dd{
margin-left:100px;
margin-bottom:5px;
}
#foot{
margin-top:10px;
}
.foot-ul li {
text-align:center;
}
.note-help {
color: #999999;
font-size: 12px;
line-height: 130%;
padding-left: 3px;
}
.cashier-nav {
font-size: 14px;
margin: 15px 0 10px;
text-align: left;
height:30px;
border-bottom:solid 2px #CFD2D7;
}
.cashier-nav ol li {
float: left;
}
.cashier-nav li.current {
color: #AB4400;
font-weight: bold;
}
.cashier-nav li.last {
clear:right;
}
.alipay_link {
text-align:right;
}
.alipay_link a:link{
text-decoration:none;
color:#8D8D8D;
}
.alipay_link a:visited{
text-decoration:none;
color:#8D8D8D;
}
</style>
</head>
<body text=#000000 bgColor=#ffffff leftMargin=0 topMargin=4>
<div id="main">
<div id="head">
<dl class="alipay_link">
</dl>
<span class="title">彩虹易支付接口测试</span>
</div>
<div class="cashier-nav">
<ol>
<li class="current">1、确认信息 →</li>
<li>2、点击确认 →</li>
<li class="last">3、确认完成</li>
</ol>
</div>
<form name=alipayment action=epayapi.php method=post target="_blank">
<div id="body" style="clear:left">
<dl class="content">
<dt>商户订单号:</dt>
<dd>
<span class="null-star">*</span>
<input size="30" name="WIDout_trade_no" value="<?php echo date("YmdHis").mt_rand(100,999); ?>"/>
<span>商户网站订单系统中唯一订单号,必填
</span>
</dd>
<dt>商品名称:</dt>
<dd>
<span class="null-star">*</span>
<input size="30" name="WIDsubject" value="测试商品"/>
<span>必填
</span>
</dd>
<dt>付款金额:</dt>
<dd>
<span class="null-star">*</span>
<input size="30" name="WIDtotal_fee" value="1"/>
<span>必填
</span>
</dd>
<dt>支付方式:</dt>
<dd>
<label><input type="radio" name="type" value="alipay" checked="">支付宝</label>&nbsp; <label><input type="radio" name="type" value="qqpay">QQ钱包</label>&nbsp;<label><input type="radio" name="type" value="wxpay">微信支付</label>&nbsp;<label><input type="radio" name="type" value="bank">云闪付</label>
</dd>
<dt></dt>
<dd>
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit" style="text-align:center;">确 认</button>
</span>
</dd>
</dl>
</div>
</form>
<div id="foot">
<ul class="foot-ul">
<li><font class="note-help">如果您点击“确认”按钮,即表示您同意该次的执行操作。 </font></li>
<li>
</li>
</ul>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,154 @@
<?php
/* *
* 彩虹易支付SDK服务类
* 说明:
* 包含发起支付、查询订单、回调验证等功能
*/
class EpayCore
{
private $pid;
private $key;
private $submit_url;
private $mapi_url;
private $api_url;
private $sign_type = 'MD5';
function __construct($config){
$this->pid = $config['pid'];
$this->key = $config['key'];
$this->submit_url = $config['apiurl'].'submit.php';
$this->mapi_url = $config['apiurl'].'mapi.php';
$this->api_url = $config['apiurl'].'api.php';
}
// 发起支付(页面跳转)
public function pagePay($param_tmp, $button='正在跳转'){
$param = $this->buildRequestParam($param_tmp);
$html = '<form id="dopay" action="'.$this->submit_url.'" method="post">';
foreach ($param as $k=>$v) {
$html.= '<input type="hidden" name="'.$k.'" value="'.$v.'"/>';
}
$html .= '<input type="submit" value="'.$button.'"></form><script>document.getElementById("dopay").submit();</script>';
return $html;
}
// 发起支付(获取链接)
public function getPayLink($param_tmp){
$param = $this->buildRequestParam($param_tmp);
$url = $this->submit_url.'?'.http_build_query($param);
return $url;
}
// 发起支付API接口
public function apiPay($param_tmp){
$param = $this->buildRequestParam($param_tmp);
$response = $this->getHttpResponse($this->mapi_url, http_build_query($param));
$arr = json_decode($response, true);
return $arr;
}
// 异步回调验证
public function verifyNotify(){
if(empty($_GET)) return false;
$sign = $this->getSign($_GET);
if($sign === $_GET['sign']){
$signResult = true;
}else{
$signResult = false;
}
return $signResult;
}
// 同步回调验证
public function verifyReturn(){
if(empty($_GET)) return false;
$sign = $this->getSign($_GET);
if($sign === $_GET['sign']){
$signResult = true;
}else{
$signResult = false;
}
return $signResult;
}
// 查询订单支付状态
public function orderStatus($trade_no){
$result = $this->queryOrder($trade_no);
if($result['status']==1){
return true;
}else{
return false;
}
}
// 查询订单
public function queryOrder($trade_no){
$url = $this->api_url.'?act=order&pid=' . $this->pid . '&key=' . $this->key . '&trade_no=' . $trade_no;
$response = $this->getHttpResponse($url);
$arr = json_decode($response, true);
return $arr;
}
// 订单退款
public function refund($trade_no, $money){
$url = $this->api_url.'?act=refund';
$post = 'pid=' . $this->pid . '&key=' . $this->key . '&trade_no=' . $trade_no . '&money=' . $money;
$response = $this->getHttpResponse($url, $post);
$arr = json_decode($response, true);
return $arr;
}
private function buildRequestParam($param){
$mysign = $this->getSign($param);
$param['sign'] = $mysign;
$param['sign_type'] = $this->sign_type;
return $param;
}
// 计算签名
private function getSign($param){
ksort($param);
reset($param);
$signstr = '';
foreach($param as $k => $v){
if($k != "sign" && $k != "sign_type" && $v!=''){
$signstr .= $k.'='.$v.'&';
}
}
$signstr = substr($signstr,0,-1);
$signstr .= $this->key;
$sign = md5($signstr);
return $sign;
}
// 请求外部资源
private function getHttpResponse($url, $post = false, $timeout = 10){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$httpheader[] = "Accept: */*";
$httpheader[] = "Accept-Language: zh-CN,zh;q=0.8";
$httpheader[] = "Connection: close";
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($post){
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}

View File

@@ -0,0 +1,13 @@
<?php
/* *
* 配置文件
*/
//支付接口地址
$epay_config['apiurl'] = 'http://pay.www.com/';
//商户ID
$epay_config['pid'] = '1000';
//商户密钥
$epay_config['key'] = 'WWc3Z2jkK7jhNGPALcGKjHLPK47wRK85';

View File

@@ -0,0 +1,45 @@
<?php
/* *
* 功能:彩虹易支付异步通知页面
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
//计算得出通知验证结果
$epay = new EpayCore($epay_config);
$verify_result = $epay->verifyNotify();
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_GET['out_trade_no'];
//彩虹易支付交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
//支付方式
$type = $_GET['type'];
//支付金额
$money = $_GET['money'];
if ($_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理根据订单号out_trade_no在商户网站的订单系统中查到该笔订单的详细并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
}
//验证成功返回
echo "success";
}
else {
//验证失败
echo "fail";
}
?>

View File

@@ -0,0 +1,55 @@
<?php
/* *
* 功能:彩虹易支付页面跳转同步通知页面
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>支付返回页面</title>
</head>
<body>
<?php
//计算得出通知验证结果
$epay = new EpayCore($epay_config);
$verify_result = $epay->verifyReturn();
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_GET['out_trade_no'];
//支付宝交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
//支付方式
$type = $_GET['type'];
if($_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理根据订单号out_trade_no在商户网站的订单系统中查到该笔订单的详细并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
}
else {
echo "trade_status=".$_GET['trade_status'];
}
echo "<h3>验证成功</h3><br />";
}
else {
//验证失败
echo "<h3>验证失败</h3>";
}
?>
</body>
</html>

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>正在为您跳转到支付页面,请稍候...</title>
<style type="text/css">
body{margin:0;padding:0}
p{position:absolute;left:50%;top:50%;height:35px;margin:-35px 0 0 -160px;padding:20px;font:bold 16px/30px "宋体",Arial;text-indent:40px;border:1px solid #c5d0dc}
#waiting{font-family:Arial}
</style>
</head>
<body>
<?php
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
/**************************请求参数**************************/
$notify_url = "http://127.0.0.1/SDK/notify_url.php";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//页面跳转同步通知页面路径
$return_url = "http://127.0.0.1/SDK/return_url.php";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//商户网站订单系统中唯一订单号,必填
//支付方式可传入alipay,wxpay,qqpay,bank,jdpay
$type = $_POST['type'];
//商品名称
$name = $_POST['name'];
//付款金额
$money = $_POST['money'];
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array(
"type" => $type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"out_trade_no" => $out_trade_no,
"name" => $name,
"money" => $money,
);
//建立请求
$epay = new EpayCore($epay_config);
$html_text = $epay->pagePay($parameter);
echo $html_text;
?>
<p>正在为您跳转到支付页面,请稍候...</p>
</body>
</html>

View File

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="zh-CN">
<body>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<title>彩虹易支付接口测试</title>
<link href="//lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<link rel="stylesheet" href="./assets/css/captcha.css" type="text/css" />
<style>.form-group{margin-bottom:18px} #captcha{margin: auto;margin-bottom:16px}</style>
</head>
<div class="container">
<div class="col-xs-12 col-sm-10 col-lg-8 center-block" style="float: none;">
<div class="page-header">
<h4>彩虹易支付接口测试</h4>
</div>
<div class="panel panel-primary">
<div class="panel-body">
<form name="alipayment" method="POST" action="epayapi.php" class="form-horizontal">
<div class="form-group">
<label class="col-sm-3 control-label">商户订单号</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="out_trade_no" value="<?php echo date("YmdHis").mt_rand(100,999); ?>" autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商品名称</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="name" value="支付测试" autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付金额</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="money" value="1" autocomplete="off">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付方式</label>
<div class="col-sm-8">
<div class="radio">
<label class="i-checks"><input type="radio" name="type" value="alipay" checked="checked"><i></i>支付宝</label>&nbsp;
<label class="i-checks"><input type="radio" name="type" value="wxpay"><i></i>微信支付</label>&nbsp;
<label class="i-checks"><input type="radio" name="type" value="qqpay"><i></i>QQ钱包</label>&nbsp;
<label class="i-checks"><input type="radio" name="type" value="bank"><i></i>云闪付</label>&nbsp;
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-8"><input type="submit" value="确 认" class="btn btn-primary form-control"><br>
</div>
</div>
</form>
</div>
<div class="panel-footer text-center">
<span class="text-muted">此页面只是为了方便商户测试而提供的样例页面,商户可以根据自己网站的需要,按照技术文档编写</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,184 @@
<?php
/* *
* 彩虹易支付SDK服务类
* 说明:
* 包含发起支付、查询订单、回调验证等功能
*/
class EpayCore
{
private $apiurl;
private $pid;
private $platform_public_key;
private $merchant_private_key;
private $sign_type = 'RSA';
function __construct($config){
$this->apiurl = $config['apiurl'];
$this->pid = $config['pid'];
$this->platform_public_key = $config['platform_public_key'];
$this->merchant_private_key = $config['merchant_private_key'];
}
// 发起支付(页面跳转)
public function pagePay($param_tmp, $button='正在跳转'){
$requrl = $this->apiurl.'api/pay/submit';
$param = $this->buildRequestParam($param_tmp);
$html = '<form id="dopay" action="'.$requrl.'" method="post">';
foreach ($param as $k=>$v) {
$html.= '<input type="hidden" name="'.$k.'" value="'.$v.'"/>';
}
$html .= '<input type="submit" value="'.$button.'"></form><script>document.getElementById("dopay").submit();</script>';
return $html;
}
// 发起支付(获取链接)
public function getPayLink($param_tmp){
$requrl = $this->apiurl.'api/pay/submit';
$param = $this->buildRequestParam($param_tmp);
$url = $requrl.'?'.http_build_query($param);
return $url;
}
// 发起支付API接口
public function apiPay($params){
return $this->execute('api/pay/create', $params);
}
// 发起API请求
public function execute($path, $params){
$path = ltrim($path, '/');
$requrl = $this->apiurl.$path;
$param = $this->buildRequestParam($params);
$response = $this->getHttpResponse($requrl, http_build_query($param));
$arr = json_decode($response, true);
if($arr && $arr['code'] == 0){
if(!$this->verify($arr)){
throw new \Exception('返回数据验签失败');
}
return $arr;
}else{
throw new \Exception($arr ? $arr['msg'] : '请求失败');
}
}
// 回调验证
public function verify($arr){
if(empty($arr) || empty($arr['sign'])) return false;
if(empty($arr['timestamp']) || abs(time() - $arr['timestamp']) > 300) return false;
$sign = $arr['sign'];
return $this->rsaPublicVerify($this->getSignContent($arr), $sign);
}
// 查询订单支付状态
public function orderStatus($trade_no){
$result = $this->queryOrder($trade_no);
if($result && $result['status']==1){
return true;
}else{
return false;
}
}
// 查询订单
public function queryOrder($trade_no){
$params = [
'trade_no' => $trade_no,
];
return $this->execute('api/pay/query', $params);
}
// 订单退款
public function refund($out_refund_no, $trade_no, $money){
$params = [
'trade_no' => $trade_no,
'money' => $money,
'out_refund_no' => $out_refund_no,
];
return $this->execute('api/pay/refund', $params);
}
private function buildRequestParam($params){
$params['pid'] = $this->pid;
$params['timestamp'] = time().'';
$mysign = $this->getSign($params);
$params['sign'] = $mysign;
$params['sign_type'] = $this->sign_type;
return $params;
}
// 生成签名
private function getSign($params){
return $this->rsaPrivateSign($this->getSignContent($params));
}
// 获取待签名字符串
private function getSignContent($params){
ksort($params);
$signstr = '';
foreach ($params as $k => $v) {
if(is_array($v) || $this->isEmpty($v) || $k == 'sign' || $k == 'sign_type') continue;
$signstr .= '&' . $k . '=' . $v;
}
$signstr = substr($signstr, 1);
return $signstr;
}
private function isEmpty($value)
{
return $value === null || trim($value) === '';
}
// 商户私钥签名
private function rsaPrivateSign($data){
$key = "-----BEGIN PRIVATE KEY-----\n" .
wordwrap($this->merchant_private_key, 64, "\n", true) .
"\n-----END PRIVATE KEY-----";
$privatekey = openssl_get_privatekey($key);
if(!$privatekey){
throw new \Exception('签名失败,商户私钥错误');
}
openssl_sign($data, $sign, $privatekey, OPENSSL_ALGO_SHA256);
return base64_encode($sign);
}
// 平台公钥验签
private function rsaPublicVerify($data, $sign){
$key = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($this->platform_public_key, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
$publickey = openssl_get_publickey($key);
if (!$publickey) {
throw new \Exception("验签失败,平台公钥错误");
}
$result = openssl_verify($data, base64_decode($sign), $publickey, OPENSSL_ALGO_SHA256);
return $result === 1;
}
// 请求外部资源
private function getHttpResponse($url, $post = false, $timeout = 10){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$httpheader[] = "Accept: */*";
$httpheader[] = "Accept-Language: zh-CN,zh;q=0.8";
$httpheader[] = "Connection: close";
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($post){
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}

View File

@@ -0,0 +1,19 @@
<?php
/* *
* 配置文件
*/
$epay_config = [
//支付接口地址
'apiurl' => 'http://pay.www.com/',
//商户ID
'pid' => '1000',
//平台公钥
'platform_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApHG7SIN16fd9uZfjZunZuAReemVQe5YNxBhbkogsRkZ86xuDVDCmhRXEzw7Ta3tXPnMIFRJFdjOCfFVarqcOLICtBiiZZ7Y4D6aIMhmOSliIJ3qWUnU75Wr2WMTIJ1o2pnPmczQ2YjAAy1DtQCc/qs35j24zuNYZw2WluSdiMckPFgge93RK6cq/Feqfuzq7y+m87x02gxbbTGVf24YH2f7H9qZSKCxRXHQoVIWTlyHULcY3OY+1CVdU2SKlIWHJ31eoPznXBLUo0UB0rNZnYrHG2mIlD2S119UTwZwx9WTG/v7Cb2lHVybjfL5/KLitddfqcLjJsYXh6KhEtsO6CwIDAQAB',
//商户私钥
'merchant_private_key' => 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCBIB1e5lAYtFyXq5I8UIQ6KidYZcWkn0SwVS8Rk0SNZVrvL/UJk6Q1zkJs4pUCykTBS/tTrP2rNPOsK1VO/AQHIzhvAujsv7UK2LptcsuNRPCF5GYxndQnOawAGKNQKsMuNcDzyuyTMbZIBEYSRWIoU3dMz4wWEFso/VdVS4uKTZWZnBOeCDdzDAJ7TwbmaOkT919DfZbXAoMH9n3sG4BMpqQExTDoFY6dq6EPXCWVZgoUfecAgNKSfX5TagSUaAxq4eF5vsUfvj+LFpYIrIssmSVErtZuRXLHWVSEbsNxdDPNuS3BtxWEY7GRPF9RJevtoC5L5LN7Gn+RYCqZNZv7AgMBAAECggEAEA6ZTb11hQzwsrUAM1s5MNkgbsABIDk6BnTMAfMpRC1awyxYhqoDHTnFTYWuTVwvyUW/PtGKnelbdTPSS5x6jRSr0N+GGDgNYF2Wbpkm3Ni6Jubsb7ZrtRED5Y3Vc9j4JTKZXaJaDEJ9+LNSBLWiFi0C7zH5U/O8ElB8CrxL4ZUaZv0JgV9NcDpS5jAtpPSyBLrdhbEheertJiHQU0V+FaaXq8taNcYIA/Xim6+vqcFFtUA3PBBTXHn/NE5uasXi+N+De4IT+dBmirzVSZjviDPr9RSBUi6KPUSXx6eDa26SKeEqJZvBtlASDM+ZC0yhDz0eyV49tMjk7eF5fnCIwQKBgQC2nEiR2t5Q02tHaKesZMRGOwxEyMFQj6viDW+Yffg59Tu6QYuqdR558/zmzWcJFMH3DVQzTXpzPNU9TA3/yT/Q42iKBP70K8O9tJO+gd/jLHLqgw90Wyh2b4FJXXQqVQMkxGBQKRfNi6krWigJNBs8Z8IhczorQHYNbBIUI05poQKBgQC1BRI8zKf+85GuJXTxJ93RXbkOQMUIhT/6eyFTZvCLC9Qqba1/1ouNbtmxNsFFIC+n+rHRN9btKt90m9YFvXD90m3y34M88QjvaQcA1Kng9Q6Xia8DizpVIYGAR/Pfn36BZQeHHVz9te6QJ9hVOgZO3GG62Echd9M/rwOzuU14GwKBgFGtS2Q5khByz9wLuluIYqXLCWzGoninGkksm0qIpXs+7e0cHh0q72u6rtaI7toH983Jn2ym7esXPYWCPAy5dhq3bG23WFXcMVvrpd2i94IDwo6T+lif4VRAAYLQEwJQLezHDREtoCDmo87pL1kWfkwhWJpfkJgB6AuO1/M763mhAoGBAIPEGj9plcwOzndeSp6UL3IMb/1BBmuqWyTgZiTIpMYCKUFtLsMEj/a2vv2xZsQDpsz2vmMV63weHiRKn2L0QABzIZeOPYCpz6A96lwfcT0QBLwn+95vhVmclyCiv5GDDtnviag/poYD3ZDPgDihkR/sabNRZY2mJH6RzfcQJqULAoGALkSkqr0bplhfyAA6bO42l64th4YUqwouTEgp7rE36wQ28THj0a88HLU4CeiCR6LQAEGpKk04Vst97C1Q5ZeD5rc4xKINl8K5HUH8SsdMDq3r22xur2qr4kanW4hf2P/ehOeEKGuhSL+ZWeApvt1c0rqH4MQT1/7qR/dO2MikkMg=',
];

View File

@@ -0,0 +1,45 @@
<?php
/* *
* 功能:彩虹易支付异步通知页面
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
//计算得出通知验证结果
$epay = new EpayCore($epay_config);
$verify_result = $epay->verify($_GET);
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_GET['out_trade_no'];
//彩虹易支付交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
//支付方式
$type = $_GET['type'];
//支付金额
$money = $_GET['money'];
if ($_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理根据订单号out_trade_no在商户网站的订单系统中查到该笔订单的详细并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
}
//验证成功返回
echo "success";
}
else {
//验证失败
echo "fail";
}
?>

View File

@@ -0,0 +1,17 @@
<?php
/**
* 查询订单
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
$trade_no = '2024071519404366151';
$epay = new EpayCore($epay_config);
try{
$result = $epay->queryOrder($trade_no);
}catch(Exception $e){
echo $e->getMessage();
exit;
}
print_r($result);

View File

@@ -0,0 +1,19 @@
<?php
/**
* 退款
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
$out_refund_no = date("YmdHis").rand(111,999);
$trade_no = '2024071519404366151';
$money = '1.00';
$epay = new EpayCore($epay_config);
try{
$result = $epay->refund($out_refund_no, $trade_no, $money);
}catch(Exception $e){
echo $e->getMessage();
exit;
}
print_r($result);

View File

@@ -0,0 +1,55 @@
<?php
/* *
* 功能:彩虹易支付页面跳转同步通知页面
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*/
require_once("lib/epay.config.php");
require_once("lib/EpayCore.class.php");
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>支付返回页面</title>
</head>
<body>
<?php
//计算得出通知验证结果
$epay = new EpayCore($epay_config);
$verify_result = $epay->verify($_GET);
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_GET['out_trade_no'];
//支付宝交易号
$trade_no = $_GET['trade_no'];
//交易状态
$trade_status = $_GET['trade_status'];
//支付方式
$type = $_GET['type'];
if($_GET['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理根据订单号out_trade_no在商户网站的订单系统中查到该笔订单的详细并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
}
else {
echo "trade_status=".$_GET['trade_status'];
}
echo "<h3>验证成功</h3><br />";
}
else {
//验证失败
echo "<h3>验证失败</h3>";
}
?>
</body>
</html>