java集成華爲推送

集成華爲推送

這類推送通常官方文檔都比較詳細,若是想要更加詳細的瞭解建議查看官方文檔。html

官方文檔地址:https://developer.huawei.com/consumer/cn/service/hms/pushservice.htmljava

華爲推送服務在開發前須要些準備 1.註冊認證成爲開發者redis

2.配置應用簽名數據庫

3.建立產品和應用json

4.開通推送服務api

這些步驟按照官方文檔一步步來就行,我這邊是直接拿到了開發所須要的APPID,APP SECRET,PACKAGE NAME數組

註冊和準備工做完成後就能夠開始進行後臺的代碼編寫了服務器

第一步 應用服務器獲取AccessToken

想要訪問華爲的服務接口必須須要一個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咱們就能夠開始推送代碼的編寫了。

第二步 應用服務器發送PUSH消息

經過前面的代碼咱們獲取到了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);

消息體參數詳細文檔地址:https://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush_agent.html?page=hmssdk_huaweipush_api_reference_agent_s2

消息體封裝完成後就能夠開始發送推送消息了。

// 建立一個數組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

相關文章
相關標籤/搜索