为了账号安全,请及时绑定邮箱和手机立即绑定

Java微信项目教程:从入门到实践

标签:
Java 小程序
概述

本文提供了详细的Java微信项目教程,涵盖了从环境配置到项目部署的全过程。内容包括开发环境的安装、微信开发者工具的配置以及编写第一个Java微信应用。此外,还介绍了微信消息处理和接口开发的实战案例。

Java微信项目简介

微信开发的基础知识

微信开发是一项基于微信公众平台进行的应用开发任务,它能够使开发者创建各种各样的应用,如自动回复、公众号、小程序等。微信开发的基础知识包括以下几点:

  1. 微信公众平台:微信公众平台是微信提供的一个平台,让开发者可以创建和管理微信公众号、小程序、小游戏等不同类型的微信应用。开发者需要在微信公众平台注册账号,并创建公众号或小程序才能进行开发。

  2. 微信文档:在微信公众平台提供的文档中,开发者可以找到各种接口的使用说明、示例代码等。这些文档是进行微信开发的重要资源。

  3. 微信消息类型:微信的消息类型主要包括文本消息、图片消息、语音消息、视频消息等。开发者需要了解这些消息类型以便进行相应的处理。

  4. 微信接口:微信公众平台提供了丰富的接口供开发者使用,例如获取access_token接口、发送消息接口、用户管理接口等。开发者需要根据应用需求调用相应的接口来实现功能。

Java在微信开发中的应用

Java是一种广泛使用的编程语言,具有跨平台、丰富的类库等特点,非常适合开发微信应用。以下是一些Java在微信开发中的应用案例:

  1. Java后端服务:可以使用Java开发微信应用的后端服务,例如接收微信服务器推送的消息,对消息进行处理并返回相应的响应。后端服务可以通过Spring Boot等框架快速搭建。

  2. 微信小程序后端:可以使用Java开发微信小程序的后端服务,提供接口供小程序调用。后端服务可以处理小程序的各种请求,例如用户登录、数据查询等。

  3. 微信公众号后台:可以使用Java开发微信公众号的后台管理系统,例如用户管理、内容管理、订单管理等。通过后台管理系统,管理员可以方便地管理公众号的内容与用户。

  4. 微信企业应用:可以使用Java开发微信企业应用,例如企业微信的自定义应用、小程序等。企业微信提供了一些特殊的接口,可以帮助开发者实现企业内部的沟通与协作。
准备开发环境

安装Java开发工具

为了开发Java微信项目,首先需要安装Java开发工具。以下是安装步骤:

  1. 安装JDK:JDK(Java Development Kit)是Java开发工具包,包括Java编译器、Java运行环境等。可以从Oracle官网或OpenJDK官网下载JDK,并按照安装向导进行安装。

  2. 安装IDE:IDE(Integrated Development Environment)是集成开发环境,可以帮助开发者编写、调试和运行代码。推荐使用IntelliJ IDEA或Eclipse,这两个IDE都支持Java开发,并且提供了许多方便的功能。

  3. 配置环境变量:安装完成后,需要配置环境变量。打开计算机的环境变量设置,添加JDK的安装路径。例如,假设JDK安装在C:\Program Files\Java\jdk-11.0.1,需要将JAVA_HOME设置为C:\Program Files\Java\jdk-11.0.1,并将%JAVA_HOME%\bin添加到PATH路径中。

通过以上步骤,可以成功安装Java开发工具并配置好开发环境。

配置微信开发者工具

为了开发Java微信项目,还需要配置微信开发者工具。以下是配置步骤:

  1. 注册微信公众平台账号:在微信公众平台官网注册一个账号,并登录后创建一个公众号或小程序。

  2. 获取AppID和AppSecret:在公众号或小程序的设置中获取AppID和AppSecret,这些是调用微信接口时需要的参数。

  3. 下载并安装微信开发者工具:微信开发者工具是官方提供的一个调试工具,可以帮助开发者调试和预览微信小程序或公众号。可以在微信公众平台官网下载微信开发者工具,并按照安装向导进行安装。

  4. 创建并配置项目:使用微信开发者工具创建一个新的项目,并填写AppID和AppSecret。在项目设置中,可以配置项目的基本信息,例如项目名称、项目路径等。

