微信公众号结合着内置浏览器,有着普通浏览器无法完成的服务,前者可以获取浏览页面的微信用户的信息,从而根据信息为用户提供基于微信的更多服务;而后者仅仅能够浏览页面,通过用户的输入信息与用户互动。
本人根据个人的经历总结从小白到入门的过程,是一种记录,也是对渴望入门者的一种指引。
- 注册微信公众平台并申请公众平台测试账号
- 填写接口配置信息
- 服务器与公众号验证Token
- 项目引入weixin-java-mp
一、注册微信公众号平台并申请公众平台测试账号
这方面没什么多言的,至于为何申请测试账号。因为私人只能申请订阅号,对应的开发者账号只能调用基本功能,无法使用高级功能;而测试账号可以使用任何功能以此来学习。
二、填写接口配置信息
在这里要特别注意,URL的一栏并不是要填一个公网服务器即可,要求的是必须为一个可以有Token验证行为的地址。
至于公网的问题,可以使用NATAPP将内网ip转换为公网随机域名,免费,可直接在本机调试项目,很方便。
三、服务器与公众号验证Token
至于Token验证问题,需要代码来验证,原理就是要保证你的Token一致,验证方法有很多种,在weixin-java-mp工具类中也有对应的验证方法,不过本人感觉这种方法更简单:
package xxx; import xxx.CheckoutUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; /**
* @author zuoyu
* @program xx
* @description 微信服务器验证Token
* @create 2018-07-31 17:55
**/
@Controller
@RequestMapping("/hello/")
public class HelloWeChatController {
/**
* 微信消息接收和token验证
*
* @param model
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("hello")
public void hello(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean isGet = request.getMethod().toLowerCase().equals("get");
PrintWriter print;
if (isGet) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
try {
print = response.getWriter();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
下面是在Servlet验证时要用到的工具类:
package xxx; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; /**
* @author zuoyu
* @program xx
* @description 微信验证工具
* @create 2018-07-31 17:53
**/
public class CheckoutUtil {
// 与接口配置信息中的Token要一致
private static String token = ""; /**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
// Arrays.sort(arr);
sort(arr);
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;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
} /**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
} /**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
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;
}
public static void sort(String a[]) {
for (int i = 0; i < a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j].compareTo(a[i]) < 0) {
String temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
}
将代码中的Token填写与在微信测试号的接口配置Token填写一致,然后URL指向该方法即可完成验证。
四、引入wenxin-java-mp工具包
每次调用微信的API都是访问给定的请求URL、附带的参数、以及访问方式,完成后返回一个json数据包;例如获取微信用户的openID:
如果这样在我们开发过程中是很繁琐的,而weixin-java-mp工具包就是一个将这些包装解析的繁琐动作封装起来,对外只暴露接口的工具包。当然类似的工具包还有很多,但个人感觉wenxin-java-mp是最完整且最简洁的,其他类似工具包有很多是基于其他框架、或者依赖包的。我们看一下用这个工具包获取openID多么方便:
几乎所有的对微信API的操作在wenxin-java-mp里都是一个方法。当然,在我们开发过程中依然要一边看着官方文档一边使用,要知其原理。
Java调用WeChat's API总结的更多相关文章
-
java调用百度地图API依据地理位置中文获取经纬度
百度地图api提供了非常多地图相关的免费接口,有利于地理位置相关的开发,百度地图api首页:http://developer.baidu.com/map/. 博主使用过依据地理依据地理位置中文获取经纬 ...
-
java 调用c# web api 代码
上次我们写的.net web api 给对方公司的java团队调用,他们觉得说java无法调用.net 写的api ,靠居然有这事,索性自己写一个java的demo给他们 使用apache的Http ...
-
java调用高德地图api实现通过ip定位访问者的城市
所需东西:高德地图的key 注意:这个key是 web服务的key 和js的key不是一个key(若没有则自行创建,创建教程在文末) 高德地图的api文档:https://lbs.amap.com/ ...
-
Geocoding java调用百度地图API v2.0 图文 实例( 解决102错误)
如何使用? 第一步:申请ak(即获取密钥),若无百度账号则首先需要注册百度账号. 第二步,拼写发送http请求的url,注意需使用第一步申请的ak. 第三步,接收http请求返回的数据(支持json和 ...
-
java调用支付宝 支付api 【沙箱环境】
由于支付宝支付api需要各种备案,但学校项目需要引入支付功能 先演示 ,所以采用 沙箱环境 一.登录支付宝 开放平台 及配置相关 https://openhome.alipay.com/platf ...
-
java调用百度地图API
http://blog.csdn.net/iTommy2016/article/details/75144936 http://blog.csdn.net/kingken212/article/det ...
-
java 调用短信 api 接口发送短信
参考: https://blog.csdn.net/u014793522/article/details/59062014 参考 :https://blog.csdn.net/Lu_shilusi ...
-
转载 基于JAVA每月运势api调用代码实例
代码描述:基于JAVA每月运势api调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/58 原文链接:http://outofmemory.cn/code-snip ...
-
Java 调用Restful API接口的几种方式--HTTPS
摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...
随机推荐
-
2016 年 11 月 12 个轻量级的 JavaScript 库
https://www.oschina.net/news/79316/2016-11-javascript-library?from=20161127
-
JS中的decodeURIComponent和encodeURIComponent
两个函数可以对特定函数生成的密码字符串进行解密操作,就可以生成为未解密的字符串 使用方法: //加密 encodeURIComponent("http://www.cnblogs.com/7 ...
-
NPOI 2.0 创建Excel文件
如果只是简单的处理的话,只需要引用下载压缩包里的 NPOI.dll (office 2003)或 NPOI.OOXML.dll (office 2007) 文件而已. using System; us ...
-
Hibernate双向一对一对象关系模型映射
一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 create table emp ( eid int primary key auto_increment, ename varch ...
-
Mac下使用Apache TCPMon
Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...
-
phpcms v9二次开发之模型类的应用(2)
二.模型操作方法select()--查询语句 //查询级别管理列表信息 public function levellists() { $lelists = $this->l ...
-
bindingredirect 没有效果
在搞在线聊天室的时候用到了SignalR 1.1.4,依赖于Newtonsoft.Json 4.5.0.0. 而我另外的dll又依赖Newtonsoft.Json 6.0.0.0 我只引用6.0.0. ...
-
vc中Error spawning cl.exe错误的解决方法.
可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过.很多人的 选择是重装, ...
-
Python集合(set)类型的操作
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...
-
Spring.Net 简单实例-01(IOC)
1.话不多说看操作.新建"Windows窗体应用程序" 2:通过配置文件创建IOC容器 首先引入安装包 3:定义一个接口(更好的体现封装性,当然也可以直接使用类) 定义一个类,实现 ...