国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java項目】SpringBoot項目完成微信公眾號收到用戶消息自動回復(fù)功能附帶視頻(超詳細(xì))

這篇具有很好參考價值的文章主要介紹了【Java項目】SpringBoot項目完成微信公眾號收到用戶消息自動回復(fù)功能附帶視頻(超詳細(xì))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

視頻講解

視頻講解

基礎(chǔ)注冊

首先你需要先注冊一個你的微信公眾號
微信公眾號平臺
然后打開下面的自動回復(fù)功能
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信
之后進(jìn)入到你的開發(fā)者中心
開發(fā)者中心基本配置
公眾號自動回復(fù)java,java,java,spring boot,微信
然后生成你的開發(fā)者密碼,開發(fā)者id,以及設(shè)置你的IP白名單。
這里的IP白名單中的IP必須是一個公網(wǎng)IP,因為微信官方會把他們的請求發(fā)送到公網(wǎng)上,然后你接受到請求之后需要給這個請求做一個響應(yīng)才能實現(xiàn)消息互通的功能。
公眾號自動回復(fù)java,java,java,spring boot,微信
之后開始配置你的服務(wù)器信息
公眾號自動回復(fù)java,java,java,spring boot,微信
首先是URL,這里的URL需要填寫的是
http://ip:80/path(這里的path滿足請求路徑的格式即可)
或者是
https://ip:443/path
公眾號自動回復(fù)java,java,java,spring boot,微信
之后你的SpringBoot項目中就需要用到這些配置了

Java部分代碼

我們首先對pom文件進(jìn)行配置,因為微信的數(shù)據(jù)格式為xml,
所以我們需要引入能解析xml和轉(zhuǎn)換xml的依賴,如下
這里我的springboot版本為2.7.7,但是這個影響應(yīng)該不大,如果出現(xiàn)一些問題可以嘗試換一下依賴版本

      <!-- XML 文件讀寫 -->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- java對象轉(zhuǎn)換為xml字符串 -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.19</version>
        </dependency>
        <dependency>
            <groupId>com.github.liyiorg</groupId>
            <artifactId>weixin-popular</artifactId>
            <version>2.8.30</version>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.7.0</version>
        </dependency>

之后在項目中配置你的這些微信官方給你的信息即可
公眾號自動回復(fù)java,java,java,spring boot,微信
然后我剛才說過,微信會向公網(wǎng)上你剛才輸入的地址發(fā)送請求,是一個get請求,并且會攜帶上一些參數(shù),我們要做的就是解析這些參數(shù),代碼如下
下面是Controller層的代碼

import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Log
@RestController
@RequestMapping("/wx")
public class TokenCheckController {
    @Value("${wechat.mp.token}")
    private String token;
	@GetMapping("/")
    public String index(HttpServletResponse response, HttpServletRequest request) throws Exception {
        String echostr = TokenCheckUtil.checkToken(request, token);
        return echostr;
    }
}
   @PostMapping("/")
    public String chatGPTproxy(
            HttpServletResponse response,
            HttpServletRequest request,
            @RequestBody String requestBody, @RequestParam("signature") String signature,
            @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
            @RequestParam(name = "encrypt_type", required = false) String encType,
            @RequestParam(name = "msg_signature", required = false) String msgSignature) {

        System.out.println("requestbody:----"+requestBody);
        return requestBody;
}

下面是TokenCheckUtil工具包的代碼

import javax.servlet.http.HttpServletRequest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import static cn.hutool.crypto.SecureUtil.sha1;

/**
 * @author: 張錦標(biāo)
 * @date: 2023/4/2 15:10
 * TokenCheckUtil類
 */
public class TokenCheckUtil {
    public static String checkToken(HttpServletRequest request, String token) throws NoSuchAlgorithmException {
        String method = request.getMethod();
        //微信token驗證get請求
        if ("GET".equals(method)) {
            //微信加密簽名
            String echostr = request.getParameter("echostr");//時閱鮫
            String signature = request.getParameter("signature");//隨機(jī)寧符串
            String timestamp = request.getParameter("timestamp");//隨機(jī)數(shù)
            String nonce = request.getParameter("nonce");
            String[] str = {token, timestamp, nonce};
            //字典排序
            Arrays.sort(str);
            String bigStr = str[0] + str[1] + str[2];// SHA1加密
            String digest = sha1(bigStr);//對比簽名
            if (digest.equals(signature)) {
                return echostr;
            } else {
                return "";
            }
        }
        return "";
    }
}

上面兩個完成之后,只要你點擊測試,微信就會向這個接口發(fā)送一個Get請求,并且其請求參數(shù)如上代碼,需要對這些參數(shù)進(jìn)行校驗對比之后返回一個echostr,代碼只需要直接按照上面的照抄即可。
然后繼續(xù)看controller層的代碼,有一個post請求,微信官方會將接收到的用戶消息發(fā)送到這個post請求上,你只需要把get請求改為post,路徑不變即可。
其請求數(shù)據(jù)在請求體中,因此需要使用的是@RequestBody注解

測試

這里我們先簡單的做一個測試,把項目使用maven進(jìn)行打包,然后部署到你的云服務(wù)器上面去
微信公眾號測試號管理
這里由于只是先做了一個測試,所以使用的是測試號管理,這里就不需要端口一定設(shè)定為80了,但是等真的變成上線了,那么就需要使用80端口,不過,你可以進(jìn)行一下代理,比如使用nginx
公眾號自動回復(fù)java,java,java,spring boot,微信
之后你就可以點擊提交,然后如果說按照上面的步驟的話,是沒有問題的,就會出現(xiàn)如下情況
公眾號自動回復(fù)java,java,java,spring boot,微信
上面的URL配置成功之后,就可以讓你的朋友去掃你的測試號二維碼然后讓他們關(guān)注后給你發(fā)消息了。
公眾號自動回復(fù)java,java,java,spring boot,微信
當(dāng)他們給你發(fā)消息之后,你會接收到如下的消息,其格式為XML
首先你會收到一個訂閱公眾號的消息,可以看到有一個Event標(biāo)簽,然后當(dāng)用戶給你發(fā)送消息的時候,你還會收到一個Content標(biāo)簽,其中的內(nèi)容就是用戶給你發(fā)送的內(nèi)容
公眾號自動回復(fù)java,java,java,spring boot,微信
那么此時你需要做的就是去解析XML并且獲得你需要的數(shù)據(jù)

解析XML并取得需要的數(shù)據(jù)

Java實體類,用于接受請求并且封裝


import lombok.Data;


/**
 * @author: 張錦標(biāo)
 * @date: 2023/4/2 15:03
 * ReceiveMessage類
 */
@Data
public class ReceiveMessage {
    /**
     * 開發(fā)者微信號
     */
    private String ToUserName;
    /**
     * 發(fā)送方賬號(一個openid)
     */
    private String FromUserName;
    /**
     * 消息創(chuàng)建時間(整形)
     */
    private String CreateTime;
    /**
     * 消息類型
     */
    private String MsgType;
    /**
     * 文本消息內(nèi)容
     */
    private String Content;
    /**
     * 消息ID 64位
     */
    String MsgId;
    /**
     * 消息的數(shù)據(jù)ID 消息來自文章才有
     */
    private String MsgDataId;
    /**
     * 多圖文時第幾篇文章,從1開始 消息如果來自文章才有
     */
    private String Idx;
    /**
     * 訂閱事件 subscribe訂閱 unsbscribe取消訂閱
     */
    private String Event;
}

XML工具包

import com.towelove.file.domain.wechat.ReceiveMessage;
import com.towelove.file.domain.wechat.ReplyMessage;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.io.StringWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
/**
 * @author: 張錦標(biāo)
 * @date: 2023/4/2 15:13
 * XMLUtil類
 */
public class XMLUtil {
    public static void main(String[] args) {
        String str = "" +
                "<xml><ToUserName><![CDATA[gh_71a0837d69a6]]></ToUserName>\n" +
                "<FromUserName><![CDATA[oy__X6O4BjH9QyyOcQaj55-O5Awo]]></FromUserName>\n" +
                "<CreateTime>1680533388</CreateTime>\n" +
                "<MsgType><![CDATA[text]]></MsgType>\n" +
                "<Content><![CDATA[123]]></Content>\n" +
                "<MsgId>24059451823534879</MsgId>\n" +
                "</xml>";
        System.out.println(XMLUtil.XMLTOModel(str));
    }
    public  static ReceiveMessage XMLTOModel(String str) {
        ReceiveMessage receiveMessage = new ReceiveMessage();
        try {
            Document document = DocumentHelper.parseText(String.valueOf(str));
            Element root = document.getRootElement();
            receiveMessage.setToUserName(root.elementText("ToUserName"));
            receiveMessage.setFromUserName(root.elementText("FromUserName"));
            receiveMessage.setMsgType(root.elementText("MsgType"));
            receiveMessage.setContent(root.elementText("Content"));
            receiveMessage.setCreateTime(root.elementText("CreateTime"));
            receiveMessage.setMsgId(root.elementText("MsgId"));
            //receiveMessage.setMsgDataId(root.elementText("MsgDataId"));
            //receiveMessage.setIdx(root.elementText("Idx"));
            關(guān)注
            //receiveMessage.setEvent(root.elementText("Event"));
        } catch (Exception e) {
            System.out.println(e);
        }
        return receiveMessage;
    }

    public static String ObjToXml(ReplyMessage obj) throws Exception {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement(obj.getClass().getSimpleName());
        convertObjectToXml(obj, root);
        StringWriter stringWriter = new StringWriter();
        XMLWriter writer = new XMLWriter(stringWriter);
        writer.write(document);
        writer.close();
        return stringWriter.toString();
    }
    private static void convertObjectToXml(Object obj, Element element) throws Exception {
        Class<?> clazz = obj.getClass();
        for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            Element child = element.addElement(field.getName());
            Object value = field.get(obj);
            if (value != null) {
                if (value.getClass().isPrimitive() || value.getClass() == java.lang.String.class) {
                    child.setText(value.toString());
                } else {
                    convertObjectToXml(value, child);
                }
            }
        }
    }
}

然后我們使用測試方法來測試一下這段解析代碼是否有效
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信

實現(xiàn)消息自動回復(fù)

那么按照上面的邏輯,我們就已經(jīng)大概知道微信給我們發(fā)送的到底是什么樣子的數(shù)據(jù)了,那么我們只要按照微信官方定義的,在post方法里面把請求返回回去即可,我們先來看一下官方文檔
官方文檔
公眾號自動回復(fù)java,java,java,spring boot,微信
這里需要主要,此時的ToUserName和FromUserName就得改變了。
因為上面的xml中,ToUserName就是我們自己,F(xiàn)romUserName就是用戶,而此時我們要做的是給用戶返回數(shù)據(jù),所以此時ToUserName是用戶,F(xiàn)romUserName是我們自己。
所以先修改一下代碼
公眾號自動回復(fù)java,java,java,spring boot,微信
然后我們來使用一個main函數(shù)來做一下測試

 public static void main(String[] args) {
        try {
            // 創(chuàng)建document對象
            Document document = DocumentHelper.createDocument();
            // 創(chuàng)建根節(jié)點bookRoot
            Element xml = document.addElement("xml");
            // 向根節(jié)點中添加第一個節(jié)點
            Element toUserName = xml.addElement("ToUserName");
            // 向子節(jié)點中添加屬性
            toUserName.addCDATA("oy__X6JbTiLxEVG85ABtAawsc_qw");
            Element fromUserName = xml.addElement("FromUserName");
            fromUserName.addCDATA("gh_71a0837d69a6");
            Element createTime = xml.addElement("CreateTime");
            createTime.addCDATA(String.valueOf(System.currentTimeMillis()));
            Element msgType = xml.addElement("MsgType");
            msgType.addCDATA("text");
            Element content = xml.addElement("Content");
            content.addCDATA("hello呀,我是張錦標(biāo)");


            System.out.println(document.getRootElement().asXML());

            // 設(shè)置生成xml的格式
            OutputFormat of = OutputFormat.createPrettyPrint();
            // 設(shè)置編碼格式
            of.setEncoding("UTF-8");
            // 生成xml文件
            File file = new File("D:\\desktop\\student.xml");
            if (file.exists()){
                file.delete();
            }
            //創(chuàng)建一個xml文檔編輯器
            XMLWriter writer = new XMLWriter(new FileOutputStream(file), of);
            //把剛剛創(chuàng)建的document放到文檔編輯器中
            writer.write(document);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最終的格式如下
公眾號自動回復(fù)java,java,java,spring boot,微信
既然可以了,那么我們開始修改post里面的代碼
所以post請求體中的代碼修改如下

  @PostMapping("/")
    public String chatGPTproxy(
            HttpServletResponse response,
            HttpServletRequest request,
            @RequestBody String requestBody, @RequestParam("signature") String signature,
            @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
            @RequestParam(name = "encrypt_type", required = false) String encType,
            @RequestParam(name = "msg_signature", required = false) String msgSignature) {

        System.out.println("requestbody:----"+requestBody);
        ReceiveMessage receiveMessage = XMLUtil.XMLTOModel(requestBody);
        return parseMsgToXML(receiveMessage);
    }

最終結(jié)果如下
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信
對了,特別注意,如果你的消息回復(fù)的時間會超過5s,那么這次的自動回復(fù)會失敗,所以如果說你的消息查詢特別久,那么就需要用客服回復(fù),之后我會繼續(xù)完成這個功能的。

實測

上面的測試功能已經(jīng)成功了,那么我們把項目的端口換為80,然后在試一下
記住項目要放到云服務(wù)器上哦
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信

公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信
公眾號自動回復(fù)java,java,java,spring boot,微信文章來源地址http://www.zghlxwxcb.cn/news/detail-544386.html

到了這里,關(guān)于【Java項目】SpringBoot項目完成微信公眾號收到用戶消息自動回復(fù)功能附帶視頻(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包