参考来源:
微信公众平台的微信开放文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
叩丁狼教育高级讲师陈惠老师的视频教程:https://www.bilibili.com/video/av37080662?p=5
叩丁狼教育高级讲师陈惠老师系列文档:https://www.jianshu.com/p/443c905e58a3
注意:首先我们需要搭建一个springmvc项目,详细教程可查看我的博客
前提:首先确保自己本地搭建好springmvc项目并且启动成功能访问;
我教程的项目使用的是:
接下来我们可以通过注册的内网穿透工具natapp给自己分配一个外网域名,将localhost:8080替换为外网域名访问看到的效果一样的,这下我们就能往下操作了
接入概述
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
下面详细介绍这3个步骤。
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token,其中URL是开发者用来接收微信消息和事件的接口URL。
Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
4)java代码示例如下
/**
* URL接入校验
* @return
*/
@RequestMapping(value="weChat",method = RequestMethod.GET)
@ResponseBody
public String validate(String signature,String timestamp,String nonce,String echostr){
//1)将token、timestamp、nonce三个参数进行字典序排序
String[] arr = {WeChatUtil.TOKEN,timestamp,nonce};
Arrays.sort(arr);
//2)将三个参数字符串拼接成一个字符串进行sha1加密
StringBuilder sb = new StringBuilder();
for (String temp : arr) {
sb.append(temp);
}
//自己加密的签名
String mySignature = SecurityUtil.SHA1(sb.toString());
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if(mySignature.equals(signature)){
//请原样返回echostr参数内容,则接入生效,成为开发者成功
System.out.println("接入成功");
return echostr;
}
//否则接入失败
System.out.println("接入失败");
return null;
}
5)WeChatUtil.TOKEN 为如下你填的token
6) SecurityUtil工具类内容如下:
package com.test.util;
import java.security.MessageDigest;
public class SecurityUtil {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* encode string
* @param algorithm
* @param str
* @return String
*/
public static String encode(String algorithm, String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Takes the raw bytes from the digest and formats them correct.
*
* @param bytes
* the raw bytes from the digest.
* @return the formatted bytes.
*/
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >>> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
public static String MD5(String content){
return SecurityUtil.encode("MD5", content);
}
public static String SHA1(String content){
return SecurityUtil.encode("SHA1", content);
}
}
7)使用内网穿透启动项目后,http://87dwwe.natappfree.cc/weChat/weChat.do
87dwwe.natappfree.cc为使用natapp分配给我的域名;
8)填写URl和Token后点击提交,可查看后台控制台会输出接入成功