微信公众号开发——接口配置信息的开发

开篇先吐槽一下微信公众号开发官方文档,看的真累

接口配置信息

文档地址

EncodingAESKey 暂时不需要处理,用于加密解密消息的

  • 配置url

    这个url用户接收和被动回复用户消息。微信会调用这个url,故需要可以外网访问

开发界面

  • 接口实现

    • 查看文档:
      在这里插入图片描述

    • request请求

      • 接口url: GET http://xxxxxx/wxchat/access

        • 参数

          参数描述
          signature微信加密签名,signature结合了开发者填写的 token参数和请求中的timestamp参数、nonce参数。
          timestamp时间戳
          nonce随机数
          echostr随机字符串
    • response

      直接返回string

  • 上代码

// controller层
@GetMapping("/wxchat/access")
   public String wxAccess(@RequestParam("signature") String signature,
                          @RequestParam("timestamp") String timestamp,
                          @RequestParam("nonce") String nonce,
                           @RequestParam("echostr") String echostr
                           ){

       System.out.println("signature:"+signature);
       System.out.println("timestamp:"+timestamp);
       System.out.println("nonce:"+nonce);
       System.out.println("echostr:"+echostr);
       //直接return echostr 也是可以的
       if (SignUtil.checkSignature(signature, timestamp, nonce)) {
           System.out.println("校验成功!!!!!!!!!!!!!");
           return echostr;
       }

       return "";
   }

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

/**
 * @program: wxchat
 * @author: zzg
 * @create: 2021-01-20 21:15
 */
public class SignUtil {

    // 与接口配置信息中的Token要一致
    private static String token = "zzg";

    /**
     * 验证签名
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        System.out.println("--------------");
        System.out.println(signature);
        String[] arr = new String[] { token, timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }

        String tmpStr = null;

        try {
            tmpStr = sha1(content.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        System.out.println(tmpStr);
        System.out.println("-------------------");
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toLowerCase()) : false;
    }


    /**
     * sha1加密
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static String sha1(String data) throws NoSuchAlgorithmException {

        //信息摘要器                                算法名称
        MessageDigest md = MessageDigest.getInstance("SHA1");
        //把字符串转为字节数组
        byte[] b = data.getBytes();
        //使用指定的字节来更新我们的摘要
        md.update(b);
        //获取密文  (完成摘要计算)
        byte[] b2 = md.digest();
        //获取计算的长度
        int len = b2.length;
        //16进制字符串
        String str = "0123456789abcdef";
        //把字符串转为字符串数组
        char[] ch = str.toCharArray();


        char[] chs = new char[len*2];

        //将字节转换为十六进制字符串
        for(int i=0,k=0;i<len;i++) {
            //获取摘要计算后的字节数组中的每个字节
            byte b3 = b2[i];
            // >>>:无符号右移
            // &:按位与
            //0xf:0-15的数字
            chs[k++] = ch[(b3 >>> 4) & 0xf];
            chs[k++] = ch[b3 & 0xf];
        }

        //字符数组转为字符串
        return new String(chs);
    }
}

启动服务,微信开发工具点击提交。
在这里插入图片描述

搞定,收工。

上一篇:微信公众号开发—本地环境的搭建(申请测试账号和内网穿透)

下一篇微信公众号开发——接收用户消息和回复消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值