这类推送通常官方文档都比较详细,若是想要更加详细的了解建议查看官方文档。html
官方文档地址:https://developer.huawei.com/consumer/cn/service/hms/pushservice.htmljava
华为推送服务在开发前须要些准备 1.注册认证成为开发者redis
2.配置应用签名数据库
3.建立产品和应用json
4.开通推送服务api
这些步骤按照官方文档一步步来就行,我这边是直接拿到了开发所须要的APPID,APP SECRET,PACKAGE NAME数组
注册和准备工做完成后就能够开始进行后台的代码编写了服务器
想要访问华为的服务接口必须须要一个Token,咱们第一步就是获取这个Token。并发
private static String appSecret = "appSecret";//用户在华为开发者联盟申请Push服务获取的服务参数 private static String appId = "12345678";//用户在华为开发者联盟申请Push服务获取的服务参数 private static String tokenUrl = "https://login.cloud.huawei.com/oauth2/v2/token"; //获取认证Token的URL private static String apiUrl = "https://api.push.hicloud.com/pushsend.do"; //应用级消息下发API private static String accessToken;//下发通知消息的认证Token private static long tokenExpiredTime; //accessToken的过时时间
首先定义好须要的参数,在实际开发中这些参数能够存放在数据库,也能够存放在配置文件中,看我的需求。app
接下来就是获取Token
private void refreshToken() { try { String msgBody = MessageFormat.format("grant_type=client_credentials&client_secret={0}&client_id={1}", URLEncoder.encode(appSecret, "UTF-8"), appId); String response = HttpUtil.post(tokenUrl, msgBody); JSONObject obj = JSONObject.parseObject(response); accessToken = obj.getString(“access_token”); tokenExpiredTime = System.currentTimeMillis()+(obj.getLong(“expires_in”)-5 * 60)*1000; } catch (Exception e) { LOGGER.error("HvPush -- >> 认证Token获取失败!缘由:e = {}", ExceptionUtil.getMessage(e)); } }
获取到了访问Token咱们就能够开始推送代码的编写了。
经过前面的代码咱们获取到了AccessToken,Token的存放按照不一样的需求能够放在redis或者数据库。
在发送消息以前首先先验证AccessToken是否已通过期
if(tokenExpiredTime <=System.currentTimeMillis()) { refreshToken(); }
接下来进行消息体的封装
// 封装推送消息body,用于显示通知栏消息显示的标题和内容 JSONObject body = new JSONObject();//仅通知栏消息须要设置标题和内容,透传消息key和value为用户自定义 body.put("title","Push message title");//消息标题 body.put("content","Push message content");//消息内容体 // 封装消息点击动做的参数,“com.huawei.hms.hmsdemo”为推送消息中须要打开的应用APK包名。请根据实际包名来修改。 JSONObject param = new JSONObject(); param.put("appPkgName","com.huawei.hms.hmsdemo");//定义须要打开的appPkgName,这个参数在推送服务管理页面能够看到 // 封装消息点击动做,用于定义通知栏点击行为 JSONObject action = new JSONObject(); action.put("type",3);//类型3为打开APP,其余行为请参考接口文档设置 action.put("param",param);//消息点击动做参数 // type为1时能够自定义行为,自定义行为须要app开发者事先给号参数 // param.put("intent", "自定义行为,动做须要app开发者编辑好给你"); // 封装消息类型,用于定义消息类型,区分是通知栏消息仍是透传消息。 JSONObject msg = new JSONObject(); msg.put("type",3);//3: 通知栏消息,异步透传消息请根据接口文档设置 msg.put("action",action);//消息点击动做 msg.put("body",body);//通知栏消息body内容示例代码 // 封装扩展消息,扩展消息中能够设置biTag用于消息打点,也能够携带customize参数用于触发通知栏点击事件的onEvent回调。 JSONObject ext = new JSONObject();//扩展信息,含BI消息统计,特定展现风格,消息折叠。 ext.put("biTag","Trump");//设置消息标签,若是带了这个标签,会在回执中推送给CP用于检测某种类型消息的到达率和状态 JSONObject temp = new JSONObject(); temp.put("season","Spring"); temp.put("weather","raining"); JSONArray customize = new JSONArray(); customize.add(temp); ext.put("customize",customize); // ext扩展信息这个参数我并没理解到究竟是干吗的 ,在实际的开发中我只使用了ext.put("biTag", "Trump"); 并无进行customize参数的携带 // 最后将以上信息所有封装整个消息体 JSONObject hps = new JSONObject();//华为PUSH消息总结构体 hps.put("msg",msg); hps.put("ext",ext); JSONObject payload = new JSONObject(); payload.put("hps",hps);
消息体封装完成后就能够开始发送推送消息了。
// 建立一个数组json用于存放须要推送的设备id,通常是由前段传过来,或者数据库查询出来 JSONArray deviceTokens = new JSONArray();//目标设备Token deviceTokens.add(regId); // 封装整个http消息并发送 String postBody = MessageFormat.format( "access_token={0}&nsp_svc={1}&nsp_ts={2}&device_token_list={3}&payload={4}", URLEncoder.encode(accessToken,"UTF-8"), URLEncoder.encode("openpush.message.api.send","UTF-8"), URLEncoder.encode(String.valueOf(System.currentTimeMillis() / 1000),"UTF-8"), URLEncoder.encode(deviceTokens.toString(),"UTF-8"), URLEncoder.encode(payload.toString(),"UTF-8")); String postUrl = apiUrl + "?nsp_ctx=" + URLEncoder.encode("{\"ver\":\"1\", \"appId\":\"" + appId + "\"}", "UTF-8"); // 发送消息 这里我用的是hutool的HttpUtil工具类发的post请求 String post = HttpUtil.post(postUrl, postBody); LOGGER.info("华为推送 -- >> 返回结果:" + post);
到此推送完成,返回结果与错误代码对应文档地址:https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_api_reference_agent_s2