这篇是微信公众号开发小记的第二篇,承接上一篇,此次将完成如下主要功能

  1. 对接微信服务器和自己的服务器

需要的“材料”

到这里需要梳理一下都需要什么东西,以便在整个编码的过程中方便我们自己,首先就是需要有自己的服务器,然后还需要一个公众号!

  1. 服务器
  2. 公众号

对于服务器我是买的腾讯云服务器,而对于公众号,因为个人公众号的接口权限很少,所以这里一般建议申请一个测试号,基本上支持所有的接口权限了!

申请测试号

这里是申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

关于接口配置这块之前已经说过了,现在要着重说一下这个appID 和appsecret ,这两个东西很重要,因为通过他们我们能得到很重要的一个数值就access_token,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token ,这个appID 和appsecret 可以说是你公众号的唯一凭证了,一定要保管好了,接下来就根据开发技术文档来获取access_token 。

获取access_token

在实际的开发当中要经常使用到access_token ,官方技术文档中已经说了,公众号调用接口都需要使用到access_token ,下面就开始获取access_token

从官方技术文档中得知获取access_token 需要调用这个接口

https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
复制代码

然后看这个API,是一个get请求,其中包含这些参数

grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

可以看到这里就需要使用公众号的appID 和appsecret,那么这个接口正确调用会返回什么数据呢?

正常情况下会返回下述JSON数据包给公众号

{"access_token":"ACCESS_TOKEN","expires_in":7200}
复制代码

那么这里又包含如下参数

access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

其实这些信息在官方技术文档上给的都很详细,下面咱就实际的去调用一下这个请求,看看返回的数据吧

使用Postman进行调试

Postman真的是个好东西,还没有使用的赶紧入手吧,以下使用Postman这个工具简单演示一下发起get请求获取access_token 。

然后点击旁边的Params就会现实这个API中需要填写的参数

然后把响应的参数填写即可,这里的grant_type 就写默认的即可,剩下的appid和secret就填写你公众号的appID 和appsecret。

这个时候你就会发现,一个完整的get请求就拼接好了,接下来点击send即可,然后就会看到返回的数据

这样就得到我们需要的access_token 。

以上是通过Postman这个工具做测试用的,那么在程序中又该任何编码得到我们想要的access_token 呢?

URL该填什么

回到第一篇遗留的一个问题就是这个URL到底该填写什么?我们知道,微信服务器会往我们填写的这个URL上面发送一个get请求,通过这个get请求能够得到微信服务器发送过来的一些消息,然后对消息做响应的处理来与微信服务器对接。

很显然,这个URL需要填写一个servlet,微信服务区器将消息发送过来之后需要对这个请求做处理,所以这里选择使用servlet对请求做处理。

这一点需要仔细认真阅读官方文档中的接入指南,这里就需要验证消息的确来自微信服务器,从而完成对接,关于如何验证,文档中给了一个PHP的例子,那么Java中该如何验证呢?

进入编码

铺垫了那么多,是时候写代码了,不多说废话,首先创建一个maven项目,然后创建一个CoreServlet用来接收微信服务器发送过来的请求,像这样

/*** @author ithuangqing* 接收微信服务器发送过来的请求*/
public class CoreServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}
}
复制代码

创建完成servlet之后就需要将这个servlet进行注册了,这个是在web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><servlet><servlet-name>coreServlet</servlet-name><servlet-class>com.ithuanqging.wechat.CoreServlet</servlet-class></servlet><!-- url-pattern中配置的/coreServlet用于指定该Servlet的访问路径 --><servlet-mapping><servlet-name>coreServlet</servlet-name><url-pattern>/coreservlet</url-pattern></servlet-mapping>
</web-app>
复制代码

也就是说,微信服务器发送过来的消息需要由这个servlet去处理,首先要完成的就是验证消息的确来自微信服务器,那么你需要知道,微信服务器发送过来的请求都包含哪些信息,去哪看?当然是官方技术文档了

文档中说的真的很清楚了,包括如何验证等表述的都很清楚,下面我们直接编码

  @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 微信加密签名String signature = req.getParameter("signature");// 时间戳String timestamp = req.getParameter("timestamp");// 随机数String nonce = req.getParameter("nonce");// 随机字符串String echostr = req.getParameter("echostr");PrintWriter out = resp.getWriter();// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (SignUtil.checkSignature(signature, timestamp, nonce)) {out.print(echostr);}out.close();out = null;}
复制代码

以上是从request请求中拿到传过来的参数,接下来就是需要创建一个工具类按照文档中说的方法去进行验证了,这里我已经写好了这个工具类SignUtil

