抖音开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好,我是小悟

关于抖音开放平台第三方代小程序开发的两个事件接收推送通知,是开放平台代小程序实现业务的重要功能。

授权事件推送和消息与事件推送类型都以Event的值判断。

授权事件推送通知

授权事件推送包括:推送票据、授权成功、授权解除、授权码找回。抖音服务器会向第三方平台方的授权事件接收 URL 以 POST 的方式推送相关通知。

推送票据:在第三方平台创建审核通过后,抖音服务器会向其"授权事件接收URL" 每隔10分钟以 POST 的方式推送票据。

Event的值为PUSH

java 复制代码
{
  "Ticket": "8c0da4968b0d1e28acbc1d738a56607d",
  "FromUserName": "ByteDanceMicroApp",
  "CreateTime": "2019-01-14 12:45:10",
  "MsgType": "Ticket",
  "Event": "PUSH"
}

授权成功:Event的值为AUTHORIZED

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "AUTHORIZED",
  "AuthorizationCode": "授权码",
  "AuthorizationCodeExpiresIn": 3600,
  "AppName": "代创建的小程序名称",
  "AppIcon": "代创建的小程序图标",
  "CompanyName": "代创建的小程序公司主体名称",
  "AppSuperAdminEmail": "代创建的小程序超管掩码邮箱",
  "AppSuperAdminMobile": "代创建的小程序超管掩码手机号"
}

授权解除:Event的值为UNAUTHORIZED

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "UNAUTHORIZED"
}

授权码找回:

Event的值为UPDATE_AUTHORIZED

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "UPDATE_AUTHORIZED",
  "AuthorizationCode": "授权码",
  "AuthorizationCodeExpiresIn": 3600
}

出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。

java 复制代码
@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("授权推送消息,开始");
      ServerVerification serverVerification = new ServerVerification();
      String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
      if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
        MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());
        String decrypt = msgDecrypt.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.UNAUTHORIZED.getCode(), event)) {
            logger.warn("推送授权解除通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
          } else if (StringUtils.equals(EventEnum.UPDATE_AUTHORIZED.getCode(), event)) {
            logger.warn("推送授权码找回通知---->成功,{}", JSON.toJSONString(authPushAuthorized));
          }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

消息与事件推送通知

消息与事件推送包括:修改小程序名称、小程序名称重置、修改服务类目、修改小程序简介、修改小程序图标、版本审核结果、短视频挂载能力申请审核结果、抖音直播组件能力申请审核结果、获取用户手机号能力申请审核结果、分享模板审核结果、短视频/直播自主挂载能力审核结果通知、短视频/直播自主挂载能力抖音号绑定结果通知、短视频达人推广挂载能力审核结果通知、直播达人推广挂载能力审核结果通知。审核结果会向消息与事件接收 URL 进行事件推送。

修改小程序名称:

Event的值为MODIFY_APP_NAME

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_NAME",
  "ModifyAppNameResults": {
    "advice": "",
    "reason": "小程序名称格式不符合规范",
    "status": 0
  }
}

小程序名称重置:Event的值为

APP_NAME_RESET_NOTIFICATION

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APP_NAME_RESET_NOTIFICATION",
  "AppNameResetNotification": "您好,您管理的小程序「%s」由于长时间未提交版本审核,名称已经被重置为「名称过期%s」。如需修改,请前往配置页面重新填写名称。"
}

修改服务类目:Event的值为

MODIFY_APP_CATEGORY

java 复制代码
{
    "AppId": "授权小程序的appid",
    "TpAppId": "第三方小程序应用appid",
    "EventTime": "2019-01-14 12:45:10",
    "Event": "MODIFY_APP_CATEGORY",
    "ModifyAppCategoryResults": [
        {
            "category": "158,159,259",
            "categoryName": "社交类-社交-直播",
            "status": 1,
            "reason": ""
        }
    ]
}

修改小程序简介:

Event的值为MODIFY_APP_INTRO

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_INTRO",
  "ModifyAppIntroResults": {
    "reason": "小程序简介格式不符合规范",
    "status": 0
  }
}

修改小程序图标:

Event的值为MODIFY_APP_ICON

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "MODIFY_APP_ICON",
  "ModifyAppIconResults": {
    "reason": "小程序名称格式不符合规范",
    "status": 0
  }
}

版本审核结果:Event的值为PACKAGE_AUDIT

java 复制代码
{
    "AppId": "授权小程序的appid",
    "TpAppId": "第三方小程序应用appid",
    "EventTime": "2019-01-14 12:45:10",
    "Event": "PACKAGE_AUDIT",
    "AuditResults": [
        {
            "hostName": "toutiao",
            "reason": ["", ""],
            "status": 1,
            "auditDetail": [
                {
                    "reason":"xxx",
                    "modifyGuide": {
                        "name":"xxx",
                        "link":"xxx"
                    },
                    "detailFile":"xxx"
                }
            ]
        }
    ]
}

短视频挂载能力申请审核结果:Event的值为APPLY_VIDEO_CAPABILITY

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_VIDEO_CAPABILITY",
  "ApplyVideoCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

抖音直播组件能力申请审核结果:Event的值为APPLY_LIVE_CAPABILITY

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_LIVE_CAPABILITY",
  "ApplyLiveCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

获取用户手机号能力申请审核结果:Event的值为

APPLY_PHONE_NUMBER_CAPABILITY

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_PHONE_NUMBER_CAPABILITY",
  "ApplyPhoneNumberCapabilityResults": {
    "status": 0,
    "reason": "xxx"
  }
}

分享模板审核结果:

Event的值为APPLY_SHARE_TEMPLATE

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_SHARE_TEMPLATE",
  "ApplyShareTemplateResults": {
    "templateId": "xxx",
    "status": 0,
    "reason": "[\"xxx\",\"xxx\"]"
  }
}

短视频/直播自主挂载能力审核结果通知:

Event的值为APPLY_CAPACITY,需要结合

EventContent.capacity_key的值判断

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

短视频/直播自主挂载能力抖音号绑定结果通知:

Event的值为SELT_MOUNT_BIND,需要结合

EventContent.capacity_key的值判断

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "SELT_MOUNT_BIND",
  "EventContent": {
// 能力key,video_self_mount-短视频自主挂载;live_self_mount-直播自主挂载。
    "capacity_key": "能力key",
    "aweme_id": "抖音号",
    "user_name": "抖音用户昵称",
    "bind_status": 1
  }
}

短视频达人推广挂载能力审核结果通知:

Event的值为APPLY_CAPACITY,需要结合

EventContent.capacity_key的值判断

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,video_talent_mount-短视频达人推广挂载能力。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

直播达人推广挂载能力审核结果通知:

Event的值为APPLY_CAPACITY,需要结合

EventContent.capacity_key的值判断

java 复制代码
{
  "AppId": "授权小程序的appid",
  "TpAppId": "第三方小程序应用appid",
  "EventTime": "2019-01-14 12:45:10",
  "Event": "APPLY_CAPACITY",
  "EventContent": {
// 能力key,ma.mount.live_talent_mountt-直播达人推广挂载能力。
    "capacity_key": "能力key",
    "status": 1,
    "reason": "xxx"
  }
}

出于安全考虑,开放平台服务端会向第三方小程序后端服务推送加密后的消息,因此,服务商需要用key解密后才能查看具体信息。另外推送消息格式均为 json,并且第三方小程序后端服务接收到后需要响应并返回字符串 success。

java 复制代码
@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("事件推送消息,开始");
        ServerVerification serverVerification = new ServerVerification();
        String msgSignature = serverVerification.getMsgSignature(thirdPlatConfig.getMsgCheckToken(), postData.getTimeStamp(), postData.getNonce(), postData.getEncrypt());
        if (StringUtils.equals(postData.getMsgSignature(), msgSignature)) {
            MsgDecrypt msgDecrypt = new MsgDecrypt(thirdPlatConfig.getMsgEncodingAesKey());
            String decrypt = msgDecrypt.decrypt(postData.getEncrypt());
            logger.warn("事件推送消息,解密结果={}", decrypt);
            EventPushMsg eventPushMsg = JSON.parseObject(decrypt, EventPushMsg.class);
            String event = eventPushMsg.getEvent();
            if (StringUtils.equals(EventEnum.MODIFY_APP_NAME.getCode(), event)) {
                logger.warn("修改名称审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APP_NAME_RESET_NOTIFICATION.getCode(), event)) {
                logger.warn("名称重置通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_INTRO.getCode(), event)) {
                logger.warn("修改简介审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_ICON.getCode(), event)) {
                logger.warn("修改图标审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.MODIFY_APP_CATEGORY.getCode(), event)) {
                logger.warn("修改服务类目审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.PACKAGE_AUDIT.getCode(), event)) {
                logger.warn("版本审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_VIDEO_CAPABILITY.getCode(), event)) {
                logger.warn("「短视频挂载」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_LIVE_CAPABILITY.getCode(), event)) {
                logger.warn("「抖音直播组件」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_PHONE_NUMBER_CAPABILITY.getCode(), event)) {
                logger.warn("「获取用户手机号」能力申请审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.APPLY_CAPACITY.getCode(), event)) {
                logger.warn("短视频/直播自主挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
                logger.warn("短视频达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
                logger.warn("直播达人推广挂载能力审核结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            } else if (StringUtils.equals(EventEnum.SELT_MOUNT_BIND.getCode(), event)) {
                logger.warn("短视频/直播自主挂载能力抖音号绑定结果通知---->通知,{}", JSON.toJSONString(eventPushMsg));
            }
        }
      }
    } catch (Exception e) {
      logger.error("系统异常", e);
    } finally {
      // 响应消息
      PrintWriter out = response.getWriter();
      out.print("success");
    }
}

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

相关推荐
丁总学Java3 小时前
微信小程序,点击bindtap事件后,没有跳转到详情页,有可能是app.json中没有正确配置页面路径
微信小程序·小程序·json
说私域4 小时前
基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析
人工智能·小程序
mosen8684 小时前
Uniapp去除顶部导航栏-小程序、H5、APP适用
vue.js·微信小程序·小程序·uni-app·uniapp
qq22951165025 小时前
微信小程序的汽车维修预约管理系统
微信小程序·小程序·汽车
尚梦12 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
paopaokaka_luck16 小时前
基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)
java·spring boot·小程序·毕业设计·mybatis·1024程序员节
Bessie23419 小时前
微信小程序eval无法使用的替代方案
微信小程序·小程序·uni-app
蜕变菜鸟19 小时前
小程序跳转另一个小程序
小程序
1 天前
躺平成长-代码开发,利用kimi开发小程序(09)
小程序
1 天前
微信小程序运营日记(第四天)
微信小程序·小程序