微信测试号开发之一 接入微信公众号

原文链接:https://blog.csdn.net/qq_37936542/article/details/78337701

一:微信公众号的类型有哪些?

普通服务号、认证服务号、普通订阅号、认证订阅号,其之间主要区别在于权限不同。


二:准备服务器

微信开发时项目路径必须在公网上可以访问,且必须是80端口,因此需要准备服务器或者是外网映射工具。

推荐一下方式

(一)云主机

(二)BAE(百度云开发)、SAE(新浪云)

(三)免费的外网映射工具 ngrok、natapp


ngrok操作步骤参考我的博客  外网映射工具之ngrok



三:准备微信测试号

微信测试号的权限比没有认证的普通号权限要大一点,如果仅仅是测试的话,推荐使用测试号。

网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login



四:新建web项目,完成微信认证

使用ngrok将127.0.0.1:80映射成外网地址,用外网地址访问自己的web项目是否可以成功访问。


微信服务器第一次会发送GET请求到指定的URL,其中有四个参数

signature:微信加密签名,结合了开发者填写的token参数和请求中的timestamp、nonce参数加密生成。

timestamp:时间戳

nonce:随机数

echostr:随机字符串


signature加密流程:

1.将token、timestamp和nonce进行字典排序

2.将三个参数拼接成一个参数进行sha1加密

3.将加密后的字符串和signature进行对比


后台通过对signature验证来检验消息是否来自微信,确认则原样返回echostr,接入成功,否则接入失败。


封装加密工具类:

  1. import java.security.MessageDigest;  
  2. import java.security.NoSuchAlgorithmException;  
  3. import java.util.Arrays;  
  4.   
  5.   
  6. public class StringUtils {  
  7.   
  8.   
  9. // 与微信公众号配置的一致  
  10. private static String token = "intmote2017";  
  11.   
  12.   
  13. /** 
  14. * 方法名:验证签名 
  15.  
  16. * @param signature 
  17. * @param timestamp 
  18. * @param nonce 
  19. * @return 
  20. * @throws 
  21. */  
  22. public static boolean checkSignature(String signature, String timestamp,  
  23. String nonce) {  
  24. // 1.将token、timestamp、nonce三个参数进行字典序排序  
  25. String[] arr = new String[] { token, timestamp, nonce };  
  26. Arrays.sort(arr);  
  27.   
  28.   
  29. // 2. 将三个参数字符串拼接成一个字符串进行sha1加密  
  30. StringBuilder content = new StringBuilder();  
  31. for (int i = 0; i < arr.length; i++) {  
  32. content.append(arr[i]);  
  33. }  
  34. MessageDigest md = null;  
  35. String tmpStr = null;  
  36. try {  
  37. md = MessageDigest.getInstance("SHA-1");  
  38. // 将三个参数字符串拼接成一个字符串进行sha1加密  
  39. byte[] digest = md.digest(content.toString().getBytes());  
  40. tmpStr = byteToStr(digest);  
  41. catch (NoSuchAlgorithmException e) {  
  42. e.printStackTrace();  
  43. }  
  44.   
  45.   
  46. content = null;  
  47. // 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
  48. return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
  49. }  
  50.   
  51.   
  52. /** 
  53. * 方法名:将字节数组转换为十六进制字符串 
  54.  
  55. * @param byteArray 
  56. * @return 
  57. * @throws 
  58. */  
  59. private static String byteToStr(byte[] byteArray) {  
  60. String strDigest = "";  
  61. for (int i = 0; i < byteArray.length; i++) {  
  62. strDigest += byteToHexStr(byteArray[i]);  
  63. }  
  64. return strDigest;  
  65. }  
  66.   
  67.   
  68. /** 
  69. * 方法名: 将字节转换为十六进制字符串 
  70.  
  71. * @param mByte 
  72. * @return 
  73. * @throws 
  74. */  
  75. private static String byteToHexStr(byte mByte) {  
  76. char[] Digit = { '0''1''2''3''4''5''6''7''8''9''A',  
  77. 'B''C''D''E''F' };  
  78. char[] tempArr = new char[2];  
  79. tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
  80. tempArr[1] = Digit[mByte & 0X0F];  
  81. String s = new String(tempArr);  
  82. return s;  
  83. }  
  84.   
  85.   
  86. }  


编写CoreController来接收微信请求


  1. @Controller  
  2. public class CoreController {  
  3.   
  4. @RequestMapping(value="handle",method=RequestMethod.GET)  
  5. public void linkHandle(HttpServletRequest request,HttpServletResponse response) throws IOException{  
  6. // 微信加密签名  
  7.         String signature = request.getParameter("signature");  
  8.         // 时间戳  
  9.         String timestamp = request.getParameter("timestamp");  
  10.         // 随机数  
  11.         String nonce = request.getParameter("nonce");  
  12.         // 随机字符串  
  13.         String echostr = request.getParameter("echostr");  
  14.           
  15.         //获取输出流  
  16.         PrintWriter out = response.getWriter();  
  17.           
  18.         //如果验证消息是来自微信,返回echostr  
  19.         boolean check = StringUtils.checkSignature(signature, timestamp, nonce);  
  20.         if(check){  
  21.         out.print(echostr);;  
  22.         }  
  23.   
  24.         out.close();  
  25.         out = null;  
  26. }  
  27.   
  28. /** 
  29. * 消息的处理和响应 
  30. * @param request 
  31. * @param response 
  32. * @throws Exception  
  33. */  
  34. @RequestMapping(value="handle",method=RequestMethod.POST)  
  35. public void messageHandle(HttpServletRequest request,HttpServletResponse response) throws Exception{  
  36.     //将请求、响应的编码设置为utf-8  
  37. request.setCharacterEncoding("UTF-8");  
  38. response.setCharacterEncoding("UTF-8");  
  39.   
  40. //调用核心业务逻辑  
  41. //String respXml = CoreService.processRequest(request);  
  42.   
  43. }  
  44. }  


五:修改接口配置信息


将映射后的handle方法访问路径配置到URL中,token要和StringUtils中的token保持一致。

点击提交,不出意外,提示配置成功


注意:如果直接在浏览器上访问配置的路径会直接报500的错误,因为没有参数!!!




六:微信的业务逻辑,比如回复消息和自定义菜单等,都在post请求,因此在handler的post方法中完成

文末福利:

福利一:前端,Java,产品经理,微信小程序,Python等10G资源合集大放送:jianshu.com/p/e8197d4d9

福利二:微信小程序入门与实战全套详细视频教程。


【领取方法】

关注 【编程微刊】微信公众号:

回复【小程序demo】一键领取130个微信小程序源码demo资源。

回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集10G资源大放送。





原文作者:祈澈姑娘
原文链接:jianshu.com/u/05f416aef
创作不易,转载请告知

90后前端妹子,爱编程,爱运营,爱折腾。
坚持总结工作中遇到的技术问题,坚持记录工作中所所思所见,欢迎大家一起探讨交流。



posted @ 2018-03-29 16:47  前端视听  阅读(213)  评论(0编辑  收藏  举报