public class SignUtil {// 与接口配置信息中的Token要一致private static String token = "mytoken";/*** 验证签名*/public static boolean checkSignature(String signature, String timestamp,String nonce) {// 1.将token、timestamp、nonce三个参数进行字典序排序String[] arr = new String[] { token, timestamp, nonce };Arrays.sort(arr);// 2. 将三个参数字符串拼接成一个字符串进行sha1加密StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}content = null;// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 将字节数组转换为十六进制字符串*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}}
复制代码

以上这个工具类你可以直接拿来使用。

现在代码是写好了,然后呢》该怎么做,怎么去验证啊,微信服务器发的请求在哪?

这个时候就要回到我们的测试公众号后台了,去填写我们的配置,也就是接口配置信息,但是现在你写的程序还在本地,微信即使发送请求也发不到你这啊,所以这个时候需要将的项目打包传到你的服务器上

首先将你的项目通过maven打包成war

打包成功之后你在你的项目根目录中的

target目录中就能看到打成的war包,接下来将这个war包上传到你的服务器上,我这里使用的是FileZilla这个工具

在本地站点中找到刚才生成的war包,远程站点必须是tomcat下的webapps目录下。

PS:这里关于服务器配置的知识涉及到在服务器中安装JDK和tomcat!

然后点击war包,鼠标右击选择上传

此时已经上传成功,这个war包会被自动解压,不用担心,现在你写的程序已经上传到服务器上了,现在只要告诉微信服务器你的这个项目中的CoreServlet的正确路径,就能接收微信服务器发动的消息了,现在回到测试公众号的后台。

也就是说现在通过访问到这个路径就能访问的你写的CoreServlet了----http://139.199.98.152/wechattest/coreservlet

对了还有这个Token必须和你在写验证签名的工具类中设置的是一样的,也就是这个

我这里叫做mytoken,你可以随便叫什么都行,只要保持两边一致即可。接下来你点击提交就会发现这个

PS:现在是六点钟,其实在四点之前我就写完了上面的文章,可是一直折腾到现在,为什么?因为LZ点击提交的时候一直给我报“token验证失败”,这我就不明白了,之前都是测试测试好的,这怎么又不行了,于是想各种原因,测试各种方法,尝试各种技巧,改代码,debug。。。最终,我发现,我写的没错,嗯,真没错!这就有点让我无奈了,该怎么办,今天发不成文章了。。。纠结。。无奈,休息一会,打了把游戏,再测试,好吧,绿油油的配置成功出现了,特么滴,谁能告诉我这是肿么回事,我的两个多小时啊!

未完待续

微信公众号开发小记(二)--服务器验证相关推荐

  1. 微信公众号开发--开通测试号及验证消息来自服务器

    微信公众号开发--开通测试号及验证消息来自服务器 一.服务器配置 1.开通测试号 2.域名申请(ngrok) 2.1.注册 2.2.下载客户端 二.验证消息来自服务器 一.服务器配置 1.开通测试号 ...

  2. 微信公众号开发小记——4.两种邀请用户的方式 扫码链接

    描述 假设的我们的服务号有这么一些功能,比如底部有按钮,点击会有一些复杂的功能,这时候可能就需要一个用户系统,有用户系统就经常想要做什么分享邀请新用户之类的,这时候就又有几种方式,1.直接一个连接,让 ...

  3. 微信公众号开发(二)基础接口

    微信公众号开发(二)基础接口 未经认证的订阅号只有基础接口的权限,基础接口主要包括三个部分:接收用户消息.发送被动响应消息和接收事件推送消息,开发者需要对用户消息在5秒内立即做出回应,微信服务器在五秒 ...

  4. 微信公众号开发(—)接口与服务器关联

    微信公众号开发(-) 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解. 1.一台有微信的手机.(别问我老人机可以不 有微信就可以!!!) 2.需要有一个微信公众平台的测试号(订阅号,服务号也可 ...

  5. 使用Python进行微信公众号开发(二)接收消息

    写在前面 <使用Python进行微信公众号开发>系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器. 效果体验 扫码"是雯子吖"公众号进行体验 配置 ...

  6. 微信公众号开发——服务器配置及token验证

    [前言]:因为自己第一次配置开发者模式是2015年底,当时是SAE的应用,现在申请了一个阿里云的服务器,根据官方文档尝试一晚上无果,自己又找资料成功完成启用微信公众号后台开发者模式的服务器设置. 一. ...

  7. java微信公众号开发之配置服务器

    5年了,你知道我这5年是怎么过的吗?! 5年前我做过一次公众号开发,当时写了篇简单的博客:https://blog.csdn.net/User_xiangpeng/article/details/50 ...

  8. 玩一玩微信公众号开发(二) 管理凭据和自定义菜单

    管理access_token access_token介绍 在前面我们成功的使用了Spring Boot Web程序和微信对接.但是这仅仅是一个开始,我们还需要获取access_token,也就是凭据 ...

  9. 微信公众号开发教程(二)消息接收与响应处理

    作者:陈惠,叩丁狼教育高级讲师.原创文章,转载请注明出处. 上一篇文章我们已经实现了URL接入,接下来就可以利用微信官方的开发文档来实现不同的案例.(注意:若还没有进行接入操作,请参考开发教程(一)) ...

最新文章

  1. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
  2. eye caring sticker
  3. python table_Python PrettyTable示例
  4. php主页显示商品预览图代码,在ECSHOP留言板页面显示商品缩略图方法
  5. Python常用基础语法
  6. 交通灯控制逻辑电路设计
  7. 火狐FireFox看视频不能全屏显示的问题
  8. Python实现快速查找文件
  9. ui设计 原则 要素_ui设计原则
  10. 在微软工作有多舒服?
  11. USBCAN卡解决新能源汽车CAN总线测试问题
  12. 【读书分享】吴军:《信息传》
  13. nginx http 跳转到https
  14. 【微信小程序】小程序功能开发
  15. php 设置时区 prc,php中如何设置时区
  16. 各种Mapping的区别
  17. 测试主管面试必问合集:get 与 post 的区别
  18. 在线 像素画 工具 PX-Art
  19. Qt入门-QLabel类
  20. PLM系统在制造业的应用(下)

热门文章

  1. 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
  2. 第十、十一周项目一-点-圆-圆柱类族的设计(1)
  3. Android10.0 Binder通信原理(七)-Framework binder示例
  4. Code Push 热更新使用详细说明和教程
  5. 计算机硬件2部件指的是什么,计算机基础-2.计算机硬件基础.doc
  6. 关于python3的标识符_python3中关于基础语法的详解
  7. 自定义封装ajax,复制即可用
  8. 部署node.js的开发环境
  9. lncRNA研究利器之TANRIC
  10. php-函数小知识点