通过以上步骤,可以成功配置微信开发者工具并准备好开发环境。

创建第一个Java微信应用

创建项目结构

为了创建第一个Java微信应用,需要首先创建项目结构。以下是创建步骤:

  1. 创建新的Java项目:使用IntelliJ IDEA或Eclipse创建一个新的Java项目,例如命名为WeChatApp

  2. 添加依赖库:需要添加一些依赖库支持微信开发。可以通过Maven或Gradle添加依赖库。例如,使用Maven在pom.xml文件中添加以下依赖:

    <dependencies>
       <dependency>
           <groupId>com.google.code.gson</groupId>
           <artifactId>gson</artifactId>
           <version>2.8.6</version>
       </dependency>
       <dependency>
           <groupId>org.apache.httpcomponents</groupId>
           <artifactId>httpclient</artifactId>
           <version>4.5.13</version>
       </dependency>
       <dependency>
           <groupId>com.squareup.okhttp3</groupId>
           <artifactId>okhttp</artifactId>
           <version>4.9.0</version>
       </dependency>
    </dependencies>
  3. 创建项目目录结构:项目目录结构可以参考以下示例:

    WeChatApp
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── wechat
    │   │   │               ├── WeChatApp.java
    │   │   │               └── util
    │   │   │                   └── HttpUtil.java
    │   │   └── resources
    │   └── test
    │       └── java
    │           └── com
    │               └── example
    │                   └── wechat
    │                       └── WeChatAppTest.java
    └── pom.xml

编写第一个Hello World程序

编写第一个Java微信应用的Hello World程序。以下是一个示例代码:

package com.example.wechat;

import com.google.gson.Gson;

public class WeChatApp {
    private static final String APP_ID = "your-app-id";
    private static final String APP_SECRET = "your-app-secret";

    public static void main(String[] args) {
        String accessToken = HttpUtil.getAccessToken(APP_ID, APP_SECRET);
        System.out.println("Access Token: " + accessToken);

        if (accessToken != null) {
            System.out.println("Hello World from Java WeChat App!");
        } else {
            System.out.println("Failed to get access token.");
        }
    }
}

在上述代码中,首先定义了AppID和AppSecret,然后调用了HttpUtil.getAccessToken方法获取access_token。HttpUtil类封装了HTTP请求的方法,以下是一个简单的实现:

package com.example.wechat.util;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

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

public class HttpUtil {
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

    public static String getAccessToken(String appId, String appSecret) {
        try {
            URL url = new URL(ACCESS_TOKEN_URL + "&appid=" + appId + "&secret=" + appSecret);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            in.close();
            connection.disconnect();

            Gson gson = new Gson();
            JsonObject json = gson.fromJson(content.toString(), JsonObject.class);
            return json.get("access_token").getAsString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

上述代码中,HttpUtil.getAccessToken方法通过HTTP GET请求获取access_token。通过调用该方法,可以实现获取access_token的功能。如果获取成功,则输出Hello World;否则输出失败信息。

通过以上步骤,可以成功创建并运行第一个Java微信应用的Hello World程序。

微信消息处理

消息接收与处理

为了实现微信消息的接收与处理,需要编写相应的代码。以下是一个示例代码:

package com.example.wechat;

import com.google.gson.Gson;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    private static final String TOKEN = "your-token";
    private static final String APP_ID = "your-app-id";
    private static final String APP_SECRET = "your-app-secret";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        if (checkSignature(signature, timestamp, nonce)) {
            response.getWriter().println(echostr);
        } else {
            response.getWriter().println("Invalid request");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        if (checkSignature(signature, timestamp, nonce)) {
            response.getWriter().println(echostr);
        } else {
            response.getWriter().println("Invalid request");
        }
    }

    private boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] params = {TOKEN, timestamp, nonce};
        java.util.Arrays.sort(params);
        StringBuilder sb = new StringBuilder();
        for (String param : params) {
            sb.append(param);
        }
        String hash = java.security.MessageDigest.getInstance("SHA1").digest(sb.toString().getBytes()).toString();
        return hash.equals(signature);
    }

