统一下单
接口URL
{{api_host}}/orders/unified
请求方式
POST
Content-Type
form-data
请求Body参数
参数 | 示例值 | 是否必填 | 参数描述 |
---|---|---|---|
total_amount | 100 | 必填 | 金额 |
out_trade_no | P0490012000089 | 必填 | 商户自定义订单号 |
notify_url | http://api.mp_admin.test/api/orders/notify | 必填 | 异步回调地址 |
return_url | https://www.baidu.com | 必填 | 同步回调地址 |
gateway | 1 | 必填 | 平台支付网关 |
attach | id=1&a=b&b=c&name=志远 | 必填 | 额外参数 |
subject | 支付宝余额宝 | 必填 | 商品标题 |
body | 理财首选余额宝 | 必填 | 商品描述 |
成功响应示例
{
"code": 0,
"data": {
"appid": "100001",
"expired_at": "2020-10-12 21:03:07",
"expired_in": 599,
"out_trade_no": "P0490012000089",
"qrcode_url": "",
"sign": "170EE10B27AF9BFA7EBF80304F0BDB26",
"total_amount": 100,
"trade_no": "DD1602507187082143885",
"web_url": "http://scsys_admin.test/web/orders/payment?trade_no=DD1602507187082143885"
},
"message": "success"
}
参数 | 示例值 | 参数描述 |
---|---|---|
code | 0 | 状态码,为0时表示成功,其他为失败。-1表示通用错误状态码 |
data | - | - |
data.appid | 100001 | 商户号 |
data.expired_at | 2020-10-12 21:03:07 | 订单失效时间 |
data.expired_in | 599 | 订单有效剩余时间,单位秒 |
data.out_trade_no | P0490012000089 | 商户订单号 |
data.qrcode_url | - | 支付二维码URL |
data.sign | 170EE10B27AF9BFA7EBF80304F0BDB26 | 签名 |
data.total_amount | 100 | 订单金额 |
data.trade_no | DD1602507187082143885 | 平台订单号 |
data.web_url | http://scsys_admin.test/web/orders/payment?trade_no=DD1602507187082143885 | 平台支付地址 |
message | success | 详细信息 |
错误响应示例
{
"code": -1,
"data": [],
"message": "签名不能为空"
}
参数 | 示例值 | 参数描述 |
---|---|---|
code | -1 | 状态码,为0时表示成功,其他为失败。-1表示通用错误状态码 |
data | {} | 返回数据 |
message | 签名不能为空 | 详细信息 |
订单查询
接口URL
{{api_host}}/orders/query?trade_no=DD1601386113652389498&out_trade_no=TS1601386113555026343
请求方式
GET
Content-Type
form-data
请求Query参数
参数 | 示例值 | 是否必填 | 参数描述 |
---|---|---|---|
trade_no | DD1601386113652389498 | 选填 | 平台订单号,与商户订单号二选一 |
out_trade_no | TS1601386113555026343 | 选填 | 商户订单号,与平台订单号二选一 |
成功响应示例
{
"code": 0,
"data": {
"appid": "100001",
"expired_at": "2020-09-30 21:29:33",
"expired_in": -1,
"out_trade_no": "TS1601386113555026343",
"pay_time": null,
"sign": "EB8A1A7289FBF10F05CDE0B1F53DF83C",
"total_amount": "100.00",
"trade_no": "DD1601386113652389498",
"trade_state": "CLOSED",
"trade_state_cn": "已关闭"
},
"message": "success"
}
参数 | 示例值 | 参数描述 |
---|---|---|
code | 0 | 状态码,为0时表示成功,其他为失败。-1表示通用错误状态码 |
data | - | 返回数据 |
data.appid | 100001 | 商户号 |
data.expired_at | 2020-09-30 21:29:33 | 订单失效时间 |
data.expired_in | -1 | 订单有效剩余时间,单位秒 |
data.out_trade_no | TS1601386113555026343 | 商户订单号 |
data.pay_time | - | 用户支付完成时间 |
data.sign | EB8A1A7289FBF10F05CDE0B1F53DF83C | 签名 |
data.total_amount | 100.00 | 订单金额 |
data.trade_no | DD1601386113652389498 | 平台订单号 |
data.trade_state | CLOSED | 用户支付状态 |
data.trade_state_cn | 已关闭 | 用户支付状态中文 |
message | success | 详细信息 |
签名生成
sign 签名生成的步骤
第一步
设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
- 参数名ASCII码从小到大排序(字典序)
- 如果参数的值为空不参与签名
- 参数名区分大小写
- 验证调用返回或微信主动通知签名时,传入的 sign 参数不参与签名,将生成的签名与该 sign 值作校验
第二步
在 stringA 最后加入&key=secret
拼接上商户后台的密钥,得到 stringSignTemp 字符串,并对 stringSignTemp 进行MD5运算,将得到 sign 值,最后将 sign 值进行大写转换。
注意事项
参数中的 appid、sign 不参与签名
PHP 示例代码
/**
* @param array $data 参数
* @param string $secret 商户密钥
* @return string 签名
*/
public static function sign(array $data, string $secret): string
{
$result = [];
foreach ($data as $key => $value) {
if (trim((string)$value) === '')
continue;
$result[$key] = $value;
}
ksort($result);
return strtoupper(md5(urldecode(http_build_query($result)) . '&key=' . $secret));
}