java實(shí)現(xiàn)微信小程序的消息通知

這個(gè)功能可能我題目中的敘述有點(diǎn)問(wèn)題。重新解釋一下构罗,我們眾所周知的微信小程序和app大不相同长酗,最大的區(qū)別是app可以獨(dú)立進(jìn)行消息推送溪北,而微信小程序卻不行,也就是這個(gè)原因夺脾,所以小程序中如果想做什么提醒用戶(hù)的操作之拨,只能走訂閱推送了。大概的步驟就是小程序授權(quán)允許消息推送(反正就這個(gè)意思咧叭,是不是叫推送我不記得了)蚀乔,然后這樣當(dāng)有需要的時(shí)候可以把消息發(fā)送到微信的服務(wù)通知里,正常來(lái)講類(lèi)似于微信收到了一條新消息的那種模式菲茬。
然后java代碼的實(shí)現(xiàn)也比較簡(jiǎn)單吉挣,主要是配置什么的要符合微信小程序后臺(tái)的配置,需要注意的是這個(gè)需要獲取的參數(shù)有小程序的accessToken和小程序中用戶(hù)的openId婉弹,當(dāng)然了還有模板消息和消息實(shí)體對(duì)象之類(lèi)的睬魂。
所以我這里會(huì)寫(xiě)的比較長(zhǎng),openId的話應(yīng)該是存儲(chǔ)在小程序用戶(hù)的用戶(hù)信息表里的镀赌,所以這里不多敘述汉买,但是accessToken的話我這里是每次都去獲取,所以專(zhuān)門(mén)封裝了個(gè)方法(小程序開(kāi)發(fā)本身的appId和秘鑰就不說(shuō)了)佩脊。

獲取accessToken:

    static String appid = "你的appId";
    static String secret = "你的secret";
    public static String getAccessToken() throws Exception {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid
                + "&secret=" + secret;
        URL url = new URL(requestUrl);
        // 打開(kāi)和URL之間的連接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 設(shè)置通用的請(qǐng)求屬性
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        // 得到請(qǐng)求的輸出流對(duì)象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes("");
        out.flush();
        out.close();
        // 建立實(shí)際的連接
        connection.connect();
        // 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)
        BufferedReader in = null;
        if (requestUrl.contains("nlp"))
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
        else
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        String result = "";
        String getLine;
        while ((getLine = in.readLine()) != null) {
            result += getLine;
        }
        in.close();
        JSONObject jsonObject = JSON.parseObject(result);
        String accesstoken = jsonObject.getString("access_token");
        System.out.println(accesstoken);
        return accesstoken;
    }

如上蛙粘,是一個(gè)提煉的很好的獲取accessToken的方法垫卤,返回值也經(jīng)過(guò)處理只返回accessToken。

因?yàn)閛penId應(yīng)該是存儲(chǔ)在用戶(hù)表里出牧,所以這里不多敘說(shuō)穴肘,模板id也應(yīng)該在配置那里獲取到了,所以也可以用靜態(tài)常量表示舔痕。

發(fā)送小心代碼實(shí)現(xiàn)

這里有兩個(gè)是數(shù)據(jù)封裝的實(shí)體:

/**
 * 訂閱消息
 * @author  lisijia
 * @email   1151141449@qq.com
 * @date    2020/7/7 10:57 
 */
public class SubscribeMessage {
    //接口調(diào)用憑證
    private String access_token;
    //接收者(用戶(hù))的 openid
    private String touser;
    //所需下發(fā)的訂閱模板id
    private String template_id;
    //點(diǎn)擊模板卡片后的跳轉(zhuǎn)頁(yè)面评抚,僅限本小程序內(nèi)的頁(yè)面。支持帶參數(shù),(示例index?foo=bar)伯复。該字段不填則模板無(wú)跳轉(zhuǎn)慨代。
    private String page;
    //模板內(nèi)容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
    private Map<String, TemplateData> data;
 
    public String getAccess_token() {
        return access_token;
    }
 
    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
 
    public String getTouser() {
        return touser;
    }
 
    public void setTouser(String touser) {
        this.touser = touser;
    }
 
    public String getTemplate_id() {
        return template_id;
    }
 
    public void setTemplate_id(String template_id) {
        this.template_id = template_id;
    }
 
    public String getPage() {
        return page;
    }
 
    public void setPage(String page) {
        this.page = page;
    }
 
    public Map<String, TemplateData> getData() {
        return data;
    }
 
