Velo Pay API 文档
本文档仅用于技术对接 Velo Pay 使用,包含完整的接口说明、签名算法及请求响应规范。
签名算法
签名采用 MD5 加密算法,步骤如下:
1
获取密钥
可在商户后台查看并获取支付密钥。
2
数据拼接
按固定顺序进行拼接,拼接顺序如下:
拼接格式
mid=&ts=&mo=&amount=&key=
若有不存在的字段,则直接拼接空字符串即可。
拼接示例:
- 所有数据均存在:
mid=123&ts=1773141596042&mo=432GZBO8M624KMGX&amount=100.00&key=bhFaaskVPx9GjxWRgv4DuXbGV5sBGKvi - 假设 amount 字段不存在:
mid=123&ts=1773141596042&mo=432GZBO8M624KMGX&amount=&key=bhFaaskVPx9GjxWRgv4DuXbGV5sBGKvi
3
数据签名
- 将拼接好的数据进行 MD5 加密得到签名值 sign(32位)
- 签名校验忽略大小写
请求相关
本文所有请求均遵守以下规范:
| 项目 | 说明 |
|---|---|
| 网关 | https://api.veloshops.online |
| Request URL | 网关/接口URL |
| Request Method | POST |
| Request Headers | content-type: application/json;charset=UTF-8 |
| Request Body | JSON 字符串 |
响应相关
本文所有请求的响应结果均遵守以下格式:
响应格式
{
"code": 0,
"message": "success",
"data": {...}
}
code等于 0 则代表下单成功code不等于 0 则代表当前下单失败message请求结果描述data表示下单成功后的数据集,具体数据格式见接口描述- 当下单失败时,
data为空
异步回调相关
本文内的所有异步回调遵守上文中的请求相关中的规范,商户接收到请求后的响应规范如下:
- HTTP Status: 200
响应状态 200 则默认回调成功。若商户响应非 200 则会安排下一次自动推送异步回调。
注意事项
异步回调可能存在多次回调的情况,商户请自行注意处理重复回调后的幂等性。
收款接口
收款下单
POST
/portal/payment/create
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| amount | string | 是 | 金额 | 最大支持两位小数 |
| name | string | 是 | 用户姓名 | - |
| phone | string | 是 | 用户手机号 | - |
| string | 是 | 用户邮箱 | - | |
| userId | string | 是 | 用户ID | - |
| notifyUrl | string | 是 | 异步通知地址 | - |
| version | string | 是 | 接口版本 | 固定值 01 |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"amount": "string",
"name": "string",
"phone": "string",
"email": "string",
"userId": "string",
"notifyUrl": "string",
"version": "string",
"ts": "string",
"sign": "string"
}
返回结果
| 参数名 | 类型 | 中文名 | 说明 |
|---|---|---|---|
| code | integer | 响应状态 | 0 响应成功,非 0 则为失败 |
| message | string | 响应描述 | - |
| data | object | 响应数据 | - |
| » mid | string | 商户ID | - |
| » mo | string | 商户订单号 | - |
| » po | string | 平台订单号 | - |
| » amount | string | 订单金额 | - |
| » payUrl | string | 收银台地址 | - |
响应示例
{
"code": "integer",
"message": "string",
"data": {
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string",
"payUrl": "string"
}
}
收款查询
POST
/portal/payment/query
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| version | string | 是 | 接口版本 | 固定值 01 |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"version": "string",
"ts": "string",
"sign": "string"
}
返回结果
| 参数名 | 类型 | 中文名 | 说明 |
|---|---|---|---|
| code | integer | 响应状态 | 0 响应成功,非 0 则为失败 |
| message | string | 响应描述 | - |
| data | object | 响应数据 | - |
| » mid | string | 商户ID | - |
| » mo | string | 商户订单号 | - |
| » po | string | 平台订单号 | - |
| » amount | string | 订单金额 | - |
| » realAmount | string | 实际交易金额 | - |
| » status | string | 订单状态 | 1 待付款 2 成功 3 失败 |
| » payTime | number | 支付时间 | 毫秒级时间戳 |
| » utr | string | UTR | - |
响应示例
{
"code": "integer",
"message": "string",
"data": {
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string",
"realAmount": "string",
"status": "string",
"payTime": "number",
"utr": "string"
}
}
收款异步通知
POST
/收款数据内提供的异步通知地址
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| po | string | 是 | 平台订单号 | - |
| amount | string | 是 | 订单金额 | - |
| realAmount | string | 是 | 实际交易金额 | - |
| status | string | 是 | 订单状态 | 1 待付款 2 成功 3 失败 |
| payTime | number | 否 | 支付时间 | 毫秒级时间戳 |
| utr | string | 否 | UTR | - |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string",
"realAmount": "string",
"status": "string",
"payTime": "number",
"utr": "string",
"ts": "string",
"sign": "string"
}
付款接口
付款下单
POST
/portal/payout/create
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| amount | string | 是 | 下单金额 | 最大支持两位小数 |
| name | string | 是 | 用户名称 | - |
| phone | string | 是 | 用户手机号 | - |
| string | 是 | 用户邮箱 | - | |
| userId | string | 是 | 用户ID | - |
| card | string | 是 | 受益人卡号 | - |
| bankName | string | 是 | 银行名称 | - |
| ifsc | string | 是 | IFSC Code | - |
| notifyUrl | string | 是 | 异步通知地址 | - |
| version | string | 是 | 接口版本 | 固定值 01 |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"amount": "string",
"name": "string",
"phone": "string",
"email": "string",
"userId": "string",
"card": "string",
"bankName": "string",
"ifsc": "string",
"notifyUrl": "string",
"version": "string",
"ts": "string",
"sign": "string"
}
返回结果
| 参数名 | 类型 | 中文名 | 说明 |
|---|---|---|---|
| code | string | 响应状态 | 0 响应成功,非 0 则为失败 |
| message | string | 响应描述 | - |
| data | object | 响应数据 | - |
| » mid | string | 商户ID | - |
| » mo | string | 商户订单号 | - |
| » po | string | 平台订单号 | - |
| » amount | string | 订单金额 | - |
响应示例
{
"code": "string",
"message": "string",
"data": {
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string"
}
}
付款查询
POST
/portal/payout/query
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| version | string | 是 | 接口版本 | 固定值 01 |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"version": "string",
"ts": "string",
"sign": "string"
}
返回结果
| 参数名 | 类型 | 中文名 | 说明 |
|---|---|---|---|
| code | string | 响应状态 | 0 响应成功,非 0 则为失败 |
| message | string | 响应描述 | - |
| data | object | 响应数据 | - |
| » mid | string | 商户ID | - |
| » mo | string | 商户订单号 | - |
| » po | string | 平台订单号 | - |
| » amount | string | 订单金额 | - |
| » status | string | 订单状态 | 1 待付款 2 成功 3 失败 |
| » description | string | 状态描述 | - |
| » payTime | number | 支付时间 | 毫秒级时间戳 |
| » utr | string | UTR | - |
响应示例
{
"code": "string",
"message": "string",
"data": {
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string",
"status": "string",
"description": "string",
"payTime": 0,
"utr": "string"
}
}
付款异步通知
POST
/付款数据内提供的异步通知地址
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| mo | string | 是 | 商户订单号 | - |
| po | string | 是 | 平台订单号 | - |
| amount | string | 是 | 订单金额 | - |
| status | string | 是 | 订单状态 | 1 待付款 2 成功 3 失败 |
| description | string | 是 | 状态描述 | - |
| payTime | number | 否 | 支付时间 | 毫秒级时间戳 |
| utr | string | 否 | UTR | - |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"mo": "string",
"po": "string",
"amount": "string",
"status": "string",
"description": "string",
"payTime": "number",
"utr": "string",
"ts": "string",
"sign": "string"
}
余额查询
POST
/portal/balance/query
请求参数
| 参数名 | 类型 | 必选 | 中文名 | 说明 |
|---|---|---|---|---|
| mid | string | 是 | 商户ID | - |
| version | string | 是 | 接口版本 | 固定值 01 |
| ts | string | 是 | 毫秒级时间戳 | - |
| sign | string | 是 | 签名 | - |
请求示例
{
"mid": "string",
"version": "string",
"ts": "string",
"sign": "string"
}
返回结果
| 参数名 | 类型 | 中文名 | 说明 |
|---|---|---|---|
| code | string | 响应状态 | 0 响应成功,非 0 则为失败 |
| message | string | 响应描述 | - |
| data | object | 响应数据 | - |
| » balance | string | 可用余额 | - |
| » waitSettled | string | 待结算余额 | - |
响应示例
{
"code": "string",
"message": "string",
"data": {
"balance": "string",
"waitSettled": "string"
}
}