    protected void handleTextMessage(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String message = request.getParameter("content");
        String fromUserName = request.getParameter("FromUserName");
        String toUserName = request.getParameter("ToUserName");

        String replyMessage = "<xml>\n" +
                " <ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>\n" +
                " <FromUserName><![CDATA[" + toUserName + "]]></FromUserName>\n" +
                " <CreateTime>" + System.currentTimeMillis() + "</CreateTime>\n" +
                " <MsgType><![CDATA[text]]></MsgType>\n" +
                " <Content><![CDATA[Hello, " + message + "]]></Content>\n" +
                "</xml>";

        response.getWriter().println(replyMessage);
    }
}

在上述代码中,MessageServlet类实现了微信消息的接收与处理。该类继承了HttpServlet类,并重写了doPostdoGet方法。

doPost方法中,首先从请求参数中获取signature、timestamp、nonce和echostr等参数,然后调用checkSignature方法进行签名验证。如果验证通过,则输出echostr;否则输出无效请求信息。

doGet方法中,也进行了类似的签名验证。如果验证通过,则输出echostr;否则输出无效请求信息。

checkSignature方法中,首先将TOKEN、timestamp和nonce按字典序排序,然后拼接成字符串。接着使用SHA1算法计算字符串的哈希值,并与signature进行比较,如果相等则返回true;否则返回false。

handleTextMessage方法中,从请求参数中获取消息内容、发送者用户名和接收者用户名等信息。然后构造回复消息的XML格式字符串,并将其输出到响应中。

通过以上代码,可以实现消息接收与处理的功能。当微信服务器发送消息时,会向该Servlet发送POST请求,该Servlet会根据请求参数进行处理,并返回响应。

回复用户消息

为了回复用户消息,需要编写相应的代码。以下是一个示例代码:

package com.example.wechat;

import com.google.gson.Gson;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    private static final String TOKEN = "your-token";
    private static final String APP_ID = "your-app-id";
    private static final String APP_SECRET = "your-app-secret";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        if (checkSignature(signature, timestamp, nonce)) {
            String requestBody = getRequestBody(request);
            Gson gson = new Gson();
            Message message = gson.fromJson(requestBody, Message.class);
            if (message != null) {
                String fromUserName = message.getFromUserName();
                String toUserName = message.getToUserName();
                String content = message.getContent();

                String replyMessage = "<xml>\n" +
                        " <ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>\n" +
                        " <FromUserName><![CDATA[" + toUserName + "]]></FromUserName>\n" +
                        " <CreateTime>" + System.currentTimeMillis() + "</CreateTime>\n" +
                        " <MsgType><![CDATA[text]]></MsgType>\n" +
                        " <Content><![CDATA[Hello, " + content + "]]></Content>\n" +
                        "</xml>";

                response.getWriter().println(replyMessage);
            }
        } else {
            response.getWriter().println("Invalid request");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");

        if (checkSignature(signature, timestamp, nonce)) {
            response.getWriter().println(echostr);
        } else {
            response.getWriter().println("Invalid request");
        }
    }

    private boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] params = {TOKEN, timestamp, nonce};
        java.util.Arrays.sort(params);
        StringBuilder sb = new StringBuilder();
        for (String param : params) {
            sb.append(param);
        }
        String hash = java.security.MessageDigest.getInstance("SHA1").digest(sb.toString().getBytes()).toString();
        return hash.equals(signature);
    }

    private String getRequestBody(HttpServletRequest request) throws IOException {
        BufferedReader reader = request.getReader();
        StringBuilder requestBody = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            requestBody.append(line);
        }
        return requestBody.toString();
    }
}

