小程式訂閱訊息推送(含原始碼)java實現小程式推送,springboo

bluepeach發表於2021-09-09

前面寫過一篇雲開發實現小程式訂閱訊息(模板訊息)推送的文章,是有好多同學用的是Java寫後臺,所以今天就再來寫一篇Java後臺實現小程式訂閱訊息推送的文章。

老規矩先看效果圖

圖片描述

至於如何建立模板訊息,如果獲取模板id我這節就不再講解,不知道的同學可以檢視我上篇文章裡面有詳細的講解。

今天呢就來重點講下如何在Java後臺編寫小程式訂閱訊息推送的知識。

其實我很早之前有寫過一篇Java實現模板訊息推送的,但是小程式後面用訂閱訊息替換了模板推送,所以我也會根據最新的知識點不定期的更新文章的。

傳送訂閱訊息三步走

  • 1,拿到使用者的openid
  • 2,獲取access_token
  • 3,呼叫小程式訊息推送的介面

一,獲取使用者的openid

關於使用者openid的獲取,我寫過很多篇文章了,也有錄過影片出來的,還不知道怎麼獲取的同學,可以取翻看下我之前的文章,或者看下我錄製的零基礎入門小程式的影片: 所以這一步不是今天的重點。

二,獲取access_token

首先來看下access_token是什麼,下圖是官方給出的
圖片描述
其實通俗的講,access_token就是小程式官方給我們提供的一個憑證,你要呼叫小程式官方的介面,就必須先拿到access_token。所以下面先講下如果獲取access_token

  • 看下官方文件,可以知道我們需要用到下面的幾個引數
    圖片描述
    grant_type是一個固定的值,只有appid和secret是需要我們填入的,這兩個值在我們的小程式後臺就可以拿到,我也有錄影片教大家如何拿到,如果不知道怎麼獲取的同學可以取看下我的影片。

下面就是Java程式碼的編寫了

我們這裡用的是springboot,這裡涉及到一個請求小程式官方介面,所以我們這裡用了springboot自帶的RestTemplate來做網路請求。具體程式碼如下。
圖片描述
可以看出程式碼很簡單,就是用RestTemplate來實現一個get請求,這樣我們就可以輕鬆的獲取到了access_token。

注意點

關於這個access_token,是存在有效期的,來看下官方給出的提示
圖片描述
所以我要在獲取到access_token的時候,把access_token存到資料庫,或者存到本地快取,並且還要記錄當前時間,後面再用的時候先判斷這個access_token有沒有超過2個小時,如果超過2個小時的話,就要重新獲取了。由於這裡不是本節的重點,我這裡只給大家說下原理。

三,傳送訊息到小程式

我們透過上面第二步,成功的獲取到了access_token。下面就要呼叫小程式官方為我們提供的傳送訊息的介面了。先看下官方文件。
圖片描述
上面的引數都是我們傳送訊息時需要的。這些引數的定義和設定我在前面的文章裡也都講過了,不知道的同學可以去看下我前面寫的這篇文章

這裡需要注意的一點是,我們要給使用者傳送訊息,就必須引導使用者授權,就是下面這個圖

圖片描述
因為使用者不點選允許,你是沒有辦法給使用者推送訊息的。每一次授權只允許傳送一條訊息,所以如果你想盡量多的傳送訊息,就得儘量多的引導使用者授權。

推送的Java程式碼如下

圖片描述
可以看到,我們這裡需要定義使用者的openid,模板id,跳轉路徑,模板訊息內容。。。

這些都定義好以後,我們就可以提供一個服務給到Java的其他程式碼呼叫,或者提供一個介面供外界傳入openid,然後給對應的使用者推送訊息了。

圖片描述
我們在瀏覽器裡呼叫上面介面,可以看到下圖所示,這樣就代表我們訊息推送成功了。
圖片描述

下面我把完整的程式碼貼出來給到大家。

package com.qcl.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 作者:程式設計小石頭
 * 傳送小程式訂閱訊息
 */
@RestController
public class SendWxMessage {

    /*
     * 傳送訂閱訊息
     * */
    @GetMapping("/pushOneUser")
    public String pushOneUser() {
        return push("o3DoL0WEdzcJ20AVJg1crP96gbjM");
    }

    public String push(String openid) {
        RestTemplate restTemplate = new RestTemplate();
        //這裡簡單起見我們每次都獲取最新的access_token(時間開發中,應該在access_token快過期時再重新獲取)
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken();
        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//使用者的openid(要傳送給那個使用者,通常這裡應該動態傳進來的)
        wxMssVo.setTemplate_id("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//訂閱訊息模板id
        wxMssVo.setPage("pages/index/index");

        Map<String, TemplateData> m = new HashMap<>(3);
        m.put("thing1", new TemplateData("小程式入門課程"));
        m.put("thing6", new TemplateData("杭州浙江大學"));
        m.put("thing7", new TemplateData("第一章第一節"));
        wxMssVo.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        return responseEntity.getBody();
    }


    @GetMapping("/getAccessToken")
    public String getAccessToken() {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> params = new HashMap<>();
        params.put("APPID", "wx7c54942dfc87f4d8");  //
        params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49");  //
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
        String body = responseEntity.getBody();
        JSONObject object = JSON.parseObject(body);
        String Access_Token = object.getString("access_token");
        String expires_in = object.getString("expires_in");
        System.out.println("有效時長expires_in:" + expires_in);
        return Access_Token;
    }
}

對應的兩個資料類如下
WxMssVo用來封裝請求官方介面的引數

package com.qcl.demo;

import java.util.Map;

/*
 * 小程式推送所需資料
 * 程式設計小石頭
 * */
public class WxMssVo {
    private String touser;//使用者openid
    private String template_id;//訂閱訊息模版id
    private String page = "pages/index/index";//預設跳到小程式首頁
    private Map<String, TemplateData> data;//推送文字

    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;
    }
}

TemplateData 用來定義訊息的內容

package com.qcl.demo;

public class TemplateData {
    private String value;//

    public TemplateData(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

到這裡我們就可以完整的實現Java傳送小程式訊息的功能了。完整程式碼也已經貼給大家了。

後面我會寫更多Java和小程式相關的文章出來,敬請期待

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2558/viewspace-2824687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章