精华内容
下载资源
问答
  • 二维码关注公众号

    2018-12-03 10:25:09
     网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站 –如果用户已关注公众号,网站端直接自动登陆,如果没有...

    原文链接

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

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

    (目前已经完成了这个功能,示例网址: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.cnblogs.com/cmyxn/p/7814120.html

    展开全文
  • 对于用户来说,能够越简单,不用动手做...今天就来介绍一下PC网站如何通过扫描微信二维码关注公众号,直接完成注册登录。 1、思考 最近在刷乐观数据的时候,发现网站注册登录流程有点不一样,都没怎么操作,只是用...

    在这里插入图片描述
    互联网时代,不管是以哪种形式存在的应用,移动端或者PC网站,注册登录功能是用户访问应用的第一步,可以说,注册登录用的方不方便在一定程度上能决定用户的去留。对于用户来说,能够越简单,不用动手做过多操作就能达到同样效果的功能是最好不过的。今天就来介绍一下PC网站如何通过扫描微信二维码关注公众号,直接完成注册登录。

    1、思考

    最近在刷乐观数据的时候,发现网站注册登录流程有点不一样,都没怎么操作,只是用手机扫了一个二维码进入到关注公众号的页面,然后关注公众号,就收到登入成功的消息提醒,电脑上也直接进入到平台首页,而且还显示了我的微信头像、昵称,很是快速。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这一看就不是用扫描微信开放平台的那种二维码做的,这种还更轻巧些,那这是怎么实现的呢?于是就去翻阅微信开发文档理了一下,就明白了。
    在这里插入图片描述

    2、思路

    其实这个功能实现原理很简单,如果按公众号开发文档的步骤来就两步:

    账号管理 -> 生成带参数二维码接口-> 创建临时二维码

    消息管理 -> 接收事件推送 -> 扫描带参数二维码事件

    接下来 来看开发过程,注意,已微信认证的服务号才有生成带参数二维码的功能

    3、开发

    关于二维码,微信根据实际业务不同提供了两种创建方法,临时和永久的,其实也什么差别,这里就举例说明创建临时二维码。

    3.1 生成调用凭据access_token(这个要做缓存,第一次先存缓存,之后都从缓存取,过期了再重新获取,这里没有做缓存)

    /**
     * @author liuqh
     * @date 2019/8/6 下午1:49
     * @description
     */
    @Component
    public class GetToken {
    
        private Logger logger = LoggerFactory.getLogger(GetToken.class);
    
        public AccessToken getToken(String appid, String appSecrect) {
            AccessToken token;
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid
                    + "&secret=" + appSecrect;
            String result = CommonUtil.httpsRequest(url, "GET", null);
            JSONObject jsonObject = JSONObject.fromObject(result);
            if (jsonObject != null) {
                try {
                    token = new AccessToken();
                    token.setAccess_token(jsonObject.getString("access_token"));
                    token.setExpires_in(jsonObject.getLong("expires_in"));
                } catch (Exception e) {
                    token = null;
                    e.printStackTrace();
                    logger.error("系统出错了!");
                }
            } else {
                token = null;
                // 获取token失败
                logger.error("jsonObject为空,获取token失败");
            }
            return token;
        }
    }
    

    工具类 CommonUtil

    /**
     * 
     * @Title: 请求CommonUtil.java
     * @Description: 通用工具类
     * @author
     *
     */
    public class CommonUtil {
      private static Logger log = LoggerFactory.getLogger(CommonUtil.class); 
    
      /**
       * 
       * @Title: httpsRequestJson
       * @Description: 发送https请求 ---返回JSONObject
       * @param requestUrl 请求地址
       * @param requestMethod 请求方式(GET、POST)
       * @param outputStr 提交的数据
       * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
       * @return JSONObject 返回类型
       * @throws  
       */
      public static JSONObject httpsRequestJson(String requestUrl, String requestMethod,
                            String outputStr) {
        JSONObject jsonObject = null;
        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 conn = (HttpsURLConnection) url.openConnection();
          conn.setSSLSocketFactory(ssf);
          conn.setDoOutput(true);
          conn.setDoInput(true);
          conn.setUseCaches(false);
          // 设置请求方式(GET/POST)
          conn.setRequestMethod(requestMethod);
          // 当outputStr不为null时向输出流写数据
          if (null != outputStr) {
            OutputStream outputStream = conn.getOutputStream();
            // 注意编码格式
            outputStream.write(outputStr.getBytes("UTF-8"));
            outputStream.close();
          }
          // 从输入流读取返回内容
          InputStream inputStream = conn.getInputStream();
          InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
          BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
          String str = null;
          StringBuffer buffer = new StringBuffer();
          while ((str = bufferedReader.readLine()) != null) {
            buffer.append(str);
          }
          // 释放资源
          bufferedReader.close();
          inputStreamReader.close();
          inputStream.close();
          inputStream = null;
          conn.disconnect();
          jsonObject = JSONObject.parseObject(buffer.toString());
        } catch (ConnectException ce) {
        } catch (Exception e) {
        }
        return jsonObject;
      }
    }
    

    生成二维码,

    scene_id这个字段是自定义的场景值,比如我们这个扫码场景是注册登录,

    在处理事件推送那边可以取到,用来判断场景。

    /**
     * @ClassName WxPublicQrcode
     * @Author liuqh
     * @Date 2020-02-29 20:15
     * @Description
     */
    public class WxPublicQrcode {
    
        private static final String createUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";
        private static final String showqrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";
    
        @Autowired
        private GetToken getToken;
        
        /**
         * 1、创建二维码ticket
         * @return
         * {"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
         * 3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"     }
         */        
        public static JSONObject create () {
            String token = getToken.getToken("appid","appSecrect").getAccess_token();
            Map<String, Object> map = new HashMap<>();
            map.put("expire_seconds",60);
            map.put("action_name","QR_SCENE");
            Map<String,Object> sceneId = new HashMap<>();
            sceneId.put("scene_id",123);
            Map<String, Object> scene = new HashMap<>();
            scene.put("scene",sceneId);
            map.put("action_info",scene);
            String param = JSON.toJSONString(map);
            System.out.println(param);
            JSONObject jsonObject = CommonUtil.httpsRequestJson(createUrl+token, "POST", param);
            System.out.println(jsonObject);
            return jsonObject;
        }
    
        /**
         * 2、通过ticket换取二维码
         * @return ticket正确情况下,http 返回码是200,是一张图片,可以直接展示或者下载
         */
        public static JSONObject showqrcode () {
            JSONObject create = create();
            String ticket = create.getString("ticket");
            try {
                ticket =  URLEncoder.encode(ticket,"utf-8");
                JSONObject jsonObject = CommonUtil.httpsRequestJson(showqrcodeUrl+ ticket, "GET", null);
    
                System.out.println(jsonObject);
                return jsonObject;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    3.2 处理事件推送

    关于如何处理接收事件,参考微信公众号关注或取关后再处理我们自己的业务逻辑这篇文章

    判断Event值是subscribe且EventKey值是qrscene_为前缀,后面为二维码的参数值,那么就是用户还未关注公众号,则用户可以关注公众号,做各种操作,存数据库什么,FromUserName就是用户的openid,Event值是SCAN且EventKey值是是一个32位无符号整数,即创建二维码时的二维码scene_id,则用户已经关注公众号,再做相对应的操作。
    在这里插入图片描述

    展开全文
  • 微信扫描自定义二维码关注公众号

    万次阅读 2017-11-10 12:39:13
    技术要点:1、用户微信扫描二维码时,如何判断是否已经关注公众号。2、怎么转向关注微信公众号界面,使用户很方便关注。 为电动汽车充电设备开发一套通过微信公众号在线充电产品,产品实现如下功能,通过微信扫描...

    首先讲讲项目背景,为电动汽车充电设备开发一套通过微信公众号在线充电产品,产品实现如下功能,通过微信扫描充电设备上二维码,实现与充电设备的交互,控制充电设备启停。要求扫描二维码时,判断是否已经关注客户的微信公众号,如果已经关注直接进入业务界面,否则进入公众号关注界面。

    技术要点:

    1、用户微信扫描二维码时,如何判断是否已经关注该公众号。

    2、怎么转向关注微信公众号界面,使用户很方便关注。

    基于第一个问题,可以通过获取用户基本信息,判断subscribe参数值:0-未关注,1-已关注。

    获取用户基本信息接口地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,返回值以json格式展示。。其中ACCESS_TOKEN是公众号接口访问token,OPENID是用户在某个公众号的唯一标识,获取到这两个值也就能判断是否关注公众号了。

    基于第二个问题,怎么让用户很方便关注公众号呢,可以使用以下链接,访问公众号的页面。https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect,其中biz的值不是appid,而是一种特殊字符串,获取方式下面讲述。


    下面进行每一步的详细讲解:

    一、获取access_token
    公众号的接口访问需要使用access_token,而appid和appsecret则是访问的凭据。微信公众平台已经提供获取access_token的访问接口:
    注意是HTTPS请求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    二、获取公众号唯一openid
    因为每一个用户在某个公众号的openid都是唯一的,所以需要知道某个用户是否在微信公众号中是否有关注,则需要让微信平台知道需要关注的公众号的信息,才能提供扫描用户在公众号的openid。所以公众号平台提供了此接口,为未关注或已关注状态的用户网页访问公众号时,提供用户在公众号的唯一openid。
    使用的访问链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    三、是否关注公众号
    如果知道了用户所在公众号的唯一openid,则可以根据其调用平台的另一个获取用户基本信息的接口获取关注状态。
    接口地址:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
    返回值以json格式展示,可以使用subscribe参数判断是否已经关注:0-未关注,1-已关注。

    四、关注公众号
    可以使用以下链接,访问公众号的页面,可以直接点击图标进行关注。https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect
    注意:biz的值不是appid,而是一种特殊字符串。获取方式是:1、分享公众号的一篇文章到其他应用。2、复制链接,可以看到biz参数的值。


    核心代码如下:

    /**
    	 * 微信二维码扫描处理,判断跳转
    	 * @param stakeno
    	 * @param request
    	 * @param response
    	 * @param model
    	 * @return
    	 * @author wangpf
    	 * @date 2017年11月8日 上午10:14:10
    	 */
    	@RequestMapping(value="qrcode/{stakeno}", method=RequestMethod.GET)
    	public String qrcode(@PathVariable("stakeno") String stakeno, HttpServletRequest request, HttpServletResponse response, Model model) {
    		String code = request.getParameter("code");
    		
    		AccessToken token = WeixinUtil.getAccessToken();
    		if(token == null || StringUtils.isEmpty(token.getToken())) {
    			model.addAttribute("warning", "获取微信授权失败,请退出后重试");
    			return "mobile/chg/chgWarning";
    		}
    		String openid = WeixinUtil.getOpenId(code);
    		request.getSession().setAttribute("openid", openid);
    		if(StringUtils.isEmpty(openid)) {
    			model.addAttribute("warning", "获取微信授权失败,请退出后重试");
    			return "mobile/chg/chgWarning";
    		}
    		
    		// 是否关注公众号  0-未关注,1-已关注
    		Map<String, String> userMap = WeixinUtil.getUserinfo(openid);
    		String subscribe = userMap.get("subscribe");
    		if("1".equals(subscribe)) {
    			WechatUserEntity entity = personalCenterService.findWechatUserEntity(openid);
    			if(entity == null) {
    				return "redirect:"+Global.getFrontPath()+"/wechat/usr/login";
    			}else {
    				return "redirect:"+Global.getFrontPath()+"/wechat/chg/stakedetail?stakeno="+stakeno+"&uid="+entity.getUserid().getId();
    			}
    		}else {
    			//未关注,跳转到公众号首页,供关注  
    			String biz = Global.getConfig("wechat_biz");
    			return "redirect:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz="+biz+"#wechat_redirect";
    		}
    	}


    欢迎交流wangpf2011@163.com



    展开全文
  • 一、微信公众号配置“服务器配置” https://blog.csdn.net/qq_31267183/article/details/83181157 二、生成带标识符的二维码 1. 生成AccessToken /// &lt;summary&gt; /// 获取token /// &lt;/...

    一、微信公众号配置“服务器配置”

    https://blog.csdn.net/qq_31267183/article/details/83181157

    二、生成带标识符的二维码

    1. 生成AccessToken

    /// <summary>
    /// 获取token
    /// </summary>
    /// <returns></returns>
    public static Response_AccessToken GetToken()
    {
        var url = "https://api.weixin.qq.com/cgi-bin/token";
    
        Dictionary<string, string> dict = new Dictionary<string, string>();
        dict.Add("appid", appId);
        dict.Add("secret", secret);
        dict.Add("grant_type", "client_credential");
    
        return HttpGet<Response_AccessToken>(dict, url);
    }
    
    /// <summary>
    /// 获取token参数
    /// </summary>
    public class Response_AccessToken : Response_Error
    {
        /// <summary>
        /// 网页授权接口调用凭证
        /// </summary>
        public string access_token { get; set; }
    
        /// <summary>
        /// access_token接口调用凭证超时时间,单位(秒)
        /// </summary>
        public string expires_in { get; set; }
    
        /// <summary>
        /// 用户刷新access_token
        /// </summary>
        public string refresh_token { get; set; }
    
        /// <summary>
        /// 用户唯一标识,在未观众公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的openid
        /// </summary>
        public string openid { get; set; }
    
        /// <summary>
        /// 用户授权的作用域,使用逗号分隔
        /// </summary>
        public string scope { get; set; }
    }

    2. 生成Ticket

    • 2.1 临时Ticket,标识符为int
    /// <summary>
    /// 生成永久Ticket
    /// </summary>
    /// <returns></returns>
    public static Response_Ticket CreatePermanentTicket(string token)
    {
        var url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token;
    
        JObject data = new JObject();
        data.Add("action_name", "QR_SCENE");
        data.Add("action_info", JObject.FromObject(new Request_Ticket_Info
        {
            scene = new
            {
                scene_id = 123 // 目前参数只支持1--100000
            },
        }));
    
        return WebService.HttpPost<Response_Ticket>(data.ToString(), url);
    }
    • 2.2 永久Ticket,标识符为int
    /// <summary>
    /// 生成永久Ticket
    /// </summary>
    /// <returns></returns>
    public static Response_Ticket CreatePermanentTicket(string token)
    {
        var url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token;
    
        JObject data = new JObject();
        data.Add("action_name", "QR_LIMIT_SCENE");
        data.Add("action_info", JObject.FromObject(new Request_Ticket_Info
        {
            scene = new
            {
                scene_id = 123 // 目前参数只支持1--100000
            },
        }));
    
        return WebService.HttpPost<Response_Ticket>(data.ToString(), url);
    }
    • 2.3 临时Ticket,标识符为string
    /// <summary>
    /// 生成永久Ticket
    /// </summary>
    /// <returns></returns>
    public static Response_Ticket CreatePermanentTicket(string token)
    {
        var url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token;
    
        JObject data = new JObject();
        data.Add("action_name", "QR_STR_SCENE");
        data.Add("action_info", JObject.FromObject(new Request_Ticket_Info
        {
            scene = new
            {
                scene_str = "标识符"
            },
        }));
    
        return WebService.HttpPost<Response_Ticket>(data.ToString(), url);
    }
    • 2.4 永久Ticket,标识符为string
    /// <summary>
    /// 生成永久Ticket
    /// </summary>
    /// <returns></returns>
    public static Response_Ticket CreatePermanentTicket(string token)
    {
        var url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token;
    
        JObject data = new JObject();
        data.Add("action_name", "QR_LIMIT_STR_SCENE");
        data.Add("action_info", JObject.FromObject(new Request_Ticket_Info
        {
            scene = new
            {
                scene_str = "标识符"
            },
        }));
    
        return WebService.HttpPost<Response_Ticket>(data.ToString(), url);
    }
    • 请求返回结果
    /// <summary>
    /// 请求返回结果
    /// </summary>
    public class Response_Ticket
    {
        /// <summary>
        /// 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
        /// </summary>
        public string ticket { get; set; }
    
        /// <summary>
        /// 二维码的有效时间,以秒为单位。最大不超过1800。
        /// 永久时没有此项
        /// </summary>
        public int expire_seconds { get; set; }
    
        /// <summary>
        /// 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片
        /// </summary>
        public string url { get; set; }
    }

    3. 生成二维码

    /// <summary>
    /// Ticket 换 二维码
    /// </summary>
    /// <param name="ticket"></param>
    /// <returns></returns>
    public static string TicketChangeQRCode(string ticket)
    {
        var ticket = HttpUtility.UrlEncode(ticket, Encoding.UTF8);
    
        return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
    }
    • 返回的数据时二维码,扫描后跳转到公众号的关注页(如果已经关注,则跳转到公众号首页),用户关注公众号,可以在关注信息中查询到标识符
    展开全文
  •  //生成二维码需要的参数   $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": ' . $orderId . '}}}' ;   $momo = json_decode( $qrcode ,...
  • 微信公众号开发: https://love.daquexing.com/view/307.html
  • ![有没有厂商电话可以解决一下,或者别的解决思路](https://img-ask.csdn.net/upload/201709/28/1506584300_185469.png)
  • 今天学习了创建带参数的二维码并创建标签,扫描带参数的二维码后自动分组到所在的标签中。首先,先创建带参数的二维码,代码如下: public function qrcodeAdd(){ if(IS_GET){ $this-&gt;display('qrcode_...
  • 微信这边的需求是扫描这个二维码之后要进入到公众号(已关注)的主页(如下图顺丰的公众号主页)。 ![图片说明](https://img-ask.csdn.net/upload/201801/03/1514940441_280318.jpg) 2.尝试过解码微信公众号官方...
  • 大概是为了给公众号引流吧,一些网站进行了扫描公众号二维码关注登录的操作 UML 图表 可以使用UML图表分析一下流程。 登录客户端登录服务端微信服务端手机微信1.请求生成公众号二维码2.收到请求,生成唯一标识,向...
  • 原文:初始方案: ...   需求  网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站 ...
  • 1、让用户扫描我们的二维码首先需要知道扫描者是否已经关注该微信公众号。 2、我们需要知道自己微信公众号的唯一标识。 微信公众号中提供了开发者测试公众号,地址:...
  • 一、平台 1.微信公众号平台 2.WPS的秀堂H5 3.在线二维码解码器 ... 下载一个公众号二维码。 2.百度“二维码解码器”--> 打开在线二维码解码器(或者直接输入网址:https://jiema.wwei.cn...
  • 2)、关注公众号  用户只有关注了这个公众号了,才能通过打开有公众号信息的链接去授权第三方登录,并获取用户信息的操作。故我们还需要用我们的微信关注微信号,操作如下:  还是刚刚那个登录成功后跳转的...
  • 1,微信提供生成带参数的二维码的接口,参数就是唯一值(场景值,我用的时间戳) 参考 微信文档 生成带参数的二维码 import requests class MyWeChatOAuth(object): def get_token(self): """获取授权跳转...
  • 公众号 生成带参数的二维码 扫码带参数进入关注公众号页面 官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html 临时二维码请求说明 http请求方式: ...
  • 用户微信扫码二维码 关注公众号后 怎么跳转到我指定我网站?? 哪位大佬有做过这样的功能 求解决! QQ联系方式:1114130370
  • ... 本人最近在做一个saas模式的产品开发,公众号只有一个,但...现在有这么一个需求,当用户扫描客户提供的公众号二维码时,会出现对应的客户欢迎语,并且显示客户的LOGO界面。前提是每个客户的LOGO是不同的。是不...
  • 微信连WiFi关注公众号流程更新 解决ios微信扫描二维码不关注就能上网的问题
  • 使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。 目前有2种类型的二维码: 1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但...
  • 前几天鼓捣了一下微信连WiFi功能,设置还蛮简单的,但ytkah发现如果是ios版微信扫描微信连WiFi生成的二维码不用关注公众号就可以直接上网了,而安卓版需要关注公众号才能上网,这样就少了很多ios用户的关注用户,ios...
  • 微信扫码关注扫二维码关注完成公司任务。微信公众号扫码关注通过让对方扫自己的二维码进行关注自己,可以先将自己的微信二维码保存到手机中, 然后将此二维码发给对方,让对方扫码关注即可。 可以通过以下步骤将自己...
  • 微信扫描二维码统计来源对...实现目标:粉丝生成自已的二维码(微信公众号二维码带这个粉丝的参数),别人扫这个二维码时,如果没有关注,则提示关注关注后就成为该粉丝的下线了,方便统计是谁发展来的用户 上代码...
  • nodejs进入扫描二维码页面后,扫码得到二维码信息跳转到别的页面后再想回到扫描页面怎么做? res.render('bindingGuide', { title: '绑定设备',userId:userId, open_id: open_id, appId: appId, timestamp: ...
  • 于是,我就打算用这个库来实现简单的制作一个二维码关注图,主要是完成以下几个工作:制作一个白色的背景图;将背景图和公众号二维码图合成;添加文字得到最终的合成图简介Wand 是基于 ctypes 库的适用于 Python 的 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,644
精华内容 31,857
关键字:

二维码关注公众号