最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信公眾號開發(fā)消息推送功能

 更新時間:2026年02月07日 09:24:55   作者:linx丶q  
微信公眾號分為服務號、訂閱號、企業(yè)號,訂閱號可以個人申請,服務號和企業(yè)號要有企業(yè)資質才可以,這篇文章主要介紹了微信公眾號開發(fā)消息推送功能,需要的朋友可以參考下

微信公眾號開發(fā)

代碼地址

運行效果

在這里插入圖片描述

微信公眾號簡介

微信公眾號分為服務號、訂閱號、企業(yè)號,訂閱號可以個人申請,服務號和企業(yè)號要有企業(yè)資質才可以。

我們所說的微信公眾號開發(fā)指的是訂閱號和服務號。關于訂閱號和服務器的區(qū)別,官方是這樣解釋的

  • 服務號:主要偏向于服務交互(功能類似12315,114,銀行,提供綁定信息,服務交互),每月可群發(fā)4條消息;服務號**適用人群:媒體、企業(yè)、政府或其他組織。
  • 訂閱號:主要偏向于為用戶傳達資訊,(功能類似報紙雜志,為用戶提供新聞信息或娛樂趣事),每天可群發(fā)1條消息;訂閱號**適用人群:個人、媒體、企業(yè)、政府或其他組織。

注冊微信公眾號

進入微信公眾號注冊頁面https://mp.weixin.qq.com/點擊公眾號右上方的注冊按鈕,進入注冊界面,填寫基本信息,選擇訂閱號, 完成身份認證, 即可。

注冊測試公眾號

個人訂閱號有一些接口是沒有權限的,也就是說個人訂閱號無法調用一些高級的權限接口,如生成二維碼、網頁授權、自定義菜單、微信支付這樣的接口權限個人訂閱號是沒有調用權限的, 幸運的是,微信公眾平臺提供了測試公眾賬號,測試公眾號有很多個人訂閱號不具備的權限, 測試公眾號的注冊地址為:

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

用微信掃描頁面中的二維碼進行登錄,登錄成功后,就可以看到騰訊分配給我們的測試公眾號的信息了,如下圖所示, 接下來我們就可以搭建環(huán)境,進行開發(fā)測試了

img

測試公眾號的所擁有的接口權限如下:

image.png

image.png

搭建微信本地調試環(huán)境

開發(fā)基于微信公眾號的應用最大的痛苦之處就是調試問題,每次實現一個功能后都需要部署到一個公網服務器進行測試,因為微信用戶每次向公眾號發(fā)起請求時,微信服務器會先接收到用戶的請求,然后再轉發(fā)到我們的服務器上,也就是說,微信服務器是要和我們的服務器進行網絡交互,所以我們必須保證我們的服務器外網可以訪問到,這種部署到公網服務器進行測試的做法對于我們開發(fā)者來說簡直是噩夢。所以我們要想一個辦法可以做到本地部署,本地調試代碼,而要做到這一點,那么我們要解決的問題就是將內網的部署服務器映射到外網,讓微信服務器可以正常訪問到,幸運的是,借助于第三方軟件Ngrok,我們就可以做得到。Ngrok是一個免費的軟件Ngrok,使用Ngrok后,我們就可以實現內網穿透,也就是說我們可以將內網的服務器映射到外網給別人訪問,這對于我們在本地開發(fā)環(huán)境中調試微信代碼是以及給用戶演示一些東西非??焖俸陀袔椭?因為可以直接使用我們自己的內網的電腦作為服務器。不過需要特殊訪問.常用的內網穿透工具有natapp,ngrok,dingding,關于微信公眾號開發(fā),這三個工具我都使用了,只有natapp可以正常開發(fā)。

關于natapp的使用網上很多,我在這里就不在介紹了。

natapp成功標志

在這里插入圖片描述

可以通過訪問http://xt77eg.natappfree.cc訪問到我們本機的服務

微信公眾號接入(校驗簽名)

開發(fā)者提交信息后,微信服務器將發(fā)送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:

在這里插入圖片描述

開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發(fā)者成功,否則接入失敗。加密/校驗流程如下:

1)將token、timestamp、nonce三個參數進行字典序排序

2)將三個參數字符串拼接成一個字符串進行sha1加密

3)開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信

@Controller
@RequestMapping(value = "wx")
public class WeiController{

    /**
     * 公眾號appid
     */
    @Value("${wx.appid}")
    private  String appid;

    /**
     * 公眾號appSecret
     */
    @Value("${wx.secret}")
    private  String secret;

