前言
微信公众号在用户配置好服务器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提供了大量能使我们快速便捷地处理数据的函数和方法。