1. 程式人生 > >Java微信網頁授權獲取使用者資訊 微信分享

Java微信網頁授權獲取使用者資訊 微信分享

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程式碼 略