    public void setData(Map<String, TemplateData> data) {
        this.data = data;
    }
}
/**
 * @author  lisijia
 * @email   1151141449@qq.com
 * @date    2020/7/7 10:58  
 */
public class TemplateData {
 
    private String value;
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
 
    public TemplateData(String value) {
        this.value = value;
    }
 
}

然后是發(fā)送訂閱消息的方法(其實(shí)這里是分兩步的啸如,一步是單純的觸發(fā)發(fā)送訂閱消息侍匙,還有一部分是參數(shù)的命名及寫(xiě)法):

public static void subscribeMessage(String openId, String page, Map<String, TemplateData> map) {
        try {
            String accessToken = getAccessToken();
            SubscribeMessage subscribeMessage = new SubscribeMessage();
            // 拼接數(shù)據(jù)
            subscribeMessage.setAccess_token(accessToken);
            subscribeMessage.setTouser(openId);
            subscribeMessage.setTemplate_id(templateId);//事先定義好的模板id
            subscribeMessage.setPage(page);
            subscribeMessage.setData(map);
            String json = JSONObject.toJSONString(subscribeMessage);
            JsonNode ret = null;
            ret = Unirest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken)
                    .body(json).asJson().getBody();
            System.out.println(ret);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Map<String, TemplateData> map = new HashMap<>();
        map.put("date4", new TemplateData(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())));
        map.put("thing12", new TemplateData("溫度過(guò)高"));
        map.put("thing1", new TemplateData("氙燈老化試驗(yàn)箱"));
        map.put("thing2", new TemplateData("BJYSL-SN-500"));
        map.put("thing3", new TemplateData("實(shí)驗(yàn)箱溫度"));
        subscribeMessage("oPUD35dzUstVi8VDqMQOW1P6EElY", "", map);
    }

注意一下,這里的什么date4.thing12叮雳,thing2之類(lèi)的都是模板自動(dòng)生成的想暗,一定key名稱(chēng)要對(duì)應(yīng)上。還有thing是有長(zhǎng)度限制的帘不,好像是20字符说莫。
然后page參數(shù)我這里沒(méi)傳,說(shuō)實(shí)話我也不清楚是干啥的寞焙,反正之前我看的demo里就是空储狭。
至于這個(gè)openId一定是這個(gè)小程序下生成的openId屬于常識(shí),我順口也就提一下捣郊。
這個(gè)我認(rèn)為比較好的一點(diǎn)是報(bào)錯(cuò)信息寫(xiě)的非常明確辽狈,我之前遇到的幾個(gè)問(wèn)題都是一看報(bào)錯(cuò)信息就找到原因了,然后直接運(yùn)行main方法打印如下說(shuō)明發(fā)送成功了:


模板消息發(fā)送成功

本篇筆記就記到這里模她,如果稍微幫到你了記得點(diǎn)個(gè)喜歡點(diǎn)個(gè)關(guān)注,也祝大家工作順順利利懂牧!java技術(shù)交流群130031711侈净,歡迎各位的加入!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僧凤,一起剝皮案震驚了整個(gè)濱河市畜侦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躯保,老刑警劉巖旋膳,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異途事,居然都是意外死亡验懊,警方通過(guò)查閱死者的電腦和手機(jī)擅羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)义图,“玉大人减俏,你說(shuō)我怎么就攤上這事〖罟ぃ” “怎么了娃承?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怕篷。 經(jīng)常有香客問(wèn)我历筝,道長(zhǎng),這世上最難降的妖魔是什么廊谓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任梳猪,我火速辦了婚禮,結(jié)果婚禮上蹂析,老公的妹妹穿的比我還像新娘舔示。我一直安慰自己,他們只是感情好电抚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布惕稻。 她就那樣靜靜地躺著,像睡著了一般蝙叛。 火紅的嫁衣襯著肌膚如雪俺祠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天借帘,我揣著相機(jī)與錄音蜘渣,去河邊找鬼。 笑死肺然,一個(gè)胖子當(dāng)著我的面吹牛蔫缸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播际起,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拾碌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了街望?” 一聲冷哼從身側(cè)響起校翔,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灾前,沒(méi)想到半個(gè)月后防症,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蔫敲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饲嗽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡燕偶,死狀恐怖喝噪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情指么,我是刑警寧澤酝惧,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站伯诬,受9級(jí)特大地震影響晚唇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盗似,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一哩陕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赫舒,春花似錦悍及、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缺猛,卻和暖如春缨叫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荔燎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工耻姥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人有咨。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓琐簇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親座享。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婉商,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348