Java微信公众号开发(二)与微信后台对接

需要的jar包

  • dom4j-1.6.1.jar
  • servlet-api.jar
  • xstream-1.3.1.jar

创建servlet类

doGet方法用于验证消息的确来自微信服务器
  • 获取这个五个参数
    signature、timestamp、timestamp、nonce、echostr
  • 调用CheckUtil类里的checkSignature()方法进行验证
    此方法写好后直接调用,涉及一些加密算法无需多看
    五个参数的作用

填写服务器配置

  • URL为内网映射工具得到的地址
  • token与代码中的一致

容易出现的问题

  • doGet方法不要继承父类,否则会出现405错误
    这里写图片描述

代码部分

package xyz.quinntian.servlet;
public class WeixinServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    //super.doGet(req, resp);
    String signature = req.getParameter("signature");
    System.out.println("signature:"+signature);
    String timestamp = req.getParameter("timestamp");
    System.out.println("timestamp:"+timestamp);
    String nonce = req.getParameter("nonce");
    System.out.println("nonce:"+nonce);
    String echostr = req.getParameter("echostr");
    System.out.println("echostr:"+echostr);
    PrintWriter out =resp.getWriter();
    if (CheckUitl.checkSignature(signature, timestamp, nonce)) {
        System.err.println("验证成功");
        out.println(echostr);
    }else {
        System.out.println("验证失败");
    }
}

工具类

package xyz.quinntian.Uitl;

import java.security.MessageDigest;
import java.util.Arrays;

public class CheckUitl {
    private static final String token = "quinn";

    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 排序
        Arrays.sort(arr);
        // 生成字符串
        StringBuffer content = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        // sha加密
        String temp = getSha1(content.toString());
        System.out.println(signature);
        System.out.println(temp);
        return temp.equals(signature);

    }

    public static String getSha1(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));
            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];

            }
            return new String(buf);
        } catch (Exception e) {
            return null;
        }
    }
}
### Java 微信公众号开发本地测试环境搭建 #### 1. 准备工作 为了设置Java微信公众号开发的本地测试环境,需要安装并配置一些必要的工具和服务。 - **JDK 安装** 确保已安装 JDK 并设置了 JAVA_HOME 环境变量。可以通过命令 `java -version` 来验证是否成功安装[^3]。 - **IDE 配置** 推荐使用 IntelliJ IDEA 或 Eclipse 进行项目开发。这些 IDE 提供了良好的调试支持和插件生态。 - **Maven 构建工具** 用于管理依赖项和构建项目。通过 Maven 可以轻松引入所需的库文件,如 WeChat SDK 和其他第三方包。 #### 2. 获取开发者凭证 前往微信公众平台官网注册成为开发者,并获取 AppID 和 AppSecret。这两个参数对于后续接口调用至关重要。 #### 3. 设置服务器地址 由于微信服务器无法直接访问内网 IP 地址,在本地环境中需借助 ngrok 工具来创建隧道映射外部可访问 URL 到本机服务端口上运行的应用程序实例。 下载并启动 ngrok 后执行如下命令: ```bash ./ngrok http 8080 ``` 这会生成一个公网可用链接,将其作为回调URL提交给微信后台审核备案。 #### 4. 开发框架集成 选择合适的开源框架简化开发流程,比如 Weixin-java-tools 库提供了丰富的 API 封装,能够快速实现消息处理逻辑等功能模块。 添加 Maven 依赖到 pom.xml 文件中: ```xml <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>LATEST_VERSION_HERE</version> </dependency> ``` 注意替换 LATEST_VERSION_HERE 为最新版本号。 #### 5. 编写核心业务代码 基于所选框架编写接收事件推送、发送被动回复以及主动发起请求等相关功能的具体实现方式。 例如定义控制器类监听来自微信的消息通知路径 `/wechat/callback`: ```java @RestController @RequestMapping("/wechat") public class WeChatController { private final WxMpService wxMpService; @Autowired public WeChatController(WxMpService wxMpService) { this.wxMpService = wxMpService; } @GetMapping("/callback") public String handleGet(@RequestParam(name="signature", required=false) String signature, @RequestParam(name="timestamp", required=false) String timestamp, @RequestParam(name="nonce", required=false) String nonce, @RequestParam(name="echostr", required=false) String echostr){ try{ if(wxMpService.checkSignature(timestamp, nonce, signature)){ return echostr; // 返回随机字符串完成对接验证 } }catch(Exception e){ log.error(e.getMessage(),e); } return "error"; } } ``` 以上展示了 GET 请求处理器方法用来响应首次接入时的安全校验过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值