微信公众号平台开发(一)如何与微信后台对接
BAT一直以来是许多程序猿的奋斗目标,但如果有幸能够进入其中学习却连自家的平台API都没办法调用,那就有点说不过去了。因此,我这段时间一直在学习JAVA微信之间的对接开发,也从中看到了BAT的严谨之处。
开发工作中如果有任何不会的问题可咨询(永久有效): 微信号: Lifetime19931023
或者二维码:
(一)准备
最好的参考工具(官方文档):公众平台开发者文档
参考博客:souvc的博客
测试接口:微信公众号平台接口测试
jdk:1.8
IDE:IDEA
服务器:腾讯云(对学生有较大优惠)
(二)接入流程
通过阅读官方文档,可以得知若要接入微信公众号平台开发,开发者需要按照以下三步流程:
1. 填写服务器配置
2. 验证服务器地址的有效性
3. 依据接口文档来实现业务逻辑
(三)验证服务器的代码编写
我们的应用服务器要接受微信服务器的get请求,其中包括四个参数(signature、timestamp、nonce、echostr),开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
注意:具体内容含义可以通过阅读官方文档得知!
由官方文档,我们可知加密/校验流程如下:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行SHA1加密(SHA1加密在接下来的开发,有兴趣的话可以去了解一下)
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
ps:微信提供了一份php示例代码,有兴趣的可以了解一下
接下来,我将前两个步骤合为一个工具类去实现。废话不多说,我们直接上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /** * SignUtil * 验证 signature 工具类 * Created by zggdczfr on 2016/10/21. */ public class SignUtil { //与接口配置信息中的ToKen一致 private static String token = "" ; //该Token值为自己定义 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 messageDigest = null ; String tmpStr = null ; try { // 将三个参数字符串拼接成一个字符串进行sha1加密 messageDigest = MessageDigest.getInstance( "SHA-1" ); byte [] digest = messageDigest.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 ; } /** * 将字节数组转换为十六进制字符串 * @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; } } |
接下来是实现第三步,这里需要注意的一点是:微信提过get方法来验证身份,通过post方法来实现信息的传递,也就是说以后的业务逻辑实现都将通过这里配置的链接来对接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * Created by zggdczfr on 2016/10/21. */ @Controller @RequestMapping (value = "/wechat" ) public class SecurityController { private static final long serialVersionUID = 4323197796926899691L; private static final Logger LOGGER = Logger.getLogger(SecurityController. class ); @RequestMapping ( "test" ) public String test(){ System.out.println( "test" ); return "/index.jsp" ; } @RequestMapping (value = "security" , method = RequestMethod.GET) public void WetChatGet(HttpServletRequest request, HttpServletResponse response, @RequestParam (value = "signature" , required = true ) String signature, @RequestParam (value = "timestamp" , required = true ) String timestamp, @RequestParam (value = "nonce" , required = true ) String nonce, @RequestParam (value = "echostr" , required = true ) String echostr) throws IOException { try { // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(signature, timestamp, nonce)) { PrintWriter out = response.getWriter(); out.print(echostr); out.close(); } } catch (Exception e){ LOGGER.log(Level.ERROR, "连接微信公众号平台测试失败!" ); } System.out.println( "连接微信公众号平台测试成功!" ); } @RequestMapping (value = "security" , method = RequestMethod.POST) public void WetChatPost(HttpServletRequest request, HttpServletResponse response){ //业务逻辑处理 } } |
(四)服务器验证
接下来就是将我们的代码打包部署到服务器上来,通过测试接口来进行对接。
测试结果:
(五)最后的不知道什么鬼
- 微信服务器验证身份是通过固定的端口80。若没有配置域名的服务器(虚拟机),切记在外网ip后不必接上端口号。(ps:也许是我自己的基础不够扎实,在这个坑里面蹲了好久…………最后居然被我试出来了。。。)
- 这里采用的是springMVC框架,关于该框架的配置网上有许多教程可以学习。或者等我什么时候有时间了,也来写一写我对于该框架的了解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具