JAVA微信公众号开发入门(详细)

有在学习公众号开发的小伙伴向我反映了,说在学习的过程中很矛盾,很多的公众号开发教程不够详细,亦或者是完全看不懂,况且官网给的文档也只是PHP的实例教程,而这时候学其他编程语言的学者们往往就容易陷入苦海。小编认为这肯是初次接触新技术的迷茫,因为不知道从哪里下手就盲目的寻找各式各样的教程,不仅没学到,反倒乱了套,又或是一知半解。在这里小编将带带领大家一步一步的学习微信公众号开发。

1.注册微信公众平台
首先我们打开https://mp.weixin.qq.com进入微信公众平台的登录页面,如果还没有注册的同学点击右上角的注册按钮

如果有企业提供信息的话可以选择服务号,如果只是个人学习公众号开发的话,建议选择订阅号(除了功能少了点,其他效果跟服务号也差不多),本次教程,小编采用订阅号作为测试

我们可以在这里看到订阅号与服务号的大致区别,这里同样选择订阅号

这里我们选择个人,填写完信息后注册完成

2.后台与微信公众号对接
登录微信公众号平台成功以后,我们看到左侧的功能栏,找到开发项点击 基本配置


这里就是后台与公众号对接的地方了,下图输入框的内容暂时忽略

这时候我们可以打开我们的开发工具了,这里的小编使用的是IntelliJ IDEA开发工具,首先呢为了方便我们创建一个SpringBoot项目(主要是懒得写太多配置文件)

目前使用spring boot版本为2.1.4,导入一下依赖:

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- jackson依赖 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.6</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.6</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.6</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.3.1</version></dependency><!-- JSONObject对象依赖的jar包 --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.2.3</version><classifier>jdk15</classifier><!-- 指定jdk版本 --></dependency><!-- 微信httpclient 获取用户 openId--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.1</version></dependency>

我们首先需要三个工具类:
1.MyX509TrustManager.java 用于检查证书


import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;public class MyX509TrustManager implements X509TrustManager {/*** 该方法用于检查客户端的证书,若不信则抛出异常* 由于我们不需要对客户端进行认证,可以不做任何处理*/@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateEncodingException {}/*** 该方法用于检验服务器端的证书,若不信任则抛出异常* 通过自己实现该方法,可以使之信任我们指定的任何证书* 在实现该方法时,也可以不做任何处理,即一个空的方法实现* 由于不会抛出异常,它就会信任任何证书*/@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateEncodingException {}/*** 返回收信任的X509证书数组*/@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}
}

2.WeixinUtil.java 发起https请求工具类

import net.sf.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** Created by Administrator on 2016/11/7.*/
public class WeixinUtil {private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);/*** 发起https请求并获取结果** @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("Weixin server connection timed out.");} catch (Exception e) {log.error("https request error:{}", e);}return jsonObject;}
}

3.SignUtil.java 请求校验工具类


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;/*** 请求校验工具类*/
public class SignUtil {// 与接口配置信息中的Token要一致private static String token = "weixinCourse";/*** 验证签名* * @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);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;}
}

我们打开微信公众号开发文档接入指南https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319,不难看出,这是微信服务器在接入时给我们发送的四个参数,并且需要我们再将echostr随机字符串返回给微信服务器

创建package-》controller,创建类WxController:

/*** 微信公众号对接*/
@Controller
@RequestMapping("/wxDemo")
public class WxController {@RequestMapping(value = "/coreController",method= RequestMethod.GET)public void login(HttpServletRequest request, HttpServletResponse response){// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");PrintWriter out = null;try {out = response.getWriter();// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if(SignUtil.checkSignature(signature, timestamp, nonce)){out.write(echostr);}} catch (IOException e) {e.printStackTrace();}finally{out.close();}}}

ok,代码准备完毕,这时候我们发现公众号对接所使用的必须是有效域名,所以不能使用http://localhost:8080这样的域名了,没有服务器的小伙伴可以试试这个natapp外网穿透,官网:https://natapp.cn/,注册成功以后购买免费隧道即可,下载客户端后直接打开输入natapp -authtoken=你购买的隧道authtoken 回车 成功效果图为:

这样就生成了一个随机的临时域名,同时我们启动刚刚编写的项目,这时候我们回到公众号基本配置这里,将域名与请求的路径拼接填入URL输入框,将SignUtil.java的变量token填入Token输入框,EncodingAESKey随机生成即可。

配置完成以后我们点击提交,提交成功证明我们的项目与微信公众号已经对接完成

本章结束,有疑问或者有建议的小伙伴可以在下方评论区留言。
git源码分享:------》》》》戳这里
下一篇:java微信公众开发(原始篇-获取access_token)—》》》戳这里

springboot-微信公众号开发(接入微信公众号)相关推荐

  1. signaturenonce php,php微信公众平台开发--接入微信API

    1. 接入微信API public function index(){ //获得参数 signature nonce token timestamp echostr //微信服务器发出参数都是以get ...

  2. 网络架构、云平台和微信公众号开发接入--基于嵌入式工程师的视觉

    云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智 ...

  3. 网络架构、云平台和微信公众平台开发接入

    云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智 ...

  4. 微信公众号开发(一)------对接公众号

    微信公众号开发(一)------对接公众号 前言 一直以来对微信公众号开发想去了解一下,刚好最近有时间去学习,在这里记录一下,方便以后查阅. 正文 微信公众号对接服务器 一.接入 首先我们要去申请一个 ...

  5. 微信公众平台开发[3] —— 微信公众号支付功能(PHP)

    直言无讳,我就是一个初涉微信开发的小白,写这篇博客的原因:一是为了给自己做下备忘记录,以便以后能回忆这条程序猿的坎坷路:二是希望能帮助到同是自学开发的小白们:三是对那些不屑一顾于我等尘埃的大牛们的控诉 ...

  6. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...

  7. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  8. 微信公众号开发之微信公众平台与公众号第三方平台区别

    微信公众号开发分为微信公众平台和公众号第三方平台. 首先需要一个认证服务号,然后在设置,基本配置里面配置公众号开发信息和服务器配置. 这是我们会得到开发者ID(AppID),开发者密码(AppSecr ...

  9. 微信公众号开发以及测试公众号前端自测网页授权

    测试号申请(开发的时候需要使用微信测试号进行开发) 微信测试号申请地址 进入网页之后选择微信登陆,直接用微信扫码登录,微信测试号就申请成功了 测试号配置 申请成功之后会有一个测试号管理界面 1.会自动 ...

  10. 微信公众平台开发(110) 微信连Wi-Fi

    微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案.商家接入微信连Wi-Fi后,顾客无需输入繁琐的Wi-Fi密码,通过微信扫二维码等方式即可快速上网.微信连Wi-Fi还帮助商 ...

最新文章

  1. Visual Studio 2010 and .NET 4 RTM中文版发布
  2. 虚拟化入门:用虚拟机安装RHEL 5(下)
  3. 软件设计期末考试重点内容
  4. 勤哲linux客户端,Excel在线编辑
  5. 55种数据可视化开源工具_通过开源工具增强学生能力的15种方法
  6. C语言通过网络实现发送文件的一点记录
  7. 用python海龟画图_天呐!python 的乌龟绘图怎么用啊!?
  8. (转)计算机视觉CV 圈子
  9. 苹果XR信号差,可否要求苹果公司召回?
  10. html京东快报,练习3:仿京东快报.html
  11. Redis之各版本特性
  12. 刚刚用鸿蒙跑了个“hello world”!跑通后,我特么开始怀疑人生....
  13. 文本相似度的方法对比
  14. love2d环境搭配
  15. C语言实现1/1-1/2+1/3-...-1/100求和
  16. 仓央嘉措不负如来不负卿
  17. php 获取月份的周数,PHP获取当前月份的周数只能使用php
  18. 《Linux C/C++服务器开发实践》简介
  19. uni.showToast appd端不起作用
  20. python \xe6\xb5解码

热门文章

  1. Python 抛出异常
  2. sql 还原数据库 错误3154
  3. Python-基础-面向对象-多态(二十四)
  4. centos6.5的root密码修改
  5. Debian 官方源换为国内的源的操作方法
  6. Qt中国象棋二——棋盘与棋子的绘制
  7. linux iotop rpm,iotop命令_Linux iotop 命令用法详解:用来监视磁盘I/O使用状况的工具...
  8. 如何在论文中交叉引用多个参考文献
  9. Docker新手入门详细介绍
  10. 联想win11无线鼠标连接不上