随着移动互联网愈来愈普及,众多企业都注册了微信公众号,因而微信公众号的开发也愈来愈多,为了避免被世界所淘汰,特意学习下微信公众号的开发,已备不时之需!html
按照惯例,学习一门新技术或者新框架,我们仍是从官方提供的文档开始,因而找到微信公众平台开发者文档(http://mp.weixin.qq.com/wiki/home/index.html)redis
一、微信公众平台接口测试号申请json
按照文档指引,我们得先申请一个微信公众平台接口测试帐号(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login),使用本身我的的微信扫一扫受权便可申请成功,申请成功后发现微信会为咱们自动分配一个微信号、appID和appsecret(以下图所示)。api
二、本地服务器地址外网映射数组
开发基于微信公众号的应用最大的痛苦之处就是调试问题,每次实现一个功能后都须要部署到一个公网服务器进行测试,由于微信用户每次向公众号发起请求时,微信服务器会先接收到用户的请求,而后再转发到咱们的服务器上,也就是说,微信服务器是要和咱们的服务器进行网络交互,因此咱们必须保证咱们的服务器外网能够访问到,这种部署到公网服务器进行测试的作法对于咱们开发者来讲简直是噩梦。因此咱们要想一个办法能够作到本地部署,本地调试代码,而要作到这一点,那么咱们要解决的问题就是将内网的部署服务器映射到外网,让微信服务器能够正常访问到,幸运的是,借助于第三方软件Ngrok,咱们就能够作获得。Ngrok是一个免费的软件Ngrok,使用Ngrok后,咱们就能够实现内网穿透,也就是说咱们能够将内网的服务器映射到外网给别人访问,这对于咱们在本地开发环境中调试微信代码是以及给用户演示一些东西很是快速和有帮助的,由于能够直接使用咱们本身的内网的电脑做为服务器。缓存
国内提供Ngrok服务比较好的网站是:http://natapp.cn/,下载到本地解压后运行natapp.exe文件便可。固然,因为使用的是免费版,这里默认映射地址为:127.0.0.1:80,外网地址则随机生成,若是选择付费能够自定义二级域名,下面是我映射的状况:服务器
三、接入微信公众平台开发微信
按照文档指引,接下来能够进行微信公众平台开发接入了,接入步骤以下:网络
第一步:填写服务器配置,也就是URL和Token,URL就是服务器接口地址,Token自定义app
第二步:验证服务器地址的有效性,当点击“提交”按钮后,微信服务器将发送一个http的get请求到刚刚填写的服务器地址,而且携带四个参数及加密/校验流程:
第三步:依据接口文档实现业务逻辑,以下所示:
@RequestMapping("/token") public void token(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws IOException{ //微信加密签名signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 String signature = request.getParameter("signature"); //时间戳 String timestamp = request.getParameter("timestamp"); //随机数 String nonce = request.getParameter("nonce"); //随机字符串 String echostr = request.getParameter("echostr"); //排序 String sortString = WechatUtil.sort(TOKEN, timestamp, nonce); //加密 String mySignature = WechatUtil.sha1(sortString); //校验签名 if (mySignature != null && mySignature != "" && mySignature.equals(signature)) { System.out.println("success"); //若是检验成功输出echostr,微信服务器接收到此输出,才会确认检验完成。 response.getWriter().write(echostr); } else { System.out.println("fail"); } } /** * 排序 * @param token * @param timestamp * @param nonce * @return */ public static String sort(String token, String timestamp, String nonce) { String[] strArray = {token, timestamp, nonce}; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } return sb.toString(); } /** * sha1加密 * @param str * @return */ public static String sha1(String str) { try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字节数组转换为 十六进制 数 for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
按要求填写URL和Token,点击“提交”按钮后便可配置成功:
四、access_token管理
关于access_token的获取方式,在微信公众平台开发者文档上有说明,公众号能够调用一个叫"获取access token"的接口来获取access_token。
获取access token接口调用请求说明
http请求方式: GET
请求的URL地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
因为access_token天天最多请求2000次,每次超时时间为7200秒,所以必须采起每种策略来获取access_token,方法有不少种,这里我采起的是借助redis服务器来缓存access_token的方式(利用redis缓存服务器缓存数据时能够设置超时时间的特性),具体代码以下:
public String obtain() { String accessToken = ""; String url = MessageFormat.format(baseUrl, appId, appSecret); String responseStr = HttpClientUtil.get(url); Jedis jedis = redisService.borrow(); try { if(jedis.exists(WechatConst.WECHAT_ACCESS_TOKEN)){ accessToken = jedis.get(WechatConst.WECHAT_ACCESS_TOKEN); }else{ AccessTokenResponseDTO dto = JsonUtil.json2Bean(responseStr, AccessTokenResponseDTO.class); accessToken = dto.getAccess_token(); jedis.setex(WechatConst.WECHAT_ACCESS_TOKEN, 7000, accessToken); } } catch (Exception e) { log.debug("[wechat]accessToken response parse error[response="+responseStr+"]"); e.printStackTrace(); } finally{ redisService.returnResource(jedis); } return accessToken; }
至此,关于微信公众号开发的基础工做已基本完成,万丈高楼平地起,接下来能够进行具体的开发了。
----------------------------------------------------------------------------------------------------------------------------
ps:除了代码以外,咱还能够聊点别的,有兴趣能够关注个人我的微信公众号!