Appearance
授信结果通知
接口说明
系统异步通知授信审批结果。授信申请审批完成后(审核通过或审核拒绝),系统会主动调用第三方提供的回调接口,通知审批结果和额度信息。
接口地址
由第三方提供(与 channel 对应)
请求方法
POST
请求加密说明
重要:系统发送的通知请求同样会进行加密,加密方式与第三方调用粒粒通接口时的加密规范完全一致。
请求结构(加密后)
第三方收到的完整请求结构(data 字段已加密):
json
{
"channel": "CHANNEL_CODE",
"requestTime": 1766729397120,
"key": "SM2加密的SM4密钥",
"salt": "SM2加密的SM4 IV",
"sign": "请求签名",
"data": "SM4加密后的业务数据"
}加密流程
- 业务数据加密:将业务数据(包含 action、transactionId、data)使用 SM4 算法加密,得到
data字段 - 密钥加密:使用第三方的 SM2 公钥加密 SM4 密钥,得到
key字段 - IV 加密:使用第三方的 SM2 公钥加密 SM4 IV,得到
salt字段 - 签名生成:对请求数据进行签名,得到
sign字段
解密流程
第三方收到通知后,需要按以下步骤解密:
- 验证签名:验证
sign字段,确保请求来自粒粒通系统 - 解密密钥:使用自己的 SM2 私钥解密
key字段,得到 SM4 密钥 - 解密 IV:使用自己的 SM2 私钥解密
salt字段,得到 SM4 IV - 解密业务数据:使用 SM4 密钥和 IV 解密
data字段,得到业务数据
请求参数 (data 解密后)
| 字段名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| action | Integer | 是 | 动作码(90000-授信申请结果通知) | 90000 |
| transactionId | String | 是 | 通知幂等ID | NOTIFY20250117001 |
| data | Object | 是 | 通知数据 | - |
data 字段说明
| 字段名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| creditApplyId | Long | 是 | 授信申请ID | 2000001 |
| memberId | Long | 是 | 成员ID | 1000001 |
| projectId | Long | 是 | 项目ID | 1 |
| creditApplyType | Integer | 否 | 申请类型:1-首次申请,2-续授信,3-调额申请 | 1 |
| creditApplyStatus | Integer | 是 | 申请状态:3-审核通过,4-审核拒绝 | 3 |
| rejectReason | String | 条件必填 | 拒绝原因,审核拒绝时必填 | 资质不符合要求 |
| submitItems | Array | 否 | 授信提交项列表 | - |
| submitItems[].itemKey | String | 否 | 授信项Key | SET_PASSWORD |
| submitItems[].itemValue | String | 否 | 授信项值(敏感信息已脱敏) | |
| submitItems[].itemStatus | Integer | 否 | 提交状态:0-未提交,1-已提交 | 1 |
| products | Array | 否 | 产品额度列表(审核通过时返回) | - |
| products[].productId | Long | 否 | 产品ID | 1001 |
| products[].productCode | String | 否 | 产品编码 | AR_FACTORING_001 |
| products[].productName | String | 否 | 产品名称 | 应收账款保理产品 |
| products[].status | Integer | 否 | 产品状态:0-已关闭,1-可用 | 1 |
| products[].quotaTotal | Long | 否 | 总授信额度(分) | 100000000 |
| products[].quotaUsed | Long | 否 | 已使用额度(分) | 0 |
| products[].quotaRemain | Long | 否 | 剩余额度(分) | 100000000 |
| products[].quotaStartTime | String | 否 | 额度开始时间(yyyy-MM-dd HH:mm:ss) | 2025-01-01 00:00:00 |
| products[].quotaEndTime | String | 否 | 额度结束时间(yyyy-MM-dd HH:mm:ss) | 2025-12-31 23:59:59 |
请求示例
审核通过
json
{
"action": 90000,
"transactionId": "NOTIFY20250117001",
"data": {
"creditApplyId": 2000001,
"memberId": 1000001,
"projectId": 1,
"creditApplyType": 1,
"creditApplyStatus": 3,
"submitItems": [
{
"itemKey": "SET_PASSWORD",
"itemValue": "{\"passwordHash\":\"******\"}",
"itemStatus": 1
},
{
"itemKey": "SIGN_AGREEMENT",
"itemValue": "{\"agreementId\":123,\"agreementUrl\":\"https://...\"}",
"itemStatus": 1
},
{
"itemKey": "TAX_INVOICE",
"itemValue": "{\"resourceId\":123456}",
"itemStatus": 1
}
],
"products": [
{
"productId": 1001,
"productCode": "AR_FACTORING_001",
"productName": "应收账款保理产品",
"status": 1,
"quotaTotal": 100000000,
"quotaUsed": 0,
"quotaRemain": 100000000,
"quotaStartTime": "2025-01-01 00:00:00",
"quotaEndTime": "2025-12-31 23:59:59"
}
]
}
}审核拒绝
json
{
"action": 90000,
"transactionId": "NOTIFY20250117002",
"data": {
"creditApplyId": 2000001,
"memberId": 1000001,
"projectId": 1,
"creditApplyType": 1,
"creditApplyStatus": 4,
"rejectReason": "资质不符合要求"
}
}响应参数
重要:第三方回调接口必须返回成功响应,格式如下:
json
{
"code": 0
}| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Integer | 必须为 0,表示接收成功 |
说明:
- 响应报文使用明文返回,无需加密
- 响应必须返回
{"code": 0},否则系统会认为通知失败并触发重试 - 不需要返回其他字段(message、data 等)
- 第三方需要做好幂等处理,相同 transactionId 的通知可能重复接收
业务规则
- 接口性质:这是系统主动调用第三方提供的回调接口
- 通知内容:通知内容与查询授信结果接口(
/api/credit/latest)返回的数据结构一致 - 幂等性要求:第三方必须做好幂等处理,相同
transactionId的通知可能重复接收 - 响应要求:必须返回
{"code": 0},否则系统会触发重试 - 数据完整性:
- 审核通过时:包含
submitItems(授信项)和products(产品额度) - 审核拒绝时:包含
rejectReason(拒绝原因)
- 审核通过时:包含
- 加密规范:请求和响应都遵循标准的 SM2+SM4 加密体系
重试策略
- 当响应 code 非 0 时触发重试
- 重试公式:TN = N × I,其中 N=20次,I=20分钟
- 即:20分钟、40分钟、60分钟...最多重试20次
注意事项
- 动作码:固定为
90000(授信申请结果通知) - 通知时机:
- 授信审批完成后(审核通过或审核拒绝)
- 系统会立即发起通知,失败后会按重试策略重试
- 回调地址配置:第三方需要在系统中配置回调URL(与 channel 关联)
- 数据一致性:通知的数据结构与
/api/credit/latest接口完全一致,第三方可以对比验证 - 安全性:通知请求经过 SM2+SM4 加密,第三方需要按照加密规范解密请求数据