wechat-0010,微信公众号,接入微信公众平台
接入准备:
1、有一个能在公网*问的项目
可以用内网穿透(推荐使用natapp),微信接入必须使用80端口或443端口,某壳现在需要花钱才能使用80端口,果断放弃
natapp的使用文章,参考博客 http://www.cnblogs.com/shirui/p/7308856.html
2、有一个微信公众号,个人可以申请订阅号,没有的话不妨申请一个,也可以申请微信号接口测试号
微信官网 https://mp.weixin.qq.com/
3、策略文件 报illegal key size异常时见
博客:http://www.cnblogs.com/shirui/p/7411735.html
4、微信的加密解密包,从企业微信的加解密包扩展而来,筒子们可以下载企业微信(我的企业微信博客中)自己改造,也可以下载我改造好的。
下载链接:https://download.csdn.net/download/wrongyao/10393783
5、微信公众平台api
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
开始接入
1、找到微信公众号后台,开发/基本配置/服务器配置
依此填写三个参数,url需要接入的接口,token和EncodingAESkey,后面两个必须和自己项目上写的保持一致
2、BaseController开发
pom.xml文件
<!-- Base64 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.wechat.common.aes.AesException;
import com.wechat.common.aes.WXBizMsgCrypt;
import com.wechat.common.parameter.Parameter;
@Controller
public class BaseController {
@RequestMapping(value = "/BaseController")
public void entryTest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 微信加密签名
String msgSignature = request.getParameter("signature");
// 时间戳
String timeStamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echoStr = request.getParameter("echostr");
PrintWriter out = null;
try {
// 创建加密类
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(Parameter.TOKEN, Parameter.ENCODINGAESKEY, Parameter.APPID);
// 比对msgSignature 用token, timeStamp, nonce加密的参数是否一致,一致证明该接口来自微信,异常则不是来自微信
String result = wxcpt.verifyUrl_WXGZ(msgSignature, Parameter.TOKEN, timeStamp, nonce, echoStr);
// 校验成功原样放回echoStr
out = response.getWriter();
out.print(result);
} catch (AesException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
out = null; // 释放资源
}
}
}
}
根据微信公众平台的api可以知道大致校验逻辑如下
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
4)返回echoStr则表示接入成功
前面三步微信的加密解密包都可以帮我直接完成,将加解密文件引入自己的项目,就可以正常调用了,下面是项目结构。
3、返回值的综述
相信看完上面的返回值echoStr,大家有那么点疑惑。这个echoStr是在微信公众号平台传入的随机数,可以直接获取。那是不是可以直接返回echoStr呢,答案是可以的,直接返回这个值,可以直接接入。
那么问题来了,为什么还需要做加密解密等一系列操作呢?
为了安全起见,我们需要判断一个陌生的链接是不是来自微信,通过上述的做法就可以实现。也算是一种反爬虫手段