一、微信公众号平台
微信公众平台,即我们平时所说的“公众号”,曾用名“官方平台”、“媒体平台”,但最终命名为“公众平台”。从微信的命名我可以发现,公众平台不只是官方、媒体使用的平台,而是对所有公众都开放的统一平台。
微信公众平台地址:https://mp.weixin.qq.com/
微信公众平台公分4大板块:订阅号、服务号、小程序、企业号。本次学习主要针对订阅号。
二、开发账号准备
- 账号注册
进入微信公众平台https://mp.weixin.qq.com ,点击右上角立即注册,选择“服务号”或“订阅号”注册(服务号仅限机构用户注册,个人用户只能选择订阅号)
注册账号自行准备
- 测试账号申请
3、登陆微信号
三、开发环境准备
外网映射工具
微信公众平台在访问后台时,必须提供能够正确访问的外网地址,微信平台对后台URL的要求有两点:
① 必须能够用公网访问 ② 必须使用80端口
要实现以上两点,我们可以选择购买外网服务器,例如:阿里云、百度云、腾讯云…都是不错的选择。如果没有服务器,可以选择用外网映射工具,将 我们的内网链接映射为公网,比较不错的映射软件有:花生壳、ngrok、nat123、natapp等…
个人推荐使用natapp
使用教程可以参靠这篇文章https://blog.csdn.net/ejinxian/article/details/76061059
四、微信公众平台数据交互原理
五、开发模式接入
参照官方提供的开发文档接入指南:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
- 填写服务器基本配置
进入微信公众平台,点击左侧【开发——基本配置】,选择【服务器配置】。即可进入配置页面:
URL:即我们后台服务器公网访问地址
Token:开发者自定的验证口令
EncodingAESKey:随机字符串,如果消息加解密方式采用安全模式才需验证
测试服务器可以参照下图:
进入微信公众平台,点击左侧【开发——开发者工具】,选择【公众平台测试账号】,接口配置信息。即可进入配置页面:
配置好之后先不要提交,此时提交会提示配置错误!
2、验证消息的确来自微信服务器
六、开发接入后台代码
项目结构:
WeiXinServlet类:
public class WeiXinServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)) {
//如果校验成功原路返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败
out.print(echostr);
}
}
}
CheckUtil工具类:
private static final String token = "fei100";
public static boolean checkSignature(String signature,String timestamp,String nonce) {
//1、将token、timestamp、nonce三个参数进行字典序排序
String[] arr = new String[]{token,timestamp,nonce};
Arrays.sort(arr);
//2、将三个参数字符串拼接成一个字符串
StringBuffer sb = new StringBuffer();
for (String string : arr) {
sb.append(string);
}
//3、将字符串进行sha1加密
String temp = getSha1(sb.toString());
//4、开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return temp.equals(signature);
}
/**
* sha1加密
* @Title: getSha1
* @Description: TODO
* @param: @param str
* @param: @return
* @return: String
* @throws
*/
public static String getSha1(String str){
if (str==null || str.length() == 0) {
return null;
}
char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try {
MessageDigest mdTemp =MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j =md.length;
char buf[]=new char[j*2];
int k=0;
for(int i=0;i<j;i++){
byte byte0=md[i];
buf[k++]=hexDigits[byte0>>>4&0xf];
buf[k++]=hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
}
Web.xml:
启动tomcat,将Servlet的本地地址进行公网映射,参照上述第三大部分,进行公网映射,确定公网地址可以访问。
七、配置公众号平台
配置好URL和Token之后,点击提交,微信将发送GET请求指令到Servlet,调用doGet方法,验证此次GET请求是否来自微信服务器。
如果提交成功,则接入生效,成为开发者成功,否则接入失败。(dos命令也可以看到已经接入成功)