Java实现微信扫码关注公众号登录网站

准备工作:
申请一个微信公众号并登录,需要用到里面的两个功能—基本配置和开发者工具

核心思想:
一:在微信公众号后台的基本配置里配置好服务器配置,如图:

需要注意的是,如果你用本地的开发环境的话,URL不能写127.0.0.1或者localhost,需要做内网穿透处理,意思是这里必须用域名,因为小编我用127.0.0.1一直配置不成功,用了内网穿透就成功了。
Token是自己写,我的是写在工具类里的,工具类是网上随便找的一个,写好Token后这里的Token要跟自己写的保持一致。点击随机生成这个EncodingAESKey就行了,然后点击提交,显示配置成功的话就成功了。不成功的原因就是你要先把服务器运行起来,这样这里才能访问到你的URL才能验证你的Token.
二:进入开发者工具,点击公众平台测试账号,如图:

进入后配置接口配置信息就行了:

这里的URL和Token跟基本配置里你写的一模一样,点击提交,显示成功(如果失败了的话就是服务器没运行,只要基本配置里成功了这里一定成功)

代码controller层:
`package com.zzj.qlogin.controller;

import com.zzj.qlogin.cache.RedisCacheManager;
import com.zzj.qlogin.service.WxService;
import com.zzj.qlogin.utils.CheckoutUtils;
import com.zzj.qlogin.utils.XmlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

@Controller
public class HomeController {
Logger logger = LoggerFactory.getLogger(HomeController.class);

@Resource
private WxService wxService;
@Resource
private RedisCacheManager redisCacheManager;

/*** 首页* @return*/@GetMapping("/")
public String index(){return "index";
}/*** 登陆页面* @return*/
@GetMapping("/login")
public String login(){return "login";
}/*** 用于检测扫码和关注状态* @return*/
@PostMapping("/checkLogin")
@ResponseBody
public Object checkLogin(String ticket){//如果redis中有ticket凭证则说明用户已扫码说明登陆成功if(redisCacheManager.hasKey(ticket)){//扫码通过则删除redisCacheManager.delete(ticket);return true;}return false;
}/*** 获取二维码参数* @return*/
@GetMapping("/getQrCode")
@ResponseBody
public Object getQrCode(){return wxService.getQrCode();
}/*** 登陆成功跳转* @return*/
@GetMapping("/success")
@ResponseBody
public String loginSuccess(){return "登陆成功";
}/**** 微信服务器触发get请求用于检测签名* @return*/
@GetMapping("/handleWxCheckSignature")
@ResponseBody
public String handleWxCheckSignature(String signature,String timestamp,String nonce,String echostr){// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (signature != null && CheckoutUtils.checkSignature(signature, timestamp, nonce)) {return echostr;}return "";}/*** 接收微信推送事件* @param request* @return*/
@PostMapping("/handleWxCheckSignature")
@ResponseBody
public String handleWxEvent(HttpServletRequest request){try {InputStream inputStream = request.getInputStream();Map<String, Object> map = XmlUtil.parseXML(inputStream);String userOpenId = (String) map.get("FromUserName");String event = (String) map.get("Event");if("subscribe".equals(event)){// TODO:获取openid判断用户是否存在,不存在则获取新增用户,自己的业务//自己生成的二维码不管是关注还是扫码都能取到ticket凭证String ticket = (String) map.get("Ticket");redisCacheManager.set(ticket,ticket,10*60);logger.info("用户关注:{}",userOpenId);}else if("SCAN".equals(event)){//自己生成的二维码不管是关注还是扫码都能取到ticket凭证String ticket = (String) map.get("Ticket");redisCacheManager.set(ticket,ticket,10*60);logger.info("用户扫码:{}",userOpenId);}logger.info("接收参数:{}",map);} catch (IOException e) {e.printStackTrace();}return "success";}

}
`

工具类:
`package com.zzj.qlogin.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CheckoutUtils {

// 与接口配置信息中的Token要一致
private static String token = "mayipansheng";/*** 验证签名** @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);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;
}/*** @param a*/
public static void sort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {String temp = a[i];a[i] = a[j];a[j] = temp;}}}
}

}
`

注意我的controller层的handleWxCheckSignature地址,是用来接收微信平台发送的四个参数,然后返回echostr用作验证,通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败,如图:

总结:这个demo是小编从网上抄来的,但是运行不起来,我修改了一下就行了,主要修改了这个验证微信服务器的地址和applicatio.yml,需要把端口改成80,因为微信服务器http协议只支持80
避坑:
如果本地redis没密码,在yml里就把密码那一行删除,不然会报错,我的配置如图:

这里的appid和secret需要写你微信公众号后台的。

                                   新手上路,菜鸟起步

Java实现微信扫码关注公众号登录网站相关推荐

  1. 微信扫码 - 关注公众号后网站自动注册并登录的实现

    微信扫码 - 关注公众号后网站自动注册并登录的实现 需求描述 在自己网站上点击微信登录,网站自己弹出一个二维码.扫描二维码后弹出公众号的关注界面.只要一关注公众号网站自动登录.第二次扫描登录的时候网站 ...

  2. 「实用」微信扫码 - 关注公众号后网站自动登录

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:destiny 链接:htt ...

  3. 扫码关注公众号登录系统

    微信开发--扫码关注公众号登录系统 前言 准备阶段 NATAPP 测试账号 工具代码 微信 API 调研阶段 步骤1:注册账号(如果使用测试账号可跳过) 步骤2:了解微信扫码机制 步骤3:了解微信消息 ...

  4. PHP微信扫码关注公众号并授权登录源码

    PHP微信扫码登录看起来简单,但做起来有点麻烦,开发起来就会浪费很多的时间. PHP判断是否首次关注公众号,扫码关注公众号获取微信用户头像.openid和省市等信息源码. 演示体验地址: https: ...

  5. 最新PHP微信扫码关注公众号并授权登录源码

    正文: PHP微信扫码登录看起来简单,但做起来有点麻烦,开发起来就会浪费很多的时间. PHP判断是否首次关注公众号,扫码关注公众号获取微信用户头像.openid和省市等信息源码. 第一步:获取关注二维 ...

  6. php关注公众号代码,PHP微信扫码关注公众号源码

    附上数据库信息:CREATE TABLE IF NOT EXISTS `qrcode` ( `id` int(11) unsigned NOT NULL, `addtime` int(10) NOT  ...

  7. WECHAT 微信扫码关注公众号方法无法获取头像和昵称了

    请注意: 20年6月8日起,用户关注来源"微信广告(ADD_SCENE_WECHAT_ADVERTISEMENT)"从"其他(ADD_SCENE_OTHERS)" ...

  8. PHP微信扫码关注公众号并登录

    2019独角兽企业重金招聘Python工程师标准>>> https://www.sucaihuo.com/php/1414.html 转载于:https://my.oschina.n ...

  9. uniapp/微信扫码打开公众号(并且判断是否关注公众号)

    1.将二维码下载下来 这个二维码微信扫的话,未关注会进入到公众号详情,关注的话,会进入到公众号内 2.判断用户是否关注公众号 请求微信接口,判断用户是否关注公众号_weixin_33971205的博客 ...

  10. 生成微信公众号二维码(用户扫码关注公众号)

    1.token 文件 /*** https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=1 ...

最新文章

  1. pandas新字段(数据列)生成、使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战
  2. 深入理解Binder机制4-bindService过程分析
  3. Mac OS X 修复基本命令失效的问题
  4. 【题解】p1064 金明的预算方案
  5. 三星 原生android,原生Android 4.0 三星GALAXY Nexus评测
  6. 第十八篇 Linux环境下常用软件安装和使用指南
  7. java在线网页客服聊天_管理员消息java 网站用户在线和客服聊天
  8. ansible介绍+基本操作
  9. 【Flink】Flink 或者 Spark the client is stop
  10. 人脸系列:人脸检测、人脸关键点定位、人脸优选、人脸对齐、人脸特征提取、人脸跟踪、人脸活体检测
  11. 阶段3 1.Mybatis_11.Mybatis的缓存_2 延迟加载和立即加载的概念
  12. FCKEditor v2.6.3 最新版-ASP.NET 演示程序
  13. 配置nessus服务在kali中开机自启动
  14. Python构建代理ip池
  15. 什么是工序分析法?工序分析的方法和实施步骤有哪些
  16. 游戏引擎架构 (Jason Gregory 著)
  17. python实战:基于链家网二手房数据解析任务
  18. nodejs 读取写入 plist 文件,使用 plist npm 包
  19. MySQL功能大全(细品)
  20. 分子动力学模拟学习3-Gromacs数据处理

热门文章

  1. 冰封王座人工只能_魔兽争霸3玩家热议 人工智能能否轻松战war3胜职业选手?
  2. MATLAB人体行为检测与识别
  3. 周一清晨的领导课读书笔记
  4. TPP并不可怕,可怕的是我们开始自我封闭
  5. 前端开发工程师职位要求
  6. django memery cache
  7. android系统 备份恢复,Android系统备份及系统还原方法介绍
  8. redis探索之常用的三种缓存读写策略
  9. vue 截取video第一帧作为封面
  10. 【牛客网】算法学习笔记