class Message {
    private String FromUserName;
    private String ToUserName;
    private String CreateTime;
    private String MsgType;
    private String Content;

    public String getFromUserName() {
        return FromUserName;
    }

    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }

    public String getToUserName() {
        return ToUserName;
    }

    public void setToUserName(String toUserName) {
        ToUserName = toUserName;
    }

    public String getCreateTime() {
        return CreateTime;
    }

    public void setCreateTime(String createTime) {
        CreateTime = createTime;
    }

    public String getMsgType() {
        return MsgType;
    }

    public void setMsgType(String msgType) {
        MsgType = msgType;
    }

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }
}

在上述代码中,MessageServlet类实现了用户消息的回复。该类重写了doPost方法。

doPost方法中,首先从请求参数中获取signature、timestamp、nonce和echostr等参数,然后调用checkSignature方法进行签名验证。如果验证通过,则获取请求体内容并将其解析为Message对象。然后构造回复消息的XML格式字符串,并将其输出到响应中。如果验证不通过,则输出无效请求信息。

通过以上代码,可以实现用户消息的回复功能。当微信服务器发送消息时,会向该Servlet发送POST请求,该Servlet会根据请求体内容进行处理,并返回响应。

微信接口开发

获取access_token

为了调用微信接口,首先需要获取access_token。以下是一个示例代码:

package com.example.wechat.util;

import com.google.gson.Gson;

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

public class HttpUtil {
    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