    /**
     * 微信消息接收和token驗證
     * @param request
     * @param response
     * @throws IOException
     */
    @GetMapping("/weChatToken")
    public  void weChat(HttpServletRequest request, HttpServletResponse response) {
        boolean isGet = request.getMethod().toLowerCase().equals("get");
        if (isGet) {
            // 微信加密簽名
            String signature = request.getParameter("signature");
            // 時間戳
            String timestamp = request.getParameter("timestamp");
            // 隨機數
            String nonce = request.getParameter("nonce");
            // 隨機字符串
            String echostr = request.getParameter("echostr");
            // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗
            if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
                try {
                    PrintWriter print = response.getWriter();
                    print.write(echostr);
                    print.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class CheckoutUtil {


    public static  String token  = "999";

    /**
     * 驗證簽名
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 將token、timestamp、nonce三個參數進行字典序排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;

        try {
            md = MessageDigest.getInstance("SHA-1");
            // 將三個參數字符串拼接成一個字符串進行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToHex(digest );
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 將sha1加密后的字符串可與signature對比,標識該請求來源于微信
        return tmpStr != null ? tmpStr.equals(signature) : false;
    }
    
    /**
     * 十六進制字節(jié)數組轉為字符串
     * @param hash
     * @return
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }


進入微信測試公眾號管理界面,在接口配置信息中填入映射的外網地址和代碼中聲明的token,如下圖所示:

點擊提交,會顯示配置成功,如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bPMvNxRI-1608702695943)(typora-user-images\image-20201214105001081.png)]

到此,我們的公眾號應用已經能夠和微信服務器正常通信了,也就是說我們的公眾號已經接入到微信公眾平臺了。

給指定用戶推送消息

網頁授權獲取用戶openid

如果用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息(openId),進而實現業(yè)務邏輯。

關于網頁授權回調域名的說明:

1、在微信公眾號請求用戶網頁授權之前,開發(fā)者需要先到公眾平臺官網中的“開發(fā) - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息”的配置選項中,修改授權回調域名。請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加 http:// 等協議頭;

2、授權回調域名配置規(guī)范為全域名,比如需要網頁授權的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑒權。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 無法進行OAuth2.0鑒權

3、如果公眾號登錄授權給了第三方開發(fā)者來進行管理,則不必做任何設置,由第三方代替公眾號實現網頁授權即可

獲取用戶openId步驟:

1、引導用戶進入授權頁面同意授權,獲取code

2、通過code換取openId

代碼如下:

@Controller
@RequestMapping(value = "wx")
public class WeiController{


    private  String appid="微信公眾號的appid";
    private  String secret="微信公眾號的secret";

    /**
     * 獲取微信用戶code,并重定向獲取用戶openId
     * @return
     */
    @GetMapping("/getUserCode")
    public String  getUserCode(){
        String backUrl = "http://xt77eg.natappfree.cc/wx/getUserOpenId";
        String getOpenIdUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+ backUrl+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
        getOpenIdUrl = getOpenIdUrl.replace("APPID",appid);
        return "redirect:" + getOpenIdUrl;
    }

    /**
     * 獲取用戶openId
     * @return
     * @throws IOException
     */
    @GetMapping("/getUserOpenId")
    @ResponseBody
    public  String getUserOpenId()throws IOException{
        //獲取code
        String code = request.getParameter("code");
        //換取用戶openid
        String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        url=url.replace("APPID", appid).replace("SECRET", secret).replace("CODE", code);
        JSONObject result = Util.doGetJson(url);
        JSONObject jSONObject = JSONObject.parseObject(String.valueOf(result));
        String openid = jSONObject.getString("openid");
        return openid;
    }

給指定用戶發(fā)送模板信息

首先要準備一個模板,測試號可自定義模板,但在正式公眾號我們要申請,或者使用別人已經申請過的模板。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KtE1NG6h-1608702695950)(typora-user-images\image-20201214111214457.png)]

pom:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--微信模版消息推送三方sdk-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>2.1.8.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

Controller:

@Controller
@RequestMapping(value = "wx")
public class WeiController{
    @Resource
    PushMessageService pushMessageService;

    /**
     * 向每個用戶推送消息
     * @return
     */
    @GetMapping("/sendMessage")
    @ResponseBody
    public String sendMessage(){
        String openId =  "用戶openId";
        if(!"".equals(openId)){
            AlarmParamsDTO dto = new AlarmParamsDTO("申請進度", "國家獎學金", "申請通過", time, "成功");
            dto.setOpenId(openId);
            pushMessageService.pushMessage(dto);
        }
        return "success";
    }

Service:

@Service
@Slf4j
public class PushMessageServiceImpl implements PushMessageService{

    private  String appid="微信公眾號appid";
    private  String secret="微信公眾號secret";

    /**
     * 給微信公眾號某個用戶推送信息
     * @param alarmParamsDTO
     */
    @Override
    public void pushMessage(AlarmParamsDTO alarmParamsDTO) {
        //1,配置
        WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
        wxStorage.setAppId(appid);
        wxStorage.setSecret(secret);
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxStorage);
        List<WxMpTemplateData> wxMpTemplateData = Arrays.asList(
                new WxMpTemplateData("first",alarmParamsDTO.getFirst(),"#000000"),
                new WxMpTemplateData("keyword1",alarmParamsDTO.getKeyword1(),"#000080"),
                new WxMpTemplateData("keyword2",alarmParamsDTO.getKeyword2(),"#0000FF"),
                new WxMpTemplateData("keyword3",alarmParamsDTO.getKeyword3(),"#FFD700"),
                new WxMpTemplateData("remark",alarmParamsDTO.getRemark(),"#00FF00")
        );
        //2,推送消息
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                .toUser(alarmParamsDTO.getOpenId())
                .templateId("tIDrdFcqFGMsTnc462H49_DbjgXUuIjsqIlQttq7VDE")
                .data(wxMpTemplateData)
                .url("http://www.baidu.com")
                .build();
        try {
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (Exception e) {
            System.out.println("推送失?。? + e.getMessage());
        }

    }
}

entity:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class AlarmParamsDTO {


    /**
     * 推送信息小標題
     */
    private String first;

    /**
     * 學生姓名
     */
    private String keyword1;

    /**
     * 申請資助類型
     */
    private String keyword2;

    /**
     * 申請狀態(tài)
     */
    private String keyword3;

    /**
     * 申請結果
     */
    private String remark;

    /**
     * 用戶微信openId,唯一標識
     */
    private String openId;

    public AlarmParamsDTO(String first, String keyword1, String keyword2, String keyword3, String remark) {
        this.first = first;
        this.keyword1 = keyword1;
        this.keyword2 = keyword2;
        this.keyword3 = keyword3;
        this.remark = remark;
    }
}

到此這篇關于微信公眾號開發(fā)消息推送功能的文章就介紹到這了,更多相關微信公眾號開發(fā)消息推送內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA基礎 語句標簽的合法使用,以及{}語句塊到底有什么用?

    JAVA基礎 語句標簽的合法使用,以及{}語句塊到底有什么用?

    以前的一個思維誤區(qū),for(){},if(){}之類的用法中,邏輯if()和語句塊{}應該是相互獨立的兩種語法
    2012-08-08
  • Java基于SpringBoot和tk.mybatis實現事務讀寫分離代碼實例

    Java基于SpringBoot和tk.mybatis實現事務讀寫分離代碼實例

    這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實現事務讀寫分離代碼實例,讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操作,而從數據庫處理SELECT查詢操作,數據庫復制被用來把事務性操作導致的變更同步到集群中的從數據庫,需要的朋友可以參考下
    2023-10-10
  • Java 文件解壓縮實現代碼

    Java 文件解壓縮實現代碼

    這篇文章主要介紹了Java 文件解壓縮實現代碼,有需要的朋友可以參考一下
    2013-12-12
  • Scala異常處理的方法深入分析

    Scala異常處理的方法深入分析

    Scala是一種多范式的編程語言,支持面向對象和函數式編程。Scala也支持異常處理,即在程序運行過程中發(fā)生意外或錯誤時,采取相應的措施
    2023-04-04
  • Jmeter跨線程組傳值調用實現圖解

    Jmeter跨線程組傳值調用實現圖解

    這篇文章主要介紹了Jmeter跨線程組傳值調用實現圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Spring Boot 集成 mybatis核心機制

    Spring Boot 集成 mybatis核心機制

    這篇文章給大家介紹Spring Boot 集成 mybatis核心機制,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-11-11
  • SpringBoot 2 統一異常處理過程解析

    SpringBoot 2 統一異常處理過程解析

    這篇文章主要介紹了SpringBoot 2 統一異常處理過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot生成jar/war包的布局應用

    SpringBoot生成jar/war包的布局應用

    在 Spring Boot 中,"布局應用"(Application Layout)指的是打包生成的可執(zhí)行 jar 或 war 文件中的內容組織結構,本文給大家介紹了SpringBoot生成jar/war包的布局應用,需要的朋友可以參考下
    2024-02-02
  • 解析iReport自定義行數分頁的操作方法

    解析iReport自定義行數分頁的操作方法

    ireport默認都是自動分頁數據超出頁面長度就會自動分到下一頁,但有時候業(yè)務需要一頁只顯示固定幾行這時候就需要自定義條數了。下面看具體操作吧
    2021-10-10
  • RocketMQTemplate 注入失敗的解決

    RocketMQTemplate 注入失敗的解決

    這篇文章主要介紹了RocketMQTemplate 注入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

房山区| 新巴尔虎右旗| 明水县| 昭觉县| 于田县| 兖州市| 洪泽县| 宝应县| 库尔勒市| 连城县| 泰安市| 饶河县| 龙门县| 安塞县| 原阳县| 台州市| 仪征市| 华亭县| 高雄市| 和田县| 文山县| 中山市| 罗城| 吉木乃县| 奎屯市| 吉隆县| 紫金县| 伊春市| 吴忠市| 尼木县| 贡觉县| 平安县| 余江县| 镇雄县| 汾西县| 苏尼特右旗| 清河县| 台南市| 长宁县| 额敏县| 眉山市|