這類推送通常官方文檔都比較詳細,若是想要更加詳細的瞭解建議查看官方文檔。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