微信公共号入门
微信公众号
概述:
是微信平台推出的一个面向企业和面向个人的一个服务平台
作用:
主要是推广,还有一些发布订阅的功能等…
分类:
第一次申请微信公众号时,需要选择一个微信公众号的分类
1.订阅号(未认证,已认证)
面向个人或者一些小型团体,主要作用就是用于推广
2.服务号(未认证,已认证)
企业面向大众的(需要营业执照等一些认证资料),主要作用是用于企业对外提供服务的,而不是推广
3.企业号
面向企业内部的,主要作用于企业内部管理,类似于OA,很少人使用
4.小程序
微信公众号内部的APP
界面分析
AppID和AppSecret
启动服务器配置(一旦开启,默认功能全部失效)
1.URL:
开发者自己服务器接口的地址,也就是我们的Controller的URL,由我们的代码来实现指定的功能
2.Token:
本身来说没有特殊要求和作用,随意编写即可
3.EncodingAESKey:
消息加密密钥由43位字符组成,随机生成即可(密钥)
4.消息加解密方式
明文模式:
不使用消息体加解密功能,安全系数较低
兼容模式:
明文、密文将共存,方便开发者调试和维护
安全模式:
消息包为纯密文,需要开发者加密和解密,安全系数高
开发程序接入微信公众号
开发者的服务器接入用户微信公众号的请求?
1.用户通过微信公众好(发送消息,点击菜单或者某个按钮)操作,发送请求,把消息发送到腾讯的服务器,然后腾讯的服务器通过开发者设置的URL,将消息转发给用户的URL中
2.用户在微信公众号中打开网页,在网页中的所有操作都是和开发者的服务器直接进行交互的
SpringBoot快速接入微信公众号
实现功能:用户定位
解决权限问题
使用开发者工具->公众平台测试账号
配置url,使用花生壳内网穿透
http://xuhengliang.imwork.net/wechat/helloWechat
能够访问,但是无法设置成功,因为暂时还没有返回值
阅读接入指南
第一步:填写服务器配置
第二步:验证消息的确来自微信服务器
1.参数描述:
signature :微信加密签名
结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp:时间戳
nonce 随机数
echostr 随机字符串,校验参数,直接返回即可URL设置成功
2.校验流程:
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
校验代码:
private static final String TOKEN = "mytoken";
@RequestMapping("/helloWechat")
public String helloWechat(String signature,String timestamp,String nonce,String echostr){
System.out.println(signature + " ===" + timestamp + " ===" +nonce + " ===" +echostr );
System.out.println("helloWechat");
//校验请求是否来自微信服务器
//1.将token、timestamp、nonce三个参数进行字典序排序
Set<String> set = new TreeSet<>();
set.add(TOKEN);
set.add(timestamp);
set.add(nonce);
//2.将三个字符串进行拼接
StringBuilder stringBuilder = new StringBuilder();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
stringBuilder.append(iterator.next());
}
//3.将拼接后的字符串进行SHA1签名
String sha1Str = SHA1.encode(stringBuilder.toString());
//4.将签名后的字符串和signature进行对比
if(sha1Str.equals(signature)){
return echostr;
}
return null;
}
Java实现SHA1
public final class SHA1 {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* Takes the raw bytes from the digest and formats them correct.
*
* @param bytes the raw bytes from the digest.
* @return the formatted bytes.
*/
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
public static String encode(String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
查看消息管理
普通消息管理
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
获得消息
接受微信公众号的POST请求的方法method = RequestMethod.POST
从请求体中获得微信消息内容,格式是XML格式@RequestBody
参数介绍:
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID-是单微信公众号安全设计
CreateTime 消息创建时间 (整型)
MsgType text 当前消息类型-text:文本消息
Content 文本消息内容
MsgId 消息id,64位整型
…不同的消息有相同的参数,也有个性化参数,详细见文档