微信公众号开发小坑:确认访问的微信是否为已关注公众号,秘钥使用全局access_token不能使用局部变量access_token

环境说明:

1.项目功能:年会抽奖活动开发,子功能:获取客户的相对公众号的唯一oppenid,然后确认是否关注本公众号,关注则获取客户信息后发抽奖券保存,否则先关注微信公众号;

2.java环境:SSM、jdk1.8、tomcat8、jar包直接导入项目、eclipe

小坑说明:判断是否关注微信公众号,使用如下的url 

String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+access_token+"&openid="+openId+"&lang=zh_CN";

关注则返回客户头像昵称等信息,不关注返回subscribe=0;

其中参数access_token为秘钥,分为全局和局部的秘钥,这里只能使用全局秘钥,但是在调试时候验证局部秘钥是否对oppenid有效的时候测试有效,一直使用局部秘钥访问报错,一度怀疑oppenid获取的和本公众号不匹配,最后百度有人说用全局秘钥更换后OK;

注意:全局access_token使用线程每2小时生成一次;

微信公众号开发小坑:确认访问的微信是否为已关注公众号,秘钥使用全局access_token不能使用局部变量access_token_第1张图片

全部代码:、

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ page import="java.io.*"%>
<%@ page import="java.net.*"%>
<%@ page import="net.sf.json.JSONArray"%>
<%@ page import="net.sf.json.JSONObject"%>
<%@ page import="com.hy.system.thread.TokenThread_hy"%>
<%        String code = request.getParameter("code");
        /*根据客户code获取客户openID  */
        String openId = "";    
        String access_token= "";    
        String nickname = "";        //客户昵称
        String headimgurl= "";    //客户头像地址
        String subscribe ="";    //客户是否关注公众号        
        int cont = 1;
        if (code != null) {
             //获取openid连接
             String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx538164e175f2dfaf&secret=2c067baa70a74fce98c22ca7fee55247&code="+code+"&grant_type=authorization_code";         
             try {
                    URL getUrl=new URL(requestUrl);
                    HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
                    http.setRequestMethod("GET");
                    http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
                    http.setDoOutput(true);
                    http.setDoInput(true);
                    http.connect();
                    InputStream is = http.getInputStream();
                    int size = is.available();
                    byte[] b = new byte[size];
                    is.read(b);
                    String message = new String(b, "UTF-8");
                    JSONObject json = JSONObject.fromObject(message);
                    System.out.println("1.返回值集合json="+json);
                    openId = json.getString("openid");        
                    access_token = json.getString("access_token");    
                    cont = 10;
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                }                    
        }        
         //获取客户信息:昵称、头像
        if (openId != "" && openId != null ) {         
             access_token =  TokenThread_hy.access_token.getAccess_token();
             System.out.println("全局秘钥="+access_token);
             System.out.println("openId="+openId);
             String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+access_token+"&openid="+openId+"&lang=zh_CN";     
    
             try {
                    URL getUrl=new URL(requestUrl);
                    HttpURLConnection http=(HttpURLConnection)getUrl.openConnection();
                    http.setRequestMethod("GET");
                    http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
                    http.setDoOutput(true);
                    http.setDoInput(true);
                    http.connect();
                    InputStream is = http.getInputStream();
                    int size = is.available();
                    byte[] b = new byte[size];
                    is.read(b);
                    String message = new String(b, "UTF-8");
                    JSONObject json = JSONObject.fromObject(message);
                    System.out.println("2.返回值集合json="+json);
                    subscribe = json.getString("subscribe");    
                    /*为零则未关注本公众号  */
                    if(!("0".equals(subscribe))){
                        nickname = json.getString("nickname");        
                        headimgurl = json.getString("headimgurl");    
                    }                    
                    
                    cont = 11;
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                }                    
        }
        
        
             

%>








    
    



 



年会抽奖卡发放、抽奖签到页面





   
    <%--

        
        
昵称:<%=nickname%>

    

    
    
        
        
    
--%>
    
    






<%=nickname%>

NO:

说明:查看年会抽奖卡请至"沪佳家装工厂店"微信公众号,正下方菜单栏中主菜单"沪佳家装"下子菜单"年会抽奖卡"!







    

 




你可能感兴趣的:(微信公众号,前端报错排查)