您的位置:首页 > 移动开发 > 微信开发

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

2017-11-13 18:09 721 查看

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 + "×tamp=" + 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: