java微信公众号平台开发,建立及接口配置展示

随着科技水平的发展,java的应用也更加全面化和深度化。越来越多的人开始投入到java的学习当中来,深受其益。今天主要为大家介绍下java微信公众号平台的建立及接口配置的具体操作方法。

一、首先是开发前的准备工作。

先查看微信公众号开发文档,然后在入门指引查看验证消息需要的参数。开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

微信公众号的建立

之后开发者通过检验signature对请求进行校验。如果确认此次GET请求来自微信服务器,原样返回echostr参数内容,那么就是接入生效,成为开发者成功。不然就是接入失败。

加密/校验流程如下:

①将token、timestamp、nonce三个参数进行字典序排序;

② 将三个参数字符串拼接成一个字符串进行sha1加密;

③开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。

下面就可以进行开发了:

首先创建一个web工程

springboot项目启动类,代码如下:

package cc.feefox.wechat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);
    }
}

控制类,代码如下:

package cc.feefox.wechat.main;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * 
 * @Package: cc.feefox.wechat.main 
 * @author: cc   
 * @date: 2020年8月18日 下午12:17:55
 */
public class BaseController
{
    protected static final String _CSRF_RANDOM_TOKEN = "_CSRF_RANDOM_TOKEN";
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;
    public HttpServletRequest getRequest()
    {
        return request;
    }
    public void setRequest(HttpServletRequest request)
    {
        this.request = request;
    }
    public HttpServletResponse getResponse()
    {
        return response;
    }
    public void setResponse(HttpServletResponse response)
    {
        this.response = response;
    }
}
package cc.feefox.wechat.main;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import cc.feefox.wechat.common.util.SignatureUtil;
/**
 * 微信消息入口
 * 
 * @Package: cc.feefox.wechat.main
 * @author: cc
 * @date: 2020年8月18日 下午12:18:39
 */
@RestController
@RequestMapping("/wechat")
public class WeChatController extends BaseController
{
    private static final Logger logger = LoggerFactory.getLogger(WeChatController.class);
    /**
     * 校验信息是否是从微信服务器发出,处理消息
     * 
     * @param request
     * @param out
     * @throws IOException
     */
    @RequestMapping(value = "/handler", method = {
        RequestMethod.GET
        , RequestMethod.POST
    })
    public void processPost() throws Exception
    {
        this.getRequest()
            .setCharacterEncoding("UTF-8");
        this.getResponse()
            .setCharacterEncoding("UTF-8");
        logger.info("开始校验信息是否是从微信服务器发出");
        // 签名
        String signature = this.getRequest()
            .getParameter("signature");
        // 时间戳
        String timestamp = this.getRequest()
            .getParameter("timestamp");
        // 随机数
        String nonce = this.getRequest()
            .getParameter("nonce");
        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
        if (SignatureUtil.checkSignature(signature, timestamp, nonce))
        {
            // 随机字符串
            String echostr = this.getRequest()
                .getParameter("echostr");
            logger.debug("接入成功,echostr {}", echostr);
            this.getResponse()
                .getWriter()
                .write(echostr);
        }
    }
}

签名验证,代码如下:

package cc.feefox.wechat.common.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import cc.feefox.wechat.common.constant.WechatConstant;
/**
 * 校验签名工具类
 * @Package: cc.feefox.wechat.common.util 
 * @author: cc   
 * @date: 2020年8月18日 下午12:17:19
 */
public class SignatureUtil
{
    // 此处的token即为微信接口配置填写的签名
    private static final String TOKEN = "weixin";
    /**
     * 验证签名
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce)
    {
        // 1.将token、timestamp、nonce三个参数进行字典序排序
        String[] arr = new String[]
        {
            TOKEN
            , timestamp
            , nonce
        };
        Arrays.sort(arr);
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
        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 = byteToStr(digest);
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        content = null;
        // 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        Boolean asd = tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
        return asd;
    }
    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray)
    {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++)
        {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }
    /**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte)
    {
        char[] Digit = {
            '0'
            , '1'
            , '2'
            , '3'
            , '4'
            , '5'
            , '6'
            , '7'
            , '8'
            , '9'
            , 'A'
            , 'B'
            , 'C'
            , 'D'
            , 'E'
            , 'F'
        };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        return new String(tempArr);
    }
}

二、接下来是接口配置,如图所示:

微信公众号接口配置

URL: http://域名:80/wechat/handler 或者是https://域名:443/wechat/handler

TOKEN:weixin 与SignatureUtil类中定义的TOKEN常量一致。

最后是启动服务点击提交。

以上就是关于java微信公众号平台开发,建立及接口配置展示的具体操作流程。想要了解更多java经典实例,敬请关注奇Q工具网。

推荐阅读:

在java中如何用Apche CXF开发webservice,实际操作展示

java工作流开发要怎么实现?

java如何实现进度条开发的流程?详细实例展示