大家好,我是小悟
关于百度开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。
授权事件推送和消息与事件推送类型都以event的值判断。
授权事件推送通知
授权事件推送包括:推送票据、授权成功、取消授权、授权更新、手机号权限取消。百度服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。
推送票据:在第三方平台创建审核通过后,百度服务器会向其“授权事件接收URL” 每隔10分钟以 POST 的方式推送票据。
event的值为push
{
"Ticket" : "8c0da4968b0d1e28acbc1d738a56607d",
"FromUserName" : "SmartAPP",
"CreateTime" : 1413192605,
"MsgType" : "ticket",
"Event" : "push"
}
授权成功:event的值为AUTHORIZED
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "AUTHORIZED",
"authorizationCode":"授权码",
"authorizationCodeExpiresIn":60
}
取消授权:event的值为UNAUTHORIZED
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "UNAUTHORIZED"
}
授权更新:
event的值为UPDATE_AUTHORIZED
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "UPDATE_AUTHORIZED",
"authorizationCode":"授权码",
"authorizationCodeExpiresIn":60
}
手机号权限取消:当主体账号信息发生变更时.会取消当前账号下所有小程序的获取手机号权限。若想要恢复权限,需重新调用申请手机号权限API重新审核。
event的值为
APPLY_APP_MOBILE_AUTH_PASS
{
"appId":15263713,
"tpAppId": 14242323,
"eventTime": "2019-01-14 12:45:10",
"event": "APPLY_APP_MOBILE_AUTH_PASS",
"reason":"主体信息变更"
}
接收post请求后,只需直接返回字符串success。为了加强安全性,post data中的数据将使用服务申请时的加解密key来进行加密,在收到推送后需进行解密。
@PostMapping(value = "authPushMsg")
public void authPushMsg(PostDataModel postData) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb = sb.append(line);
}
String postStr = sb.toString();
logger.warn("授权推送消息---->获得数据为postData={}", postStr);
PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);
try {
logger.warn("授权推送消息,开始");
String msgSignature = MsgSignatureUtil.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
AesDecryptUtil aesDecryptUtil = new AesDecryptUtil(thirdPlatConfig.getMsgEncodingAesKey());
String decrypt = aesDecryptUtil.decrypt(postData.getEncrypt());
logger.warn("授权推送消息,解密结果={}", decrypt);
if (decrypt.contains("Ticket") && decrypt.contains("push")) {
logger.warn("推送ticket协议---->开始");
// 推送ticket通知
ComponentVerifyTicket componentVerifyTicket = JSON.parseObject(decrypt, ComponentVerifyTicket.class);
componentVerifyTicket.setComponentVerifyTicket(componentVerifyTicket.getTicket());
RedisService<ComponentVerifyTicket> redisService = RedisService.load();
redisService.save(componentVerifyTicket, ComponentVerifyTicket.class);
logger.warn("推送ticket协议---->成功,保存到缓存中的值为:{}", JSON.toJSONString(componentVerifyTicket));
} else {
// 进行授权、取消授权、更新授权
AuthPushAuthorized authPushAuthorized = JSON.parseObject(decrypt, AuthPushAuthorized.class);
String event = authPushAuthorized.getEvent();
if (StringUtils.equals(EventEnum.AUTHORIZED.getCode(), event)) {
logger.warn("推送授权成功通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
} else if (StringUtils.equals(EventEnum.UPDATE_AUTHORIZED.getCode(), event)) {
logger.warn("推送授权更新通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
} else if (StringUtils.equals(EventEnum.UNAUTHORIZED.getCode(), event)) {
logger.warn("推送取消授权通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
} else if (StringUtils.equals(EventEnum.APP_MOBILE_AUTH_CANCEL.getCode(), event)) {
logger.warn("获取手机号权限取消---->通知,{}", JSON.toJSONString(authPushAuthorized));
}
}
}
} catch (Exception e) {
logger.error("系统异常", e);
} finally {
// 响应消息
PrintWriter out = response.getWriter();
out.print("success");
}
}
消息与事件推送通知
消息与事件推送包括:设置小程序名称、设置小程序头像、设置小程序描述、设置小程序行业类目、小程序强制下线、小程序暂停服务、小程序服务启用、小程序限时整改通知、小程序流量下线通知、申请手机号权限、获取手机号权限、代码包审核、真实性认证状态变更、创建支付账号、配置开发者设置、开通支付服务、创建单卡子链。审核结果会向消息与事件接收 URL 进行事件推送。
小程序名称审核通过:
event的值为APP_NAME_AUDIT_PASS
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_NAME_AUDIT_PASS"
}
小程序名称审核不通过:
event的值为APP_NAME_AUDIT_FAIL
{
"appId": 小程序appid,
"appName": "TP名称拒审改名0503_审核失败_1589544087240",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_NAME_AUDIT_FAIL",
"reason": "名称过长(名称控制在10个字以内)。"
}
小程序头像审核通过:
event的值为APP_ICON_AUDIT_PASS
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_ICON_AUDIT_PASS"
}
小程序头像审核不通过:
event的值为APP_ICON_AUDIT_FAIL
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_ICON_AUDIT_FAIL",
"reason": "不通过原因。"
}
小程序描述审核通过:
event的值为APP_DESC_AUDIT_PASS
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_DESC_AUDIT_PASS"
}
小程序描述审核不通过:
event的值为APP_DESC_AUDIT_FAIL
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_DESC_AUDIT_FAIL",
"reason": "不通过原因。"
}
小程序行业审核通过:
event的值为APP_CATEGORY_AUDIT_PASS
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_CATEGORY_AUDIT_PASS"
}
小程序行业审核不通过:
event的值为APP_CATEGORY_AUDIT_FAIL
{
"appId": 小程序appid,
"appName": "小程序名称",
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_CATEGORY_AUDIT_FAIL",
"reason": "不通过原因。"
}
小程序强制下线:
event的值为APP_FORCE_OFFLINE
{
"appId":小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_FORCE_OFFLINE",
"reason":"强制下线原因",
"offlineReason":3,
"illegalFields":"appName,photoAddr,appDesc"
}
小程序暂停服务:
event的值为APP_SERVER_PAUSE
{
"appId":小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_SERVER_PAUSE",
"reason":"强制下线原因",
"offlineReason":3,
"illegalFields":"appName,photoAddr,appDesc"
}
小程序服务启用:
event的值为APP_SERVER_RESUME
{
"appId":小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_SERVER_RESUME"
}
小程序限时整改通知:
event的值为TIME_LIMIT_RECTIFY_NOTIFY
{
"appId":小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "TIME_LIMIT_RECTIFY_NOTIFY"
}
小程序流量下线通知:
event的值为FLOW_CLOSE_NOTIFY
{
"appId":小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "FLOW_CLOSE_NOTIFY"
}
小程序手机号权限审核通过:event的值为
APPLY_APP_MOBILE_AUTH_PASS
{
"appId":15263713,
"tpAppId": 14242323,
"eventTime": "2019-01-14 12:45:10",
"event": "APPLY_APP_MOBILE_AUTH_PASS"
}
小程序手机号权限审核不通过:event的值为
APPLY_APP_MOBILE_AUTH_REJECT
{
"appId":15263713,
"tpAppId": 14242323,
"eventTime": "2019-01-14 12:45:10",
"event": "APPLY_APP_MOBILE_AUTH_REJECT",
"reason":"审核失败原因"
}
代码包审核通过:
event的值为PACKAGE_AUDIT_PASS
{
"appId": 1452365,
"tpAppId": 17328232,
"eventTime": "2019-01-14 12:45:10",
"event": "PACKAGE_AUDIT_PASS",
"packageId":529394,
"packageVersion":"0.2.2"
}
代码包审核不通过:
event的值为PACKAGE_AUDIT_FAIL
{
"appId": 1452365,
"tpAppId": 17328232,
"eventTime": "2019-01-14 12:45:10",
"event": "PACKAGE_AUDIT_FAIL",
"reason":"名称过长(名称控制在10个字以内)。名称与实际打开后的名称不符。",
"packageId":745815,
"packageVersion":"1.3.46"
}
真实性认证结果推送:当客户的真实性认证状态发生变化后,第三方平台将可以通过开放平台上填写的消息与事件接受URL,获得变更内容。若客户账号下有多个小程序,会收到数量与客户小程序数量相等的推送。
event的值为ADVANCED_AUDIT_CHANGED
{
"appId":1452365,
"tpAppId": 17328232,
"eventTime": "2019-01-14 12:45:10",
"event": "ADVANCED_AUDIT_CHANGED",
"adType":2,
"adStatus":1
}
创建支付账号通过:event的值为
APP_PAYMENT_CREATE_ACCOUNT_PASS
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_CREATE_ACCOUNT_PASS"
}
创建支付账号不通过:event的值为
APP_PAYMENT_CREATE_ACCOUNT_FAIL
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_CREATE_ACCOUNT_FAIL",
"reason": "失败原因"
}
配置开发者设置通过:event的值为
APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS"
}
配置开发者设置不通过:event的值为
APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL",
"reason": "失败原因"
}
开通支付服务通过:event的值为
APP_PAYMENT_CREATE_PAYMENT_PASS
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_CREATE_PAYMENT_PASS"
}
开通支付服务不通过:event的值为
APP_PAYMENT_CREATE_PAYMENT_FAIL
{
"appId": 小程序appid,
"tpAppId": 第三方平台appid,
"eventTime": "2019-01-14 12:45:10",
"event": "APP_PAYMENT_CREATE_PAYMENT_FAIL",
"reason": "失败原因"
}
创建单卡子链审核通过:小程序单卡是面向开发者的流量权益,是符合准入要求的小程序开发者向百度用户提供相关产品及服务的搜索特型卡片。第三方平台(TP)可代替小程序开发者提交2-15个小程序的核心功能或子频道,作为小程序单卡的外露子链,被用户直接访问触达。
event的值为AUDIT_SUB_CHAIN_PASS
{
"appId":小程序appid,
"tpAppId":第三方平台appid,
"eventTime":"2019-01-14 12:45:10",
"event":"AUDIT_SUB_CHAIN_PASS",
"subchainId":13234
}
创建单卡子链审核不通过:
event的值为AUDIT_SUB_CHAIN_FAILED
{
"appId":小程序appid,
"tpAppId":第三方平台appid,
"eventTime":"2019-01-14 12:45:10",
"event":"AUDIT_SUB_CHAIN_FAILED",
"subchainId":13234,
"reason":"失败原因"
}
接收post请求后,只需直接返回字符串success。为了加强安全性,post data中的数据将使用服务申请时的加解密key来进行加密,在收到推送后需进行解密。
@PostMapping(value = "eventPushMsg")
public void eventPushMsg(PostDataModel postData) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8"));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb = sb.append(line);
}
String postStr = sb.toString();
logger.warn("事件推送消息---->获得数据为postData={}", postStr);
PostDataModel postData = JSON.parseObject(postStr, PostDataModel.class);
try {
logger.warn("事件推送消息,开始");
String msgSignature = MsgSignatureUtil.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
AesDecryptUtil aesDecryptUtil = new AesDecryptUtil(thirdPlatConfig.getMsgEncodingAesKey());
String decrypt = aesDecryptUtil.decrypt(postData.getEncrypt());
logger.warn("事件推送消息,解密结果={}", decrypt);
EventPushMsg eventPushMsg = JSON.parseObject(decrypt, EventPushMsg.class);
String event = eventPushMsg.getEvent();
if (StringUtils.equals(EventEnum.APP_NAME_AUDIT_PASS.getCode(), event)) {
logger.warn("小程序名称审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_NAME_AUDIT_FAIL.getCode(), event)) {
logger.warn("小程序名称审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_ICON_AUDIT_PASS.getCode(), event)) {
logger.warn("小程序头像审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_ICON_AUDIT_FAIL.getCode(), event)) {
logger.warn("小程序头像审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_DESC_AUDIT_PASS.getCode(), event)) {
logger.warn("小程序描述审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_DESC_AUDIT_FAIL.getCode(), event)) {
logger.warn("小程序描述审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_CATEGORY_AUDIT_PASS.getCode(), event)) {
logger.warn("小程序行业类目审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_CATEGORY_AUDIT_FAIL.getCode(), event)) {
logger.warn("小程序行业类目审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_FORCE_OFFLINE.getCode(), event)) {
logger.warn("小程序强制下线---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_SERVER_PAUSE.getCode(), event)) {
logger.warn("小程序暂停服务---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_SERVER_RESUME.getCode(), event)) {
logger.warn("小程序服务启用---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.TIME_LIMIT_RECTIFY_NOTIFY.getCode(), event)) {
logger.warn("小程序限时整改通知---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.FLOW_CLOSE_NOTIFY.getCode(), event)) {
logger.warn("小程序流量下线通知---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APPLY_APP_MOBILE_AUTH_PASS.getCode(), event)) {
logger.warn("申请手机号权限审核通过---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APPLY_APP_MOBILE_AUTH_REJECT.getCode(), event)) {
logger.warn("申请手机号权限审核拒绝---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT_PASS.getCode(), event)) {
logger.warn("代码包审核成功---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT_FAIL.getCode(), event)) {
logger.warn("代码包审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.ADVANCED_AUDIT_CHANGED.getCode(), event)) {
logger.warn("真实性认证状态变更---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_ACCOUNT_PASS.getCode(), event)) {
logger.warn("创建支付账号通过---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_ACCOUNT_FAIL.getCode(), event)) {
logger.warn("创建支付账号失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_UPDATE_DEVELOP_CONFIG_PASS.getCode(), event)) {
logger.warn("配置开发者设置通过---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_UPDATE_DEVELOP_CONFIG_FAIL.getCode(), event)) {
logger.warn("配置开发者设置失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_PAYMENT_PASS.getCode(), event)) {
logger.warn("开通支付服务通过---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.APP_PAYMENT_CREATE_PAYMENT_FAIL.getCode(), event)) {
logger.warn("开发支付服务失败---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.AUDIT_SUB_CHAIN_PASS.getCode(), event)) {
logger.warn("创建单卡子链审核通过---->通知,{}", JSON.toJSONString(eventPushMsg));
} else if (StringUtils.equals(EventEnum.AUDIT_SUB_CHAIN_FAILED.getCode(), event)) {
logger.warn("创建单卡子链审核失败---->通知,{}", JSON.toJSONString(eventPushMsg));
}
}
}
} catch (Exception e) {
logger.error("系统异常", e);
} finally {
// 响应消息
PrintWriter out = response.getWriter();
out.print("success");
}
}
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海