4.12通知接口
通知规范:
交互完成,基础营销平台通过通知接口将结果消息通知给商户。
例如:优惠券核销成功,基础营销平台通过通知接口将核销成功消息通知给商户。
注意:
• 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
• 通知存在不稳定性,不能保证每一笔通知都能成功通知,如果在所有通知频率后没有收到基础营销平台侧回调,商户应调用查询接口确认结果。例如,交易完成后如果没有收到结果通知,可调用交易查询接口查询交易状态
特别提醒:商户系统对于开启结果通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄露导致出现“假通知”,造成资金损失。
通知规则
业务交互完成后,基础营销平台会把相关结果和信息发送给商户,商户需要接收处理该消息,并返回应答。
通知频率:
对后台通知交互时,如果平台收到商户的应答不符合规范或超时,平台认为通知失败,会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但平台不保证通知最终能成功。通常情况如非特殊说明,
通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m - 总计 2h4m
通知报文
结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的结果详情。
(注:由于涉及到回调加密和解密,商户必须先设置好加密秘钥后才能解密回调通知,秘钥设置文档指引详见应用设置指引)
参数解密
下面详细描述对通知数据进行解密的流程:
1、在商户平台上设置加密密钥,记为key;
2、针对resource.algorithm中描述的加密方式;
3、使用key根据不同的加密算法,对数据密文resource.data进行解密,得到JSON形式的资源对象;
通知签名
加密不能保证通知请求来自基础营销平台。基础营销平台会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头。商户应当验证签名,以确认请求来自基础营销平台,而不是其他的第三方。签名验证同接口签名规范的返回验签规范。
参数 |
参数名 |
类型 |
必填 |
描述 |
id |
通知ID |
String(32) |
是 |
通知的唯一ID |
appid |
对接appid |
String(16) |
是 |
对接的appid |
create_time |
通知创建时间 |
String(32) |
是 |
格式:yyyyMMddHHmmss |
event_type |
通知类型 |
String(32) |
是 |
优惠券核销或者回退: mpmuse 活动状态变更通知:actstatechange |
encrypt |
是否加密 |
Bool |
是 |
true:加密 false:不加密 |
data |
通知数据 |
String |
是 |
当encrypt为true时,data为密文 当encrypt为false时,data为明文 不同的通知接口data详看每个通知接口的字段说明 |
algorithm |
加密方式 |
String |
否 |
当encrypt为空false,为空 AES SM4 AES算法为AES/ECB/PKCS5Padding SM4算法为: SM4/ECB/PKCS5Padding |
返回参数:
SUCCESS 或者 FAIL
4.12.1活动状态变更通知
参数 |
参数名 |
类型 |
必填 |
描述 |
appid |
应用id |
String[10] |
是 |
基础营销平台分配 |
actid |
活动id |
String[32] |
是 |
基础营销平台的营销活动id |
status |
状态 |
String[8] |
是 |
WAITCFM-待审核 FAILCFM-审核不通过 RUNNING-投放中 PAUSE-暂停投放 TERMINAL-终止投放 FINISHWO-终止核销 FINAL-完结 |
update_time |
变更时间 |
String[14] |
是 |
yyyyMMddHHmmss |
4.12.2核销完成/核销回退完成通知
通知处理说明:
场景1:权益正常核销,过一段时间后撤销交易或者全额退款。
核销成功时机构会收到一笔核销通知(notify_type=try),use_traces里都是核销的权益明细(use_type=try);
交易撤销或者全额退款时,机构会收到一笔核销撤销的通知(notify_type=cce),use_traces里是核销撤销的权益明细(use_type=cce);
两笔通知时间间隔较长(取决于交易退款时间),两笔通知的交易单号不一致。
场景2:权益核销成功后最终交易失败(例如权益核销完后,银行返回卡余额不足)。
核销成功时机构会收到一笔核销通知(notify_type=try),use_traces里都是核销的权益明细(use_type=try);
交易失败后,营销平台会回退已核销权益,机构会收到一笔核销撤销的通知(notify_type=cce),use_traces里是核销撤销的权益明细(use_type=cce);
两笔通知时间间隔较短(一般几百毫秒至30秒之间,取决于银行交易结果返回),两笔通知的交易单号(trxid)一致,权益撤销(cce)那笔trxid和fatrxid一致。
场景3:权益核销成功后权益处理失败(例如远端权益核销后,营销平台判断活动预算不足,实时回退权益)
机构会收到一笔失败的核销通知(notify_type=fail),use_traces同时包含核销的权益明细(use_type=try)和撤销的权益明细(use_type=cce),并且一一对应。
参数 |
参数名 |
类型 |
必填 |
描述 |
notify_type |
通知类型 |
String[4] |
是 |
try:权益核销结果通知 cce:权益撤销通知 fail:权益核销失败通知 处理逻辑详见接口说明 |
trxid |
交易单号 |
String[32] |
是 |
核销交易单号 |
fatrxid |
原交易单号 |
String[32] |
否 |
核销撤销类必填 |
cusid |
核销商户号 |
String[32] |
是 |
|
branchno |
核销门店号 |
String[32] |
否 |
|
trxcode |
交易类型 |
String[32] |
否 |
与收银宝对齐,例如VSP501 |
native_amt |
原始订单金额 |
long |
是 |
券关联的原始金额 |
userid |
用户id |
String[32] |
否 |
基础营销平台的用户编号 |
use_type |
核销类型 |
String[4] |
是 |
try: 核销 cce: 核销撤销 移动至use_traces明细,后续版本此字段删除 |
use_traces |
权益明细 |
List<UseTrace> |
是 |
权益明细列表 |
id |
核销id |
String[32] |
是 |
兼容,下版本去掉 |
outid |
外部核销流水 |
String[32] |
否 |
机构营销平台的核销流水,兼容,下版本去掉 |
out_userid |
外部用户号 |
String |
否 |
机构营销平台的用户号 |
actid |
活动id |
String[10] |
是 |
兼容,下版本去掉 |
cpid |
券id |
String[32] |
否 |
券类权益必填 兼容,下版本去掉 |
tplid |
券模版id |
String[10] |
是 |
券类权益必填 兼容,下版本去掉 |
use_time |
完成时间 |
String[14] |
是 |
yyyyMMddHHmmss 兼容,下版本去掉 |
use_amt |
核销金额 |
long |
否 |
优惠减免金额 兼容,下版本去掉 |
remark |
备注 |
String[256] |
否 |
兼容,下版本去掉 |
其中UseTrace字段如下
参数 |
参数名 |
类型 |
必填 |
描述 |
id |
核销id |
String[32] |
是 |
|
outid |
外部核销流水 |
String[32] |
否 |
机构营销平台的核销流水 |
use_type |
核销类型 |
String[4] |
是 |
try: 核销 cce: 核销撤销 |
out_userid |
外部用户号 |
String |
否 |
机构营销平台的用户号 |
actid |
活动id |
String[10] |
是 |
|
opeid |
活动发起方编号 |
String[32] |
是 |
|
cpid |
券id |
String[32] |
否 |
券类权益必填 |
tplid |
券模版id |
String[10] |
否 |
券类权益必填 |
use_time |
完成时间 |
String[14] |
是 |
yyyyMMddHHmmss |
use_amt |
核销金额 |
long |
否 |
减免金额 |
remark |
备注 |
String[256] |
否 |