    public static String getAccessToken(String appId, String appSecret) {
        try {
            URL url = new URL(ACCESS_TOKEN_URL + "&appid=" + appId + "&secret=" + appSecret);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            in.close();
            connection.disconnect();

            Gson gson = new Gson();
            JsonObject json = gson.fromJson(content.toString(), JsonObject.class);
            return json.get("access_token").getAsString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

在上述代码中,HttpUtil.getAccessToken方法通过HTTP GET请求获取access_token。该方法首先构造请求URL,然后打开连接并设置请求方法、超时时间等参数。接着从响应流中读取内容,并将其解析为JSON对象。最后从JSON对象中获取access_token并返回。

通过以上代码,可以实现获取access_token的功能。在调用该方法时,需要传入AppID和AppSecret,返回值为access_token字符串。

发送模板消息

为了发送模板消息,需要编写相应的代码。以下是一个示例代码:

package com.example.wechat.util;

import com.google.gson.Gson;

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

public class HttpUtil {
    private static final String TEMPLATE_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";

    public static String sendTemplateMessage(String accessToken, String templateMessage) {
        try {
            URL url = new URL(TEMPLATE_MESSAGE_URL + accessToken);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);

            // Write template message to output stream
            connection.getOutputStream().write(templateMessage.getBytes());
            connection.getOutputStream().flush();
            connection.getOutputStream().close();

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            in.close();
            connection.disconnect();

            return content.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

在上述代码中,HttpUtil.sendTemplateMessage方法通过HTTP POST请求发送模板消息。该方法首先构造请求URL,然后打开连接并设置请求方法、输出流等参数。接着将模板消息写入输出流并关闭输出流。最后从响应流中读取内容并返回。

通过以上代码,可以实现发送模板消息的功能。在调用该方法时,需要传入access_token和模板消息字符串,返回值为响应内容。

使用access_token调用其他微信接口

除了获取access_token和发送模板消息之外,还可以使用access_token调用其他微信接口。以下是一个示例代码,展示了如何获取用户列表:

package com.example.wechat.util;

import com.google.gson.Gson;

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

public class HttpUtil {
    private static final String USER_LIST_URL = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=";

    public static String getUserList(String accessToken) {
        try {
            URL url = new URL(USER_LIST_URL + accessToken);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            in.close();
            connection.disconnect();

            return content.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

在上述代码中,HttpUtil.getUserList方法通过HTTP GET请求获取用户列表。该方法首先构造请求URL,然后打开连接并设置请求方法、超时时间等参数。接着从响应流中读取内容并返回。

通过以上代码,可以实现调用其他微信接口的功能。在调用该方法时,需要传入access_token,返回值为响应内容。

实战案例分析

实现简单的微信小程序

为了实现一个简单的微信小程序,需要编写相应的代码。以下是一个示例代码:

package com.example.wechat;

import com.google.gson.Gson;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/api")
public class WeChatApiServlet extends HttpServlet {
    private static final String APP_ID = "your-app-id";
    private static final String APP_SECRET = "your-app-secret";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getParameter("action");
        if ("getAccessToken".equals(action)) {
            String accessToken = HttpUtil.getAccessToken(APP_ID, APP_SECRET);
            response.getWriter().println(accessToken);
        } else if ("sendTemplateMessage".equals(action)) {
            String accessToken = HttpUtil.getAccessToken(APP_ID, APP_SECRET);
            String templateMessage = request.getParameter("templateMessage");
            String result = HttpUtil.sendTemplateMessage(accessToken, templateMessage);
            response.getWriter().println(result);
        } else {
            response.getWriter().println("Invalid action");
        }
    }
}

在上述代码中,WeChatApiServlet类实现了简单的微信小程序功能。该类继承了HttpServlet类,并重写了doGet方法。

doGet方法中,首先从请求参数中获取action。然后根据action调用相应的操作。例如,如果action为"getAccessToken",则调用HttpUtil.getAccessToken方法获取access_token,并将其输出到响应中。如果action为"sendTemplateMessage",则调用HttpUtil.getAccessToken方法获取access_token,然后从请求参数中获取模板消息字符串,并调用HttpUtil.sendTemplateMessage方法发送模板消息,最后将响应内容输出到响应中。如果action无效,则输出无效操作信息。

通过以上代码,可以实现简单的微信小程序功能。用户可以通过访问相应的URL并传入action参数,调用后端服务实现相应的操作。

JSON格式模板消息示例

// 示例模板消息
String templateMessage = "{ \"touser\": \"OPENID\", \"template_id\": \"TEMPLATE_ID\", \"data\": { \"first\": { \"value\": \"您好,您的订单已更新。\", \"color\": \"#173155\" }, \"keyword1\": { \"value\": \"订单编号\", \"color\": \"#0000FF\" }, \"keyword2\": { \"value\": \"订单状态\", \"color\": \"#FF0000\" }, \"keyword3\": { \"value\": \"2023-04-25\", \"color\": \"#008000\" }, \"remark\": { \"value\": \"如有疑问,请随时联系客服。\", \"color\": \"#666666\" } } }";

项目部署与上线

为了将Java微信项目部署到服务器并上线,需要进行以下步骤:

  1. 打包项目:使用Maven或Gradle打包项目为可执行的WAR文件。例如,使用Maven的命令为mvn package

  2. 部署到服务器:将打包好的WAR文件上传到服务器,并将其部署到应用服务器(如Tomcat)中。具体的部署方法取决于服务器和应用服务器的配置。

  3. 配置服务器环境:在服务器上安装并配置JDK、Tomcat等环境。可以参考Tomcat的官方文档进行配置。

  4. 配置微信服务器:在微信公众平台的服务器配置中,填写服务器地址和端口。例如,填写服务器IP地址和8080端口。

  5. 测试部署:在部署完成后,可以通过访问相应的URL进行测试。确保所有功能都能正常运行。

通过以上步骤,可以成功部署Java微信项目并将其上线。在上线过程中,需要注意测试和监控,确保项目的稳定运行。

通过以上内容,可以深入学习并掌握Java微信项目的开发过程。从基础概念到实战应用,一步步实现一个完整的Java微信项目。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消