微信小程序消息推送

微信小程序是支持消息推送的瞻凤,但是推送有個限制荞彼,只有form表單開啟report-submit,用戶點擊提交這樣表單的時候才可以獲得一個formid昂羡,推送時需要使用這個formid進(jìn)行推送。所以小程序消息推送需要解決formid的存儲摔踱,小程序內(nèi)部接口調(diào)用是AccessToken認(rèn)證兩大問題虐先。消息模板申請這里就不細(xì)說了。

1.獲取formid并儲存

在小程序上 表單form上添加一個report-submit <form bindsubmit='commitForm' report-submit='true'>
這樣在在提交表單的時候就可以獲得到這個formid派敷。

commitForm:function(e){
//獲取formid
   var fromId = e.detail.formId;
}

獲取到formid后只需要在提交這個表單的時候把formid一起帶到后臺然后進(jìn)行使用數(shù)據(jù)庫進(jìn)行保存就可以了蛹批。保存formid是最好把插入時間一起加上,這樣可以方便刪除已經(jīng)過了七天失效的formid篮愉。

這里需要注意的是每一個formid只能使用一次腐芍,且只有七天的時效。

所以我們需要使用Quartz任務(wù)調(diào)度定時清理掉超過七天失效的formid试躏。

/**
     * 微信小程序刪除過期formid 每天執(zhí)行一次
     */
    @Scheduled(cron = "0 00 0 * * ?")
    @Transactional
    public void clearTimeoutFormId() {
        //執(zhí)行sql清理過期未用的formId
        miniprogramFormIdMapper.deleteFormIdByTimeout();
    }

2. 獲取小程序AccessToken

官方說明:access_token 是小程序全局唯一后臺接口調(diào)用憑據(jù)猪勇,調(diào)用絕大多數(shù)后臺接口時都需使用。開發(fā)者可以通過 getAccessToken 接口獲取并進(jìn)行妥善保存颠蕴。

也就是服務(wù)端需要小程序的接口必須攜帶微信官方派發(fā)的accessToken令牌作為身份驗證泣刹。這個accessToken只有2小時的時效性助析,每獲取一次上次的的accessToken就會失效,為了保證效率需要使用定時器90分鐘自動更新一次椅您,每次需要使用accessToken就直接從數(shù)據(jù)庫去獲取即可外冀,不用在請求微信小程序接口獲取。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

/**
     * 獲取小程序全局唯一后臺接口調(diào)用憑據(jù) access_token 每90分鐘執(zhí)行一次
     */
    @Scheduled(cron = "0 */90 * * * ?")
    @Transactional
    public void getWechatMiniprogramAccessToken() {
        //發(fā)送GET請求
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = "https://api.weixin.qq.com/cgi-bin/token?" + "grant_type=client_credential&secret=123123&appid=456456";
            URL realUrl = new URL(urlNameString);
            // 打開和URL之間的連接
            URLConnection connection = realUrl.openConnection();
            // 設(shè)置通用的請求屬性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立實際的連接
            connection.connect();
            // 定義 BufferedReader輸入流來讀取URL的響應(yīng)
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 使用finally塊來關(guān)閉輸入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

        // 解析相應(yīng)內(nèi)容(轉(zhuǎn)換成json對象)
        JSONObject resultJson = JSON.parseObject(result);
        //拿到accesstoken
        String accesstoken = (String) resultJson.get("access_token");
        //保存accesstoken到數(shù)據(jù)庫
        miniprogramFormIdMapper.insertAccessToken(accesstoken);
    }

3.發(fā)送消息模板

有了formid和accessToken之后我們就可以發(fā)送消息推送了掀泳。

為了方便我們對消息模板的內(nèi)容進(jìn)行設(shè)置雪隧,最好聲明對象進(jìn)行儲存,然后直接用過fastJson將對象轉(zhuǎn)成json發(fā)送給小程序消息推送接口就可以完成消息推送员舵。

發(fā)送消息模板對象

import java.util.Map;

public class WeiXinTeamplateMsg {
    private String touser;//用戶openid
    private String template_id;//模版id
    private String page = "index";//默認(rèn)跳到小程序首頁
    private String form_id;//收集到的用戶formid
    private String emphasis_keyword = "keyword1.DATA";//放到那個推送字段
    private Map<String, TemplateData> data;//推送文字

