微信公众号开发——入门
公众号的开发,每个公司都会存在,微信官方给出的API已经完全可以快速使用,但是,对于没有开发过的开发人员直接去看感觉还是无从下手,所以,写了这篇文章,帮助大家快速入门,快速开发,不过熟悉并使用所有的API还是参看官方文档。
用户注册登录地址:https://open.weixin.qq.com/cgi-bin/frame?t=home/mp_tmpl&lang=zh_CN
一、公众号分类
一般分为两类:订阅号,服务号;
订阅号:群发频率高,不过要显示在文件夹中。
服务号:群发频率低,一个月四次,直接显示在好友列表中,效果好。认证的服务号有更高的权限,微信支付需要认证的服务号,不过是收费的,300/年。
二、公众号模式
编辑模式和开发者模式。本文章主要针对开发人员,所有主要讲解开发模式。
三、开发者模式
1.开启方式:
左侧的菜单导航栏,开发—>基本配置 会看到如下页面。
介绍一下:
最上面的开发者ID一定要保存好,请求微信接口认证需要带上,相当于用户名,密码。
URL:就是我们服务器提供的接口,启动认证和用户发给公众号的消息以及开发者需要的事件推送,将被微信的服务器转到这个URL上面。启用时候的认证是get方法,其他都是post方法。
Token:自己定义的一个字符串,用于认证。
EncodingAESKey:AES对称加密秘钥。用户消息加密,可以不使用。
注意:开发者模式一旦启用,编辑模式的功能将会消失,所以谨慎使用,尤其是在开发,测试阶段。
我们在使用正式的公众号之前可以使用公众号的测试号。开发—>开发者工具 找到公众平台测试帐号,点击进入。和正式开发差不多。
2. 开发测试工具。
上面讲到的服务器URL,是微信服务器回调的我们自己的服务器,那我们如何在本地自测呢?那我们本地的服务器就需要有一个域名,QQ浏览器帮了我们一个大忙,下载微信浏览器,安装微信调试工具。http://blog.qqbrowser.cc/start/ 目的:生成外网域名。
3. Token验证(URL需要做的功能)
微信服务器会发送GET请求到预留的URL上面,携带四个参数:signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数),timestamp,nonce(随机数),echostr(随机字符串)。
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 |
验证代码如下:
1 @RequestMapping(value = "/w/core/checkSignature.do") 2 public void checkSignatureAndGetSentMessage(HttpServletRequest request, HttpServletResponse response, 3 @RequestParam String signature, @RequestParam String timestamp, 4 @RequestParam String nonce, @RequestParam String echostr) { 5 System.out.println("开始验证"); 6 String method = request.getMethod(); 7 if (WechatContants.HTTP_METHOD_GET.equalsIgnoreCase(method)) {// 如果是get方法,则验证 8 if (wechatCoreLogic.checkSignature(signature, timestamp, nonce)) { 9 HttpResponstUtils.writeResponse(response, echostr);//将echostr返回 10 } 11 } else if (WechatContants.HTTP_METHOD_POST.equalsIgnoreCase(method)) {// 如果是post方法则是收发消息。 12 //TODO 13 } 14 }
1 public class WechatCoreLogic { 2 /** 3 * 验证签名 4 * @param signature 5 * @param timestamp 6 * @param nonce 7 * @return 8 */ 9 public boolean checkSignature(String signature, String timestamp, String nonce) { 10 String[] arr = new String[] { WechatContants.WECHAT_TOKEN, timestamp, nonce }; 11 Arrays.sort(arr); 12 String mySignature = SHA1Engine.encrypt(StringUtils.buildString(arr)); 13 if (mySignature.equals(signature)) { 14 return true; 15 } 16 return false; 17 } 18 }