微信公众号开发之微信服务器:消息来源确认


前言

微信公众号在用户配置好服务器URL后会发送GET请求调用该地址,用户需要根据传递的参数完成服务器认证,确认请求来自微信后台,本文将讲解如何完成服务认证。


一、接口服务器URL配置

微信公众号接口服务器URL配置参照上篇博文:微信公众号开发之接口信息配置(一):natapp域名生成

二、消息来源确认

服务器回调确认接口会传递4个参数:signature、timestamp、nonce、echostr,获取这4个参数

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

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

常量定义代码(示例):

/**
 * 常量值定义
 *
 * @author tang
 */
public final class Constants {
    public final static String WX_KEY_APPID = "appID";
    public final static String WX_KEY_APPSECRET = "appsecret";
    public final static String WX_KEY_SIGNATURE = "signature";
    public final static String WX_KEY_TIMESTAMP = "timestamp";
    public final static String WX_KEY_NONCE = "nonce";
    public final static String WX_KEY_ECHOSTR = "echostr";
}

controller层代码(示例):

@Api(tags = {"微信认证接口"})
@RestController
@RequestMapping("/wx")
public class WxController extends BaseController {

    @Autowired
    private WxReqApi wxReqApi;

    @ApiOperation(value = "客户端认证", notes = "客户端认证")
    @GetMapping("/echo")
    public String echo(HttpServletRequest req, HttpServletResponse resp) {
        // 1.获取微信传入的4个参数
        String signature = req.getParameter(Constants.WX_KEY_SIGNATURE);
        String timestamp = req.getParameter(Constants.WX_KEY_TIMESTAMP);
        String nonce = req.getParameter(Constants.WX_KEY_NONCE);
        String echostr = req.getParameter(Constants.WX_KEY_ECHOSTR);
        // 2.用timestamp, nonce, signature进行校验
        boolean result = wxAuthService.check(timestamp, nonce, signature);
        if (result) {
            // 3.校验成功返回echostr
            return echostr;
        }
        return "error!";
    }
}

服务层代码如下(示例):

@Service
public class WxAuthService extends BaseService{

    @Autowired
    private WxAuthConfig wxAuthConfig;

    public boolean check(String timestamp, String nonce, String signature) {
        // 1.按字典序对TOKEN, timestamp和nonce排序
        String[] arr = new String[]{wxAuthConfig.getToken(), timestamp, nonce};
        Arrays.sort(arr);
        // 2.将3个参数拼成一个字符串进行sha1加密
        String str = arr[0] + arr[1] + arr[2];
        // 3.用commons-codec包中的工具类进行sha1加密
        str = DigestUtils.sha1Hex(str);
        // 4.将加密后的字符串和signature比较
        System.out.println(signature);
        return str.equalsIgnoreCase(signature);
    }
}

配置类代码如下(示例):

@Data
@Configuration
@ConfigurationProperties(prefix = "wx.auth")
public class WxAuthConfig {
    private String token;
    private String appId;
    private String appSecret;
}

application.yml如下(示例):

wx:
  req-url:
    base-url: https://api.weixin.qq.com
  auth:
    token: 123456
    app-id: wxc1562a18c3fbc911
    app-secret: 98806a02589706b2da875a5b6c41425b

欢迎观看文章内容,扫下面二维码关注小编订阅号获得更多使用技能:
在这里插入图片描述

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxiaohe1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值