Java微信网页授权获取用户信息 微信分享

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_29843547/article/details/78523098

1. 微信授权获取用户信息

1. 网页链接 javascript:
var redirectUrl = window.location.protocol + "//" + window.location.host + "/web/share/index.html";
                    var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9fea09e960df08c0&redirect_uri=" +
                        redirectUrl + "&response_type=code&scope=snsapi_userinfo&state=" + token + "#wechat_redirect";
2. 通过code换取网页授权access_token,拉取用户信息(需scope为 snsapi_userinfo) java:
/*第二步:通过code换取网页授权access_token*/
    @RequestMapping("/getUserInfoByCode")
    @ResponseBody
    public Object getUserInfoByCode(@RequestParam String code) {
        StringBuffer url = new StringBuffer();
        url.append("https://api.weixin.qq.com/sns/oauth2/access_token").append("?appid=").append(CommonConstant
                .WX_APP_ID).append("&secret=").append(CommonConstant.WX_APP_SECRET).append("&code=").append(code)
                .append("&grant_type=authorization_code");
        String result = HttpServiceUtils.sendHttpsPostRequest(url.toString(), "", HttpParamDto.DEFAULT_CHARSET);
        Map<String, String> resultMap = (Map<String, String>) JSONObject.parse(result);
        /* 第四步:拉取用户信息(需scope为 snsapi_userinfo)*/
        StringBuffer userUrl = new StringBuffer();
        userUrl.append("https://api.weixin.qq.com/sns/userinfo");
        String access_token = resultMap.get("access_token");
        userUrl.append("?access_token=").append(access_token);
        String openid = resultMap.get("openid");
        userUrl.append("&openid=").append(openid);
        userUrl.append("&lang=").append("zh_CN");
        String userInfoResult = HttpServiceUtils.sendHttpsPostRequest(userUrl.toString(), "", HttpParamDto
                .DEFAULT_CHARSET);
        Map<String, String> userInfoResultMap = (Map<String, String>) JSONObject.parse(userInfoResult);
        return buildSuccJson(userInfoResultMap);
    }

2. 微信分享获取JsApiTicket java:

@Override
    public Map<String, String> getJsApiTicket(String pageUrl) {
        /* 获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)*/
        String wx_access_token = redisService.kryoGet("wx_access_token", String.class);
        if (StringUtils.isBlank(wx_access_token)) {
            StringBuffer url = new StringBuffer();
            url.append("https://api.weixin.qq.com/cgi-bin/token?").append("grant_type=client_credential&appid=")
                    .append(CommonConstant.WX_APP_ID).append("&secret=").append(CommonConstant.WX_APP_SECRET);
            String result = HttpServiceUtils.sendHttpsPostRequest(url.toString(), "", HttpParamDto.DEFAULT_CHARSET);
            wx_access_token = JSONObject.parseObject(result).getString("access_token");

            if (null != wx_access_token) {
                redisService.kryoSetEx("wx_access_token", 7200, wx_access_token);
            }
        }
        log.info("wx_access_token:" + wx_access_token);
        /* 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket*/
        String jsApiTicket = redisService.kryoGet("wx_js_api_ticket", String.class);
        if (StringUtils.isBlank(jsApiTicket)) {
            StringBuffer getTicketUrl = new StringBuffer();
            getTicketUrl.append("https://api.weixin.qq.com/cgi-bin/ticket/getticket?").append("access_token=").append
                    (wx_access_token).append("&type=jsapi");
            String getTicketResult = HttpServiceUtils.sendRequest(getTicketUrl.toString());
            jsApiTicket = JSONObject.parseObject(getTicketResult).getString("ticket");
            int activeTime = Integer.parseInt(JSONObject.parseObject(getTicketResult).getString("expires_in"));
            if (StringUtils.isNotBlank(jsApiTicket)) {
                redisService.kryoSetEx("wx_js_api_ticket", activeTime, jsApiTicket);
            }
        }
        log.info("wx_access_token:" + jsApiTicket);

        Random random = new Random();
        String nonceStr = Md5Util.getMD5String(String.valueOf(random.nextInt(10000)).getBytes());
        String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
        String sign = "jsapi_ticket=" + jsApiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timeStamp + "&url=" +
                pageUrl;
        log.info("wx_access_token:" + sign);
        String signature = getSha1(sign);
        log.info("wx_access_token:" + signature);
        Map<String, String> resultMap = new HashMap<>();
        resultMap.put("timestamp", timeStamp);
        resultMap.put("nonceStr", nonceStr);
        resultMap.put("signature", signature);
        resultMap.put("appId", CommonConstant.WX_APP_ID);
        return resultMap;
    }
    public static String getSha1(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

        try {
            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
            mdTemp.update(str.getBytes("UTF-8"));

            byte[] md = mdTemp.digest();
            int j = md.length;
            char buf[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(buf);
        } catch (Exception e) {
            return null;
        }
    }

3.微信分享前端的JS代码 略

参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

猜你喜欢

转载自blog.csdn.net/sinat_29843547/article/details/78523098
今日推荐