• 當前位置:首頁 > IT技術 > 微信平臺 > 正文

    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送
    2021-08-07 18:53:02

    ?

    最近需要開發微信和小程序的推送功能,需要用java后臺實現推送,自己本身java和小程序都做,所以就自己動手實現下小程序的模版推送功能推送。

    實現思路

    • 1 小程序獲取用戶openid,收集formid傳給java后臺
    • 2 java推送消息給指定小程序用戶

    老規矩,還是先看效果圖

    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序模版消息推送
    我的這個是跑腿搶單推送,當用戶新下單時,會給跑腿員推送消息。

    下面開始講解實現步驟

    一,微信小程序管理后臺開通模版推送

    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_java實現小程序推送_02
    這里的模版id很重要,接下來我們推送的都是這個模版。

    二,java后臺實現推送所需字段
    • 1 看微信官方推送消息所需要的字段
      小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序消息推送_03
      小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_微信小程序推送_04
    • 2 有了官方說明,我門接下來就去拿到官方所需要的這些字段,來組裝請求數據就可以了。

    三,下面講解實現步驟

    我的java后臺是基于springboot開發的,如果你不了解spring boot,建議你先去了解下springboot再回來接著學習。
    還有RestTemplate是我們java后臺做get和post請求必須的,我們和微信服務器交互就用的RestTemplate

    • 1 首先根據官方推送所需字段組裝java-bean
      這里用到兩個javabean
    /*
    * 小程序推送所需數據
    * qcl 微信:2501902696
    * */
    @Data
    public class WxMssVo {
        private String touser;//用戶openid
        private String template_id;//模版id
        private String page = "index";//默認跳到小程序首頁
        private String form_id;//收集到的用戶formid
        private String emphasis_keyword = "keyword1.DATA";//放大那個推送字段
        private Map<String, TemplateData> data;//推送文字
    }
    
    /*
    * 設置推送的文字和顏色
    * qcl 微信:2501902696
    * */
    @Data
    public class TemplateData {
        //keyword1:訂單類型,keyword2:下單金額,keyword3:配送地址,keyword4:取件地址,keyword5備注
        private String value;//,,依次排下去
    //    private String color;//字段顏色(微信官方已廢棄,設置沒有效果)
    }
    

    到這里請求推送的數據就組裝好了,解下來我們去實現推送功能。
    奧不對,還有一個重要的字段需要獲取到:access_token

    access_token的獲取

    /*
        * 獲取access_token
        * appid和appsecret到小程序后臺獲取,當然也可以讓小程序開發人員給你傳過來
        * */
        public String getAccess_token(String appid, String appsecret) {
            //獲取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    

    這次是真正的可以來請求微信服務器來實現消息推送了

    /*
        * 微信小程序推送單個用戶
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //獲取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用戶openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:訂單類型,keyword2:下單金額,keyword3:配送地址,keyword4:取件地址,keyword5備注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下單待搶單");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("這里填下單金額的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("這里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("這里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("這里填備注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送結果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    

    openid可以讓小程序開發人員給你傳過來,也可以自己獲取。
    formid需要小程序開發給你傳過來,你也可以把formid存到數據庫里,什么時候需要直接拿出來用就可以了。
    注意:formid必須和用戶openid對應。

    下面貼出來完整代碼

    package com.qcl.paotuischool.wechat;
    
    import com.google.gson.Gson;
    import com.qcl.userwechat.bean.AccessToken;
    import com.qcl.utils.ConstantUtils;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * Created by qcl on 2018/9/11.
     * 微信小程序推送服務,
     * 包含獲取access_token的服務
     */
    @Service
    @Slf4j
    public class WxPushServiceQcl {
        //用來請求微信的get和post
        @Autowired
        private RestTemplate restTemplate;
    
    
        /*
        * 微信小程序推送單個用戶
        * */
        public String pushOneUser(String openid, String formid) {
    
    
            //獲取access_token
            String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +
                    "?access_token=" + access_token;
    
            //拼接推送的模版
            WxMssVo wxMssVo = new WxMssVo();
            wxMssVo.setTouser(openid);//用戶openid
            wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
            wxMssVo.setForm_id(formid);//formid
    
    
            Map<String, TemplateData> m = new HashMap<>(5);
    
            //keyword1:訂單類型,keyword2:下單金額,keyword3:配送地址,keyword4:取件地址,keyword5備注
            TemplateData keyword1 = new TemplateData();
            keyword1.setValue("新下單待搶單");
            m.put("keyword1", keyword1);
    
            TemplateData keyword2 = new TemplateData();
            keyword2.setValue("這里填下單金額的值");
            m.put("keyword2", keyword2);
            wxMssVo.setData(m);
    
            TemplateData keyword3 = new TemplateData();
            keyword3.setValue("這里填配送地址");
            m.put("keyword3", keyword3);
            wxMssVo.setData(m);
    
            TemplateData keyword4 = new TemplateData();
            keyword4.setValue("這里填取件地址");
            m.put("keyword4", keyword4);
            wxMssVo.setData(m);
    
            TemplateData keyword5 = new TemplateData();
            keyword5.setValue("這里填備注");
            m.put("keyword5", keyword5);
            wxMssVo.setData(m);
    
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(url, wxMssVo, String.class);
            log.error("小程序推送結果={}", responseEntity.getBody());
            return responseEntity.getBody();
        }
    
        /*
        * 獲取access_token
        * appid和appsecret到小程序后臺獲取,當然也可以讓小程序開發人員給你傳過來
        * */
        public String getAccess_token(String appid, String appsecret) {
            //獲取access_token
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                    "&appid=" + appid + "&secret=" + appsecret;
            String json = restTemplate.getForObject(url, String.class);
            AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);
            return accessToken.getAccess_token();
        }
    
    }
    

    在需要做推送的地方調用WxPushServiceQcl類中的pushOneUser方法,并傳入openid, formid參數即可。
    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序消息推送_05
    這是我推送成功后打印的log

    下面來講小程序端開發需要做些什么

    可以看出,我們的formid有效期是7天,并且一個form_id只能使用一次,所以我們小程序端所需要做的就是盡可能的多拿些formid,然后傳個后臺,讓后臺存到數據庫中,這樣7天有效期內,想怎么用就怎么用了。

    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序消息推送_06

    所以接下來要講的就是小程序開發怎么盡可能多的拿到formid了。

    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序模版消息推送_07
    看下官方提供的,只有在表單提交時把report-submit設為true時才能拿到formid,比如這樣

     <form report-submit='true' >
       <button  form-type='submit'>獲取formid</button>
      </form>
    

    所以我們就要在這里下功夫了,既然只能在form組件獲取,我們能不能把我們小程序里用到最多的地方用form來偽裝呢。
    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_小程序模版消息推送_08
    我的小程序是跑腿小程序,消息也主要推送給跑腿員的,而跑腿員點擊最多的也就是這兩個條目,所以我們就用from組件來偽裝這兩個條目,讓用戶在點擊的同時就可以收集到用的formid。

     <view class='button_item'>
      <form class="form_item" bindsubmit='gorRunnerLobby' report-submit='true' data-type="1">
       <button class="button" form-type='submit'>
        <text>搶單大廳</text>
        <text class='runner_desc'>(兼職也可月入萬元)</text>
       </button>
      </form>
      <view class='right_arrow' />
     </view>
    

    這樣就可以在用戶點擊條目時,收集到用戶formid了
    小程序消息推送(含源碼)java實現小程序推送,springboot實現微信消息推送_微信小程序推送_09
    由于上面的botton有默認樣式,所以我們就通過修改css來去除botton默認樣式。

    .button_item {
     width: 100%;
     display: flex;
     flex-direction: row;
     align-items: center;
     padding: 2px 20px;
     background: white;
     border-bottom: 1px solid gainsboro;
    }
    /* 主要通過這里去除botton默認樣式 */
    .button {
     width: 100%;
     background: white;
     border: none;
     text-align: left;
     padding: 6px 0px;
     margin: 0px;
     line-height: 1.5;
    }
    
    /* 主要通過這里去除botton邊框 */
    .button::after {
     border: none;
    }
    
    /* 用button偽裝獲取formid */
    
    .form_item {
     width: 100%;
    }
    

    到這里我們小程序端也圓滿完成自己的任務了。

    補充知識點

    這樣我們java后臺和小程序開發就可以開開心心的完成微信小程序的消息推送功能了。

    本文摘自 :https://blog.51cto.com/u

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码