demo:https://github.com/wenrongyao/wechat-demo
接入准备:
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、项目结构,添加微信的加密解密包,下图aes包下的内容,另外需要添加code依赖
需要添加依赖
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version>
</dependency>
3、EntryController控制器的开发
import com.wechat.constant.Constant;
import com.wechat.util.aes.AesException;
import com.wechat.util.aes.WXBizMsgCrypt;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/*** Created by rongyaowen on 2018/9/10.*/
@RestController
public class EntryController {@RequestMapping(value = "/entrance")public String entryTest(HttpServletRequest request) throws Exception {// 微信加密签名String msgSignature = request.getParameter("signature");// 时间戳String timeStamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echoStr = request.getParameter("echostr");String result = null;try {// 创建加密类 token ENCODINGAESKEY APPID换成自己公众号信息WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(Constant.WechatAccount.TOKEN, Constant.WechatAccount.ENCODINGAESKEY, Constant.WechatAccount.APPID);// 比对msgSignature 用token, timeStamp, nonce加密的参数是否一致,一致证明该接口来自微信,异常则不是来自微信result = wxcpt.verifyUrl_WXGZ(msgSignature, Constant.WechatAccount.TOKEN, timeStamp, nonce, echoStr);} catch (AesException e) {e.printStackTrace();} finally {return result;}}
}
根据微信公众平台的api可以知道大致校验逻辑如下
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
4)返回echoStr则表示接入成功
4、返回值的综述
相信看完上面的返回值echoStr,大家有那么点疑惑。这个echoStr是在微信公众号平台传入的随机数,可以直接获取。那是不是可以直接返回echoStr呢,答案是可以的,直接返回这个值,可以直接接入。
那么问题来了,为什么还需要做加密解密等一系列操作呢?
为了安全起见,我们需要判断一个陌生的链接是不是来自微信,通过上述的做法就可以实现。也算是一种反爬虫手段