    //getter and setter
    //.....
}

消息內(nèi)容對象

public class TemplateData {
    private String value;

     //getter and setter
    //.....
}

以小程序消息模版庫中模版編號為模板ID:AT1633 標(biāo)題:客服回復(fù)通知的模板為例膀跌。

發(fā)送消息的方法

import model.TemplateData;
import model.WeiXinTeamplateMsg;
import util.*;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

    /**
     * 微信小程序推送單個用戶
     *
     * @param access_token 令牌
     * @param openId       小程序用戶openId
     * @param formid       推送formid
     * @param value1       客服類型
     * @param value2       回復(fù)時間
     * @param value3       回復(fù)內(nèi)容
     * @param value4       詢問時間
     * @param value5       詢問事項
     * @param value6       溫馨提示
     * @return
     */
    public static String pushTicketReplyMsgToUser(String access_token, String openId, String formid, String value1, String value2, String value3, String value4, String value5, String value6) {
        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=" + access_token;

        //拼接推送的模版
        WeiXinTeamplateMsg weiXinTeamplateMsg = new WeiXinTeamplateMsg();
        weiXinTeamplateMsg.setTouser(openId);//用戶openid
        weiXinTeamplateMsg.setTemplate_id("Xs1515168sdaddd15aDASda6");//申請的消息模版id
        weiXinTeamplateMsg.setForm_id(formid);//formid
        weiXinTeamplateMsg.setPage("index");//跳轉(zhuǎn)的頁面


        Map<String, TemplateData> msgMap = new HashMap<>(5);

        TemplateData keyword1 = new TemplateData();
        keyword1.setValue(value1);
        msgMap.put("keyword1", keyword1);

        TemplateData keyword2 = new TemplateData();
        keyword2.setValue(value2);
        msgMap.put("keyword2", keyword2);
        weiXinTeamplateMsg.setData(msgMap);

        TemplateData keyword3 = new TemplateData();
        keyword3.setValue(value3);
        msgMap.put("keyword3", keyword3);
        weiXinTeamplateMsg.setData(msgMap);

        TemplateData keyword4 = new TemplateData();
        keyword4.setValue(value4);
        msgMap.put("keyword4", keyword4);
        weiXinTeamplateMsg.setData(msgMap);

        TemplateData keyword5 = new TemplateData();
        keyword5.setValue(value5);
        msgMap.put("keyword5", keyword5);
        weiXinTeamplateMsg.setData(msgMap);

        TemplateData keyword6 = new TemplateData();
        keyword6.setValue(value6);
        msgMap.put("keyword6", keyword6);
        weiXinTeamplateMsg.setData(msgMap);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, weiXinTeamplateMsg, String.class);
        return responseEntity.getBody();
    }

記住要將用過的formid給刪除掉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末固灵,一起剝皮案震驚了整個濱河市捅伤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巫玻,老刑警劉巖丛忆,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仍秤,居然都是意外死亡熄诡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诗力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰浮,“玉大人,你說我怎么就攤上這事苇本⊥嗉耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵瓣窄,是天一觀的道長笛厦。 經(jīng)常有香客問我,道長俺夕,這世上最難降的妖魔是什么裳凸? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮劝贸,結(jié)果婚禮上姨谷,老公的妹妹穿的比我還像新娘。我一直安慰自己映九,他們只是感情好梦湘,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般践叠。 火紅的嫁衣襯著肌膚如雪言缤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天禁灼,我揣著相機(jī)與錄音管挟,去河邊找鬼。 笑死弄捕,一個胖子當(dāng)著我的面吹牛僻孝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播守谓,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼穿铆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斋荞?” 一聲冷哼從身側(cè)響起荞雏,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎平酿,沒想到半個月后凤优,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蜈彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年筑辨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幸逆。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡棍辕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出还绘,到底是詐尸還是另有隱情楚昭,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布蚕甥,位于F島的核電站哪替,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菇怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一晌块、第九天 我趴在偏房一處隱蔽的房頂上張望爱沟。 院中可真熱鬧,春花似錦匆背、人聲如沸呼伸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括享。三九已至搂根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铃辖,已是汗流浹背剩愧。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留娇斩,地道東北人仁卷。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像犬第,于是被迫代替她去往敵國和親锦积。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容