微信公众号开发——入门

  公众号的开发,每个公司都会存在,微信官方给出的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 }

 

 

 

 

 

 

 

 

 

 

 

    

posted @ 2016-05-30 16:11  张宗星  阅读(492)  评论(0编辑  收藏  举报