Official Account -- 01 -- Java微信公众号服务器配置(验证Token)

原文链接:Official Account – 01 – Java微信公众号服务器配置(验证Token)


相关文章


在开发微信公众号时,需要先去微信公众平台填写服务器配置,并验证 Token,没想到第一步就踩坑了!!!


一、服务器配置

在这里插入图片描述

  • 路径:开发 --> 基本配置 --> 服务器配置

  • 参数说明

    • 服务器地址 (URL)

      • 注意:该 URL 一定要通过外网能访问到 (此处我使用了 frp 进行内网穿透,以便在本地机器直接调试)

      • 在提交配置的时候,微信服务器会发送一个 GET 请求到该 URL 上,并会携带 signature、timestamp、nonce、echostr 这四个参数

        参数作用
        signature微信加密签名,signature 结合了开发者填写的
        token 参数和请求中的 timestamp 参数、nonce 参数
        timestamp时间戳
        nonce随机数
        echostr随机字符串
    • 令牌 (Token)

      • 可由我们自行定义,主要作用是参与生成签名,会与微信服务器请求的签名进行比较
    • 消息加解密密钥 (EncodingAESKey)

      • 可由我们自行定义或随机生成,主要作用是参与接收和推送给公众平台消息的加解密
    • 消息加解密方式

      • 共有三种模式:明文模式、兼容模式、安全模式,此处我选择的是安全模式,大家可以根据自己的具体需求,选择相应的模式

        在这里插入图片描述


二、验证 Token

  • WXPublicController.java

    @RestController
    @RequestMapping(value = "/wxpublic")
    public class WXPublicController {
    
        @GetMapping(value = "/verify_wx_token")
        public String verifyWXToken(HttpServletRequest request) throws AesException {
            String msgSignature = request.getParameter("signature");
            String msgTimestamp = request.getParameter("timestamp");
            String msgNonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            if (WXPublicUtils.verifyUrl(msgSignature, msgTimestamp, msgNonce)) {
                return echostr;
            }
            return null;
        }
    }
    
  • WXPublicUtils.java

        public class WXPublicUtils {
    
        /**
         * 验证Token
         * @param msgSignature 签名串,对应URL参数的signature
         * @param timeStamp 时间戳,对应URL参数的timestamp
         * @param nonce 随机串,对应URL参数的nonce
         *
         * @return 是否为安全签名
         * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
         */
        public static boolean verifyUrl(String msgSignature, String timeStamp, String nonce)
                throws AesException {
            // 这里的 WXPublicConstants.TOKEN 填写你自己设置的Token就可以了
            String signature = SHA1.getSHA1(WXPublicConstants.TOKEN, timeStamp, nonce);
            if (!signature.equals(msgSignature)) {
                throw new AesException(AesException.ValidateSignatureError);
            }
            return true;
        }
    }
    
  • SHA1.java

    public class SHA1 {
    
        /**
         * 用SHA1算法验证Token
         *
         * @param token     票据
         * @param timestamp 时间戳
         * @param nonce     随机字符串
         * @return 安全签名
         * @throws AesException
         */
        public static String getSHA1(String token, String timestamp, String nonce) throws AesException {
            try {
                String[] array = new String[] { token, timestamp, nonce };
                StringBuffer sb = new StringBuffer();
                // 字符串排序
                Arrays.sort(array);
                for (int i = 0; i < 3; i++) {
                    sb.append(array[i]);
                }
                String str = sb.toString();
                // SHA1签名生成
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                md.update(str.getBytes());
                byte[] digest = md.digest();
    
                StringBuffer hexstr = new StringBuffer();
                String shaHex = "";
                for (int i = 0; i < digest.length; i++) {
                    shaHex = Integer.toHexString(digest[i] & 0xFF);
                    if (shaHex.length() < 2) {
                        hexstr.append(0);
                    }
                    hexstr.append(shaHex);
                }
                return hexstr.toString();
            } catch (Exception e) {
                e.printStackTrace();
                throw new AesException(AesException.COMPUTE_SIGNATURE_ERROR);
            }
        }
    }
    
  • AesException.java

    public class AesException extends Exception {
    
    	public final static int VALIDATE_SIGNATURE_ERROR = -40001;
    	public final static int PARSE_XML_ERROR = -40002;
    	public final static int COMPUTE_SIGNATURE_ERROR = -40003;
    	public final static int ILLEGAL_AES_KEY = -40004;
    	public final static int VALIDATE_APPID_ERROR = -40005;
    	public final static int ENCRYPT_AES_ERROR = -40006;
    	public final static int DECRYPT_AES_ERROR = -40007;
    	public final static int ILLEGAL_BUFFER = -40008;
    	public final static int ENCODE_BASE64_ERROR = -40009;
    	public final static int DECODE_BASE64_ERROR = -40010;
    	public final static int GEN_RETURN_XML_ERROR = -40011;
    
    	private int code;
    
    	private static String getMessage(int code) {
    		switch (code) {
    		case VALIDATE_SIGNATURE_ERROR:
    			return "签名验证错误";
    		case PARSE_XML_ERROR:
    			return "xml解析失败";
    		case COMPUTE_SIGNATURE_ERROR:
    			return "sha加密生成签名失败";
    		case ILLEGAL_AES_KEY:
    			return "SymmetricKey非法";
    		case VALIDATE_APPID_ERROR:
    			return "appid校验失败";
    		case ENCRYPT_AES_ERROR:
    			return "aes加密失败";
    		case DECRYPT_AES_ERROR:
    			return "aes解密失败";
    		case ILLEGAL_BUFFER:
    			return "解密后得到的buffer非法";
    		case ENCODE_BASE64_ERROR:
    			return "base64加密错误";
    		case DECODE_BASE64_ERROR:
    			return "base64解密错误";
    		case GEN_RETURN_XML_ERROR:
    			return "xml生成失败";
    		default:
    			return null;
    		}
    	}
    
    	public int getCode() {
    		return code;
    	}
    
    	public AesException(int code) {
    		super(getMessage(code));
    		this.code = code;
    	}
    }
    

三、完成配置

  • 此时,我们提交配置,Token 就能验证通过了

    在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
根据引用\[1\]和引用\[2\]的描述,您在微信公众号开发中遇到了服务器配置token验证失败的问题。根据引用\[3\]中的代码,您使用了一个@GetMapping注解的方法来处理微信服务器发起的验证请求。在这个方法中,您通过调用iService.checkSignature方法来验证signature、timestamp、nonce和echostr参数的正确性。如果验证通过,就返回echostr的值。 根据您的描述,您的服务器接收到了数据并且验证通过,也成功地返回了echostr的值。然而,您仍然遇到了"token校验失败"的问题。 可能的原因是您在验证token时出现了一些问题。请确保您在验证token时使用了正确的token值,并且在验证过程中没有出现任何错误。您可以检查一下您的token值是否正确,并且确认您的验证逻辑是否正确。 另外,您还可以检查一下您的服务器配置是否正确。请确保您在微信公众平台上正确填写了服务器配置的相关信息,并且将token值与您的代码中的token值保持一致。 如果您仍然无法解决问题,建议您查看微信公众平台的文档或者寻求相关的开发支持,以获取更详细的帮助和指导。 #### 引用[.reference_title] - *1* *3* [微信公众服务器配置token验证失败原因](https://blog.csdn.net/qq_40985294/article/details/105257416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [微信公众平台服务器配置token验证失败](https://blog.csdn.net/gaozhilu88520/article/details/88552415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值