微信公众号开发前期准备工作
随着移动互联网越来越普及,众多企业都注册了微信公众号,于是微信公众号的开发也越来越多,为了不被世界所淘汰,特地学习下微信公众号的开发,已备不时之需!
按照惯例,学习一门新技术或者新框架,咱们还是从官方提供的文档开始,于是找到微信公众平台开发者文档(http://mp.weixin.qq.com/wiki/home/index.html)
1、微信公众平台接口测试号申请
按照文档指引,咱们得先申请一个微信公众平台接口测试账号(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login),使用自己个人的微信扫一扫授权即可申请成功,申请成功后发现微信会为我们自动分配一个微信号、appID和appsecret(如下图所示)。
2、本地服务器地址外网映射
开发基于微信公众号的应用最大的痛苦之处就是调试问题,每次实现一个功能后都需要部署到一个公网服务器进行测试,因为微信用户每次向公众号发起请求时,微信服务器会先接收到用户的请求,然后再转发到我们的服务器上,也就是说,微信服务器是要和我们的服务器进行网络交互,所以我们必须保证我们的服务器外网可以访问到,这种部署到公网服务器进行测试的做法对于我们开发者来说简直是噩梦。所以我们要想一个办法可以做到本地部署,本地调试代码,而要做到这一点,那么我们要解决的问题就是将内网的部署服务器映射到外网,让微信服务器可以正常访问到,幸运的是,借助于第三方软件Ngrok,我们就可以做得到。Ngrok是一个免费的软件Ngrok,使用Ngrok后,我们就可以实现内网穿透,也就是说我们可以将内网的服务器映射到外网给别人访问,这对于我们在本地开发环境中调试微信代码是以及给用户演示一些东西非常快速和有帮助的,因为可以直接使用我们自己的内网的电脑作为服务器。
国内提供Ngrok服务比较好的网站是:http://natapp.cn/,下载到本地解压后运行natapp.exe文件即可。当然,由于使用的是免费版,这里默认映射地址为:127.0.0.1:80,外网地址则随机生成,如果选择付费可以自定义二级域名,下面是我映射的情况:
3、接入微信公众平台开发
按照文档指引,接下来可以进行微信公众平台开发接入了,接入步骤如下:
第一步:填写服务器配置,也就是URL和Token,URL就是服务器接口地址,Token自定义
第二步:验证服务器地址的有效性,当点击“提交”按钮后,微信服务器将发送一个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,点击“提交”按钮后即可配置成功:
4、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:除了代码之外,咱还可以聊点别的,有兴趣可以关注我的个人微信公众号!