美文网首页
获取华为token、华为推送

获取华为token、华为推送

作者: AC编程 | 来源:发表于2022-02-19 09:10 被阅读0次

    一、获取华为access_token

     /**
         * 获取华为access_token
         * 文档:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/oauth2-0000001212610981#section128682386159
         *
         * @return
         */
        private String getAccessToken() {
            String accessToken = huaWeiRdsHelper.get();
            if (StringUtil.isNotBlank(accessToken)) {
                return accessToken;
            }
    
            try {
                String requestBody = MessageFormat.format("grant_type=client_credentials&client_secret={0}&client_id={1}", appSecret, appId);
    
                HttpPost httpPost = new HttpPost("https://oauth-login.cloud.huawei.com/oauth2/v3/token");
                StringEntity entity = new StringEntity(requestBody);
                httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
                httpPost.setEntity(entity);
                CloseableHttpResponse response = httpClient.execute(httpPost);
                String jsonStr = EntityUtils.toString(response.getEntity());
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == SUCCESS_CODE) {
                    JSONObject jsonObject = JSONObject.parseObject(jsonStr);
                    accessToken = jsonObject.getString("access_token");
                    huaWeiRdsHelper.add(accessToken);
                    return accessToken;
                } else {
                    log.error("获取华为推送access_token失败");
                }
            } catch (IOException e) {
                log.error("获取华为推送access_token失败,异常:{}", e.getMessage());
            }
            return null;
        }
    

    二、华为推送组装参数

    /**
         * 华为推送
         * 文档:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-server-dev-0000001050040110
         * 参数说明:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References/https-send-api-0000001050986197#section8686112674319
         * 官方样例:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Examples/server-sample-code-0000001050986079
         *
         * @param pushNotificationVO
         * @return
         */
        @Override
        public Boolean pushNotification(PushNotificationVO pushNotificationVO, MemberDevice memberDevice) {
            log.info("华为推送:{}", pushNotificationVO);
            log.info("华为推送,appKey,appSecret:{},{}", appId, appSecret);
            String accessToken = getAccessToken();
            if (StringUtil.isBlank(accessToken)) {
                log.error("华为推送,获取accessToken失败");
                return false;
            }
    
            String token = memberDevice.getToken();
            /**
             * 通知栏消息体示例
             * {
             *     "validate_only": false,
             *     "message": {
             *         "android": {
             *             "notification": {
             *                 "title": "test title",
             *                 "body": "test body",
             *                 "click_action": {
             *                     "type": 3
             *                 }
             *             }
             *         },
             *         "token": ["pushtoken1"]
             *     }
             * }
             */
    
            Map<String, String> extra = new LinkedHashMap();
            Map<String, Object> objectMap = BeanUtil.beanToMap(pushNotificationVO);
            objectMap.forEach((key, value) -> {
                if (null != value && !key.equals("map")) {
                    extra.put(key, value.toString());
                }
            });
            if (null != pushNotificationVO.getMap()) {
                pushNotificationVO.getMap().forEach((key, value) -> {
                    if (null != value) {
                        extra.put(key, value.toString());
                    }
                });
            }
    
            Map notificationMap = new HashMap<>();
            notificationMap.put("title", pushNotificationVO.getTitle());
            notificationMap.put("body", pushNotificationVO.getBody());
            notificationMap.put("icon", pushNotificationVO.getIconUrl());
            notificationMap.put("badge", pushNotificationVO.getBadge());
    
            Map dataMap = new HashMap<>();
            if (extra.size() > 0) {
                dataMap.put("extra", extra);
            }
    
            Map androidMap = new HashMap<>();
            androidMap.put("notification", notificationMap);
    
            Map messageMap = new HashMap<>();
            messageMap.put("token", Arrays.asList(token));
            messageMap.put("android", androidMap);
            if (dataMap.size() > 0) {
                messageMap.put("data", dataMap);
            }
    
            Map pushMessageMap = new HashMap<>();
            pushMessageMap.put("validate_only", false);
            pushMessageMap.put("message", messageMap);
    
            log.info("pushMessageMap:{}", pushMessageMap);
    
            return sendRequest(pushMessageMap, accessToken);
        }
    

    三、推送

    private boolean sendRequest(Map map, String accessToken) {
            try {
                String pushUrl = MessageFormat.format("https://push-api.cloud.huawei.com/v1/{0}/messages:send", appId);
                HttpPost httpPost = new HttpPost(pushUrl);
                StringEntity entity = new StringEntity(JSON.toJSONString(map), "UTF-8");
    
                httpPost.setHeader("Authorization", "Bearer " + accessToken);
                httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
                httpPost.setEntity(entity);
    
                CloseableHttpResponse response = httpClient.execute(httpPost);
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == SUCCESS_CODE) {
                    log.info("华为推送成功");
                    return true;
                } else {
                    log.error("华为推送失败,{}", statusCode);
                }
            } catch (Exception e) {
                log.error("华为推送失败,{}", e.getMessage());
                return false;
            }
            return true;
        }
    

    相关文章

      网友评论

          本文标题:获取华为token、华为推送

          本文链接:https://www.haomeiwen.com/subject/xmjylrtx.html