java版服务端接入华为消息推送3.0接口

  • 华为Push Kit V1接口将于2019年11月30日全网下线,改用最新接口
  • 注册成为开发者
  • 接入3.0接口使用官网的SDK
  • 服务端示例代码下载地址:
  • 然后使用SDK中提供的方法


华为Push Kit V1接口将于2019年11月30日全网下线,改用最新接口

注册成为开发者

在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法可参考“帐号注册认证”。

接入3.0接口使用官网的SDK

先在华为开发者联盟申请Push服务获取的服务参数,申请步骤请自行百度

  1. appId
  2. appSecret

官网没有出SDK专门的文档,所以需要先下载官网提供的示例代码,使用maven打包成jar包,引入到自己的项目中

服务端示例代码下载地址:

传送门👇 下载下来的示例代码有6种语言的,这是使用java版本的
下载下来的示例代码需要注意的是,发送的消息不能使用中文,我们稍作修改一下

  1. 先修改一下pom文件,打包时忽略掉Test类
  2. 修改HuaweiMessageClientImpl实现类
    StringEntity的类默认是ISO-8859-1编码格式的 如图

    3.红色标记的地方加上utf-8,就可以发送中文的消息了

    4.使用maven打包后引入到自己的项目中

然后使用SDK中提供的方法

返回的实体自己定义就好
http接口地址都在SDK的配置文件中,无需添加,只需要提供联盟里申请的appId,appSecret即可
具体的参数描述在官网都有传送门👇 accessToken 过期后重新获取的方法在示例代码的单元测试中也可找到,自行研究,这里只提供发送消息的步骤

@Component
@Slf4j
public class PushHwMsg {

    private HuaweiOption option;

    private HuaweiApp app;

    @Value("${huwei.appId}")
    private String appId;

    @Value("${huawei.appSecret}")
    private String appSecret;

    /**
     * 初始化时加载HuaweiApp,调用SDK包中的方法,获取accessToken
     */
    @PostConstruct
    public void init() {
        final HuaweiCredential credential = HuaweiCredential.builder()
                .setAppId(appId)
                .setAppSecret(appSecret)
                .build();

        option = HuaweiOption.builder()
                .setCredential(credential)
                .build();
        app = HuaweiApp.initializeApp(option);
    }


    public PushMsgHWRsp sendPushMessage(List<String> tokenList, PushMsgReq req) throws IOException, HuaweiMesssagingException {
        PushMsgHWRsp pushMsgHWRsp = new PushMsgHWRsp();
        Message message = getNormalMessage(tokenList, req);
        SendResponce responce = HuaweiMessaging.getInstance(app).send(message, false);
        log.info("推送消息后华为返回的 response {}", JSON.toJSONString(responce));
        pushMsgHWRsp.setRequestId(responce.getRequestId());
        pushMsgHWRsp.setMsg(responce.getMsg());
        pushMsgHWRsp.setCode(responce.getCode());
        return pushMsgHWRsp;
    }


    /**
     * 华为3.0接口推送消息,推送时需要传递的参数
     *
     * @param tokenList
     * @param req
     * @return
     * @throws UnsupportedEncodingException
     */
    private static Message getNormalMessage(List<String> tokenList, PushMsgReq req) throws UnsupportedEncodingException {
        Notification notification = new Notification(new String(req.getTitle().getBytes("utf-8"), "utf-8"), req.getMsg());
        ClickAction clickAction = ClickAction.builder()
                .setType(Integer.valueOf(req.getType()))//设置点击行为的类型: 1标识点击行为用户自定义; 2标识打开特定URL; 3标识打开本业务的APP; 4标识打开富媒体信息;
                .setUrl(req.getUrl()) //打开特定url
                .setIntent(req.getIntent())//当type为1时必选 自定义页面
                .build();
        BadgeNotification badgeNotification = new BadgeNotification(99, "Classic");
        AndroidNotification androidNotification = AndroidNotification.builder()
                .setTitle(new String(req.getTitle().getBytes("utf-8"), "utf-8"))//标题
                .setBody(req.getMsg())//消息
                .setColor("#FFFFFF")
                // .setSound("/raw/shake")
                .setClickAction(clickAction)
                //.setTitleLocKey("demo_title_new2")
                //.addTitleLocArgs("title_args")
                //.addTitleLocArgs("title_args2")
                // .setBodyLocKey("demo_content_new2")
                // .addBodyLocArgs("content_args")
                // .addBodyLocArgs("content_args2")
                //.setChannelId("RingRing")
                .setNotifySummary(req.getSubtitle())
                .setStyle(0) // 0:默认样式 1:大文本样式
                //.setBigTitle(req.getTitle()) //style为1时必选
                //.setBigBody(req.getMsg()) //style为1时必选
                //.setBigPicture("https://developer-portalres-drcn.dbankcdn.com/system/modules/org.opencms.portal.template.core/resources/images/icon_Promotion.png")
                .setAutoClear(86400000)
                .setNotifyId(486)
                //.setBadge(badgeNotification)
                .build();

        AndroidConfig androidConfig = AndroidConfig.builder()
                .setCollapseKey(-1)
                .setTtl("1448s")
                .setBiTag(req.getTitle())//消息回执需要传的
                .setFastAppTargetType(1)
                .setNotification(androidNotification)
                .build();

        String data = "k=v,k=v";
        Message message = Message.builder()
                .setNotification(notification)
                .setAndroidConfig(androidConfig)
                .addAllToken(tokenList)
                .build();

        return message;
    }


}