一、微信公众号介绍
微信公众号是开发者或商家在微信公众平台上申请的应用账号。该帐号与 QQ 账号互通,平台上实现和特定群体的文字、图片、语音、视频的全方位沟通、互动 ,形成了一种主流的线上线下微信互动营销方式。
微信公众号是用户在微信公众平台注册的一个账号。账号开通后,可在微信公众号里发视频、图片、文字等推销你的商品或分享生活经验等。
微信公众号类似于一个网站。可作为公司名片、个人名片,可做成商城、互动社区等。管理员可通过微信公众平台发送文章,关注了微信公众号的用户可查看到管理员发送的文章。
二、微信公众号分类
可访问下面的网址查看微信公众号的分类。
【微信公众平台:https://mp.weixin.qq.com/】
微信公众可分为以下4种(本人的文章中主要讲解服务号和订阅号):
- 服务号:给企业和组织提供更强大的业务服务与用户管理能力;帮助企业快速实现全新的公众号服务平台。
- 订阅号:为媒体和个人提供一种新的信息传播方式,构建与读者之间更好的沟通与管理模式。
- 小程序:一种新的开放能力。可在微信内被便捷地获取和传播,同时具有出色的使用体验。
- 企业微信(认证):企业的专业办公管理工具。与微信一致的沟通体验,提供丰富免费的办公应用,并与微信消息、小程序、微信支付等互通,助力企业高效办公和管理。
(1) 公众号类型功能介绍
公众号相关问题:https://kf.qq.com/faq/170815aUZjeQ170815mU7bI7.html
(2) 服务号订阅号功能区别
【订日1服月4】订阅号每日可群发1条,服务号每月可群发4条消息
三、测试号和接入指南
微信公众号开发文档https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
(1) 测试号申请
由于用户体验和安全性方面的考虑,某些高级接口的权限需要微信认证后才可获取,微信认证又是需要组织和企业才可进行的操作。
为帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,微信团队推出了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。
(2) 接入指南
接入微信公众平台开发,开发者需要按照如下步骤完成:
a. 填写服务器配置
登录微信公众平台官网,并进入下图页面。填写 URL、Token、和 EncodingAESKey。
- URL:开发者用来接收微信消息和事件的接口
- Token:可由开发者任意填写,用于生成签名(Token 会和接口 URL 中包含的 Token 进行对比,从而验证安全性)
- EncodingAESKey:由开发者手动填写或随机生成,将用作消息体加密或解密秘钥
(上图是生产环境填写 URL、Token 和 EncodingAESKey 的地方,测试号是在【测试管理】进行填写)
b. 验证服务器地址的有效性
① 介绍
开发者提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上。GET 请求会携带如下参数:
参数 | 描述 |
---|---|
signature | 微信加密签名(是结合开发者填写的 token、timestamp 和 nonce 生成的) |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
② Java 代码(接收微信服务器发送的 GET 中的参数)
@RestController
@RequestMapping("/wechats")
public class WechatController {
@GetMapping("/checkValid")
public String checkValid(String signature, String timestamp,
String nonce, String echostr) {
System.out.println("signature = " + signature);
System.out.println("timestamp = " + timestamp);
System.out.println("nonce = " + nonce);
System.out.println("echostr = " + echostr);
return "WechatController - checkValid";
}
}
填写的 URL 地址所在的项目必须被部署到云服务器上或者使用内网穿透,否则是无法成功的。
③ Java 代码(校验请求确实来自微信服务器)
开发者通过检查 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数的内容。返回 echostr 参数的内容则表示接入生效(成为开发者成功),否则接入失败。
加密/校验流程:
- 将 token、timestamp、nonce 三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行 sha1 加密(使用他人的代码进行 sha1 加密)
- 把 sha1 加密后的字符串与 signature 比较,标识该请求是否来源于微信服务器
@RestController
@RequestMapping("/wechats")
public class WechatController {
@Autowired
private WechatService service;
@GetMapping("/checkValid")
public String checkValid(String signature, String timestamp,
String nonce, String echostr) {
return service.checkSignature(timestamp, nonce, signature) ? echostr
: "校验失败";
}
}
@Service
public class WechatServiceImpl implements WechatService {
private static final String TOKEN = "sui bian xie dou ke yi";
/**
* 校验 signature(签名) 的正确性
* a. 将 token、timestamp、nonce 三个参数进行字典序排序
* b. 将三个参数字符串拼接为一个字符串后进行 sha1 加密
* c. 把 sha1 加密后的字符串与 signature 的值进行比较
* d. 若相同, 返回 true; 若不相同, 返回 false
*/
@Override
public boolean checkSignature(String timestamp, String nonce, String signature) {
String[] params = {TOKEN, timestamp, nonce};
Arrays.sort(params);
// b. 将三个参数字符串拼接为一个字符串后进行 sha1 加密
StringBuilder joinParam = new StringBuilder();
for (String param : params) {
joinParam.append(param);
}
String secretParam = DigestUtils.sha1Hex(joinParam.toString());
return secretParam.equals(signature);
}
}
<!-- 把字符串进行 sha1 加密 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
c. 依据接口文档实现业务逻辑
验证 URL 有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单时,开发者填写的服务器配置 URL 将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。
用户向公众号发送消息时,公众号方收到的消息发送者是一个 OpenID(是使用用户微信号加密后的结果),每个用户对每个公众号有一个唯一的 OpenID。