网站实现扫描二维码关注微信公众号,自动登陆网站并获取其信息

news/2024/5/9 14:29:34/文章来源:https://blog.csdn.net/qq_21956483/article/details/81948496

原文:初始方案: https://www.cnblogs.com/cmyxn/p/7803117.html
          优化方案  http://www.cnblogs.com/cmyxn/p/7814120.html

 

需求

     网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站

     --如果用户已关注公众号,网站端直接自动登陆,如果没有关注,就等用户关注公众号之后网站端自动登陆

     (目前已经完成了这个功能,示例网址:http://www.bid-data.com/ 爱招标——免费实时标讯推送平台,为企业负责人及商务人员即时掌控招标动态、中标检索、竞争对手中标项目分析等服务平台。)

   做微信扫码登陆,生成二维码必须是微信公众号中绑定的域这个域名,网站生成不了二维码(网站与微信服务器不是同一个域名) ,而是调用微信系统的接口获取二维码,用户扫码后也是请求微信服务器 

   

实现思路

   1,微信的系统,提供生成带参数的二维码的接口,这个参数就是唯一值(场景值)
   2,网站调用微信系统,获取生成的二维码图片
   3,用户扫码会直接调用微信服务器,将用户访问微信服务器的信息记录到redis,key就是唯一值(场景值)
   4,网站端做轮训去查询redis中是否有这个唯一值的数据,如果有就获取用户信息登录,没有就五秒一次轮训,登录后就不在做轮训(从二维码弹出之后开始做轮训,关闭二维码后停止轮训)

   5,这里的唯一值是可以自己定义的,我用的是截取了几位的时间戳 

 

实现步骤

(1)微信端:写一个获取带参数的临时二维码接口。

复制代码

  // 临时二维码 private final static String QR_SCENE = "QR_SCENE";  // 永久二维码  private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";  // 永久二维码(字符串)  private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";   // 创建二维码  private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";  // 通过ticket换取二维码  private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";  @RequestMapping("getQrcode")public @ResponseBody String getQrcode(@RequestParam(value = "sceneId")int sceneId) throws Exception{String ticket = createTempTicket(tokenService.getToken(),"2592000",sceneId);LOGGER.info("get wechat qrcode  ==> start");LOGGER.info("sceneId :"+sceneId);LOGGER.info("ticket :"+ticket);LOGGER.info("get wechat qrcode  ==> end");return ticket;}/** * 创建临时带参数二维码 * @param accessToken * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 * @param sceneId 场景Id * @return */  public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  TreeMap<String,String> params = new TreeMap<String,String>();  params.put("access_token", accessToken);  Map<String,Integer> intMap = new HashMap<String,Integer>();intMap.put("scene_id",sceneId);  Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();  mapMap.put("scene", intMap);  Map<String,Object> paramsMap = new HashMap<String,Object>();  paramsMap.put("expire_seconds", expireSeconds);  paramsMap.put("action_name", QR_SCENE);  paramsMap.put("action_info", mapMap);  String data = new Gson().toJson(paramsMap);  String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);  JSONObject jsonObject = JSONObject.fromObject(tse);LOGGER.info("ticket :"+jsonObject.getString("ticket"));
     return showqrcode_path+"?ticket="+jsonObject.getString("ticket");}

复制代码

accessToken就是调用微信接口的凭证token

(2)网站端:网站写一个调用微信生成二维码的接口

复制代码

    @RequestMapping("getQrcode")public @ResponseBody Hashtable getQrcode(int sceneId){System.out.println(sceneId);Hashtable param = new Hashtable();param.put("sceneId", sceneId);String qrcodePath = HttpUtil.postRequest(Constant.getValue("get_qrcode"), param);System.out.println(" qrcodePath ==> "+qrcodePath);param.put("path", qrcodePath);return param;}

复制代码

直接使用http调用接口就行,Constant.getValue("get_qrcode")这个就是微信提供二维码接口的url

(3)微信端:微信处理用户请求(这个地址是微信公众号填的那个地址,微信服务器会将所有用户请求转发到这个地址)

复制代码

       // 事件推送else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {// 事件类型String eventType = requestMap.get("Event");// 关注if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {//获取用户信息String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken()).replace("OPENID", fromUserName);JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);String nickname = jsonObject.getString("nickname");String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");String headimgurl = jsonObject.getString("headimgurl");//将用户信息存入redis,key为唯一值(场景值)Hashtable params = new Hashtable();params.put("phoneIme", fromUserName);params.put("state", 1);params.put("location", address);params.put("realName", nickname);params.put("nickname", nickname);params.put("headimgurl", headimgurl);if(StringUtils.isNotBlank(eventKey)){redisCacheTool.setDataToRedis(eventKey.replace("qrscene_", ""), 3600, params);System.out.println("qrcode redis key ==> "+eventKey.replace("qrscene_", ""));params.put("equipmentType", eventKey);}//入库HttpUtil.postRequest(Constant.getValue("UPDATE_USER"), params);}// 取消关注else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {// TODO 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复Hashtable params = new Hashtable();params.put("phoneIme", fromUserName);params.put("state", 0);HttpUtil.postRequest(Constant.getValue("UPDATE_USER_ANS"), params);}// 扫描带参数二维码else if (eventType.toLowerCase().equals(MessageUtil.EVENT_TYPE_SCAN)) {// TODO 处理扫描带参数二维码事件
if(StringUtils.isNotBlank(eventKey)){String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";//获取用户信息requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken()).replace("OPENID", fromUserName);JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);String nickname = jsonObject.getString("nickname");String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");String headimgurl = jsonObject.getString("headimgurl");//将用户信息存入redis,key为唯一值(场景值)Hashtable params = new Hashtable();params.put("nickname", nickname);params.put("headimgurl", headimgurl);params.put("location", address);redisCacheTool.setDataToRedis(eventKey, 3600, params);System.out.println("qrcode redis key ==> "+eventKey);}respContent = "返回的信息";textMessage.setContent(respContent);respXml = MessageUtil.messageToXml(textMessage);}

复制代码

(4)网站端:登陆页面中做轮训,每隔几秒查询一次redis,如果有用户信息就登陆

复制代码

        var timestamp = new Date().getTime() + "";var str = timestamp.substring(8, timestamp.length);window.setInterval(function() {getUser(cont);}, 10000);function getUser() {$.ajax({type : 'get',data : {sceneId : str},dataType : 'json',url : "getUser.do",success : function(data) {if (data.msg == "success") {location.reload(); }},error : function(data) {if (data.msg == "success") {location.reload();}}});}        

复制代码

    

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_811814.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Google WebP图片格式帮助控制网站页面大小

日期&#xff1a;2013-3-16 来源&#xff1a;GBin1.com 不管你相信或者不相信&#xff0c;随着互联网的快速发展网页也在持续不断的变大。 使 网页迅速膨胀的罪魁祸首不是大量使用的JavaScript库&#xff0c;CSS和无尽的共享按钮&#xff0c;而是精美的图片。根据HTTPArchive的…

网站服务器的管理,网站服务器的管理

网站服务器的管理 内容精选换一换域名注册(Domain Registration)是用户付费获取Internet上某一域名一段时间使用权的过程。华为云域名注册服务提供域名的注册、购买、实名认证以及管理功能。华为云的域名注册服务与新网合作&#xff0c;因此通过华为云注册的域名其注册商为新网…

富士通服务器怎么修复,BIOS维修网站www.biosrepair.com-富士通E8410 BIOS刷新修复

接修一台富士通E8410笔记本&#xff0c;故障原因是用户自升级BIOS后无法开机&#xff1b;对于维修来说&#xff0c;BIOS损坏是最容易修复的故障&#xff0c;只要重写BIOS芯片即可&#xff0c;当然维修BIOS&#xff0c;最关键的问题是BIOS文件。由于明确机器故障&#xff0c;因此…

杨建:网站加速--服务器编写篇

杨建&#xff1a;网站加速--服务器编写篇&#xff08;上&#xff09; --提升性能的同时为你节约10倍以上成本From: http://blog.sina.com.cn/iyangjian一&#xff0c;如何节约CPU二&#xff0c;怎样使用内存三&#xff0c;减少磁盘I/O四&#xff0c;优化你的网卡五&#xff0c;…

nginx的http2.0性能太逆天了,HTTPS网站性能优化

m## 关于http2.0 请阅读&#xff1a; [HTTP 2.0的那些事][(http://mrpeak.cn/blog/http2/) 背景 我们七层负载层&#xff0c;使用了5台24U64G内存的物理机支行nginx做https加解密与proxy_pass。每天上下班时段&#xff0c;5台机CPU基本在50%左右&#xff0c;算是计算型。 优…

弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)

I think: 给出k&#xff08;4≤k≤5000&#xff09;个互不相同的整数组成的序列Ni&#xff0c;判断是否存在4个整数Np、Nq、Nr和Ns&#xff08;1≤p&#xff1c;q&#xff1c;r&#xff1c;s≤k&#xff09;&#xff0c;使得Nq&#xff1e;Ns&#xff1e;Np&#xff1e;Nr或者N…

建立一个免费的网站

大家可能想建立一个个人主页,但是只想尝试一下,那么,先建立一个免费的网站是不错的选择. 一、 建站需要什么 1. 域名&#xff0c;是访问的地址。 2. 空间&#xff0c;是存储网站的主机。 二、建站的步骤 1. 申请空间 到http://www.id666.com/注册用户.之后在会员页面点击初始化…

如何让百度快速收录WordPress网站?

首先&#xff0c;如果要让百度快速收录自己的网站的话&#xff0c;最近就有一个非常好的途径&#xff0c;那就是百度推出的百度熊掌号&#xff0c;他就是为保护原创而诞生的&#xff0c;我身边的朋友百分之80都开始使用百度熊掌号了&#xff0c;大家共同得出一个结论就是&#…

企业网站公司网站应该如何优化如何做SEO

前言&#xff1a;今天逛了一逛Zac的博客&#xff0c;看了一篇文章&#xff0c;我认为可以给许多seo小白或者说老手都很有帮助&#xff0c;所以今天把这篇文章发出来给大家看一看&#xff0c;一个企业或者说公司&#xff0c;里面的SEO部门应该做些什么&#xff0c;SEO初期应该做…

免费SSL证书大全,加速普及网站实现HTTPS加密

免费SSL证书大全&#xff0c;加速普及网站实现HTTPS加密 SSL 证书用于加密 HTTP 协议&#xff0c;实现网站通过HTTPS加密协议访问。随着国内外各大网站实现全站 HTTPS 协议&#xff0c;以及搜索引擎对使用 HTTPS 协议网站的更加友好&#xff0c;加之互联网对数据和隐私安全的加…

志在指尖网站优化工具Ver2.0【收费版破解版】

废话不多说直接先放图 从1.0版本开始一直到1.3版本全部免费&#xff0c;持续了这么多个版本。 我想在免费期间一直使用本软件的用户一定清楚我们的软件效果怎样&#xff0c;这里我以本站使用工具优化的收录量为例。 下面是我秒收录的相关图片 我只发了一个标题为1 内容为1的文…

解读seo熊掌号指数2.0的三种快速提升技巧

解读SEO熊掌号指数2.0的三种快速提升技巧 熊掌号指数2.0是什么&#xff1f; 熊掌号指数是根据账号在平台的整体表现而综合计算分析得出的分数&#xff0c;用于判断熊掌号的内容运营、服务运营以及用户运营等能力。 本文来自&#xff1a;IT技术 本文原网址&#xff1a;https:…

为什么网站优化了很久了还是没有排名 那是因为你没注意下面这三点

对于一个Seoer来说&#xff0c;最心累的中央不是网站关键词排名上不去&#xff0c;而是本人辛辛劳苦的维护的关键词排名不断在降落&#xff0c;只能眼睁睁地看关键词排名在降落&#xff0c;却无能为力&#xff0c;由于他们不晓得本人犯了什么错招致了这个现象。这里我就给大家总…

如何应用SEO优化来进行对网站的搜索引擎排名

如果网页设计师和开发者想要抓住利润丰厚的移动搜索市场&#xff0c;他们不仅需要适应网页来改变他们的战略和战略。移动搜索是市场不时增长的一部分。这是一个好消息。但是&#xff0c;移动搜索有自己的规则&#xff0c;这与传统的桌面搜索规则不同。这就是为什么如果你不想错…

建设手机网站最主要的因素是什么

移动网站的访问速度非常不同。 PC和PC之间的区别在于访问手机网站需要花费大量时间。在这种情况下&#xff0c;如果移动网站的内容太大&#xff0c;则内存太大或速度慢。在用户看来&#xff0c;它是不时消耗我自己的流量&#xff0c;第一个响应首先自然关闭。影响移动网站开放的…

怎么预防网站被降权

怎么预防网站被降权 SEO是网站流量的重要来源之一&#xff0c;但根据SEO优化大数据&#xff0c;一半的的网站都经历了降级的体验。那么如何防止网站在日常SEO优化中被减少&#xff1f;以下是一些需要解释的重要因素。 首先&#xff0c;不要注意内容 对于网站&#xff0c;内容…

新博客新网站到底该怎么操作SEO才能快速参与排名呢,快来看看,大多数人都误解了-下载联盟

新博客新网站到底该怎么操作SEO才能快速参与排名呢&#xff0c;快来看看&#xff0c;大多数人都误解了-下载联盟 好的各位&#xff0c;咋们又在下载联盟见面啦&#xff0c;昨天我们写了一篇关于个人下载博客和个人技术博客的前景问题&#xff0c;相信大家应该都有所了解了&…

快速构建网站之前言

想必大家对各种各样的网站都有一种说不出的感觉&#xff0c;比如这网站是怎么做的&#xff0c;怎么这么美。 或者怎么有这样的网站啊&#xff0c;外观这么挫&#xff0c;响应又慢。 当你点开浏览器&#xff0c;输入网址访问网站的时候&#xff0c;恭喜你&#xff0c;你进入了…

快速构建网站之动态网站和静态网站介绍

如果想要构建一个网站的话&#xff0c;可以考虑构建一个静态网站或者构建构建一个动态网站. 首先我们大致讲解一下网站的本质 网站其实是一堆文件的集合&#xff08;文件既可以是文本也可以是多媒体文件&#xff09;&#xff0c; 然后将这些文件存放到一些互联网的服务器上去…

快速构建网站之介绍wordpress

这里我说一说wordpress的在服务器上主要的工作吧 如上图示&#xff0c;wordpress管理着一个数据库&#xff0c;用户或者管理员在线更新数据后&#xff0c; 通过wordpress进行数据的存储&#xff0c;用户在浏览网站的时候&#xff0c;由wordpress从数据库提取数据&#xff0c; …