获取用户openid
先上效果图:
为什么要使用小程序登录?
关于这个问题,小程序api里面是这样描述的。
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
登录流程
这张官方的登录流程图,对于登录流程解释的很详细了,如果不想看图解的,下面会有文字解析。
- 开发者在小程序的js中调用wx.login()方法获取登录凭证(code,有效期五分钟,只能使用一次),通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯(如解密手机号)需要依赖会话密钥完成。
- 带上登录凭证code,向开发者服务器发送HTTP请求,开发者服务器带上appid和appsecret和code向微信接口(https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code)获取用户唯一标识 OpenID 和 会话密钥 session_key。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
- 将openid存入用户自己的用户体系中,并返回给小程序,在小程序中调用wx.setStorageSync或者wx.setStorage存入本地缓存中。示例:`wx.setStorage({
key:“key”,
data:“value”
}); - 到此登录就算结束了,需要用到openid时通过wx.getStorage或者wx.getStorageSync获取就好了。
代码片段
小程序端
<button class='btn1' open-type='getUserInfo' bindgetuserinfo="getUserInfo">
<image class='btnImg' src='../../images/wechat.png'></image>
<view>微信授权登录</view>
</button>
//onLoad中调用wx.login方法,至于为什么这样做,看下期获取用户手机号
wx.login({
complete: (res) => {
if ("login:ok" == res.errMsg) {
this.data.authCode = res.code;
}
},
})
getUserInfo: function (e) {
let that = this;
var header = {
'Accept': 'application/json',
'content-type': 'application/json',
'Authorization': null,
}
wx.request({
url: "http://localhost:8080/user/login",
method: 'GET',
header: header,
data: {
"authCode": that.data.authCode
},
success: function (res) {
that.data.sessionKey = res.data.sessionkey;
wx.showToast({
title: res.data.openid,
icon:'none'
})
},
fail: function () {}
})
}
Java
controller
@Value("${wx.appid}")
public String appId;
@Value("${wx.appsecret}")
public String appSecret;
@Value("${wx.authapi}")
public String authApi;
@GetMapping("login")
public JSONObject login(String authCode) {
String url = String.format(authApi, appId, appSecret, authCode);
return WxUtil.login(url);
}
WxUtil
ResultCode是一个错误码和错误信息的枚举类。
public static JSONObject login(String url) {
JSONObject retJson = new JSONObject();
//String url = String.format(WxConfig.WX_AUTH_API, WxConfig.APP_ID, WxConfig.APP_SECRET, authCode);
String ret = HttpHelper.get(url);
String openid = null;
logger.info("WX->login->url:" + url + ";result:" + ret);
if (StringUtils.isNotBlank(ret)) {
JSONObject obj = JSON.parseObject(ret);
if (!obj.containsKey("openid") || StringUtils.isBlank((openid = obj.getString("openid")))) {
retJson.put("status", ResultCode.FAIL.getValue());
retJson.put("message", ResultCode.RESPONSE_AUTH_ERROR.getDesc());
} else {
retJson.put("status", ResultCode.OK.getValue());
retJson.put("openid", openid);
retJson.put("sessionkey", obj.getString("session_key"));
}
}
return retJson;
}
HttpHelper
package cn.idwarf.wxsdk.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletRequest;
public class HttpHelper {
private static final String GET = "GET";
private static final String POST = "POST";
private static String CHARSET = "UTF-8";
private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory();
private static final HttpHelper.TrustAnyHostnameVerifier trustAnyHostnameVerifier = new HttpHelper.TrustAnyHostnameVerifier();
private static final Logger logger = LoggerFactory.getLogger(HttpHelper.class);
private HttpHelper() {
}
private static SSLSocketFactory initSSLSocketFactory() {
try {
TrustManager[] tm = new TrustManager[]{new HttpHelper.TrustAnyTrustManager()};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init((KeyManager[]) null, tm, new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception var2) {
throw new RuntimeException(var2);
}
}
public static void setCharSet(String charSet) {
if (StringUtils.isBlank(charSet)) {
throw new IllegalArgumentException("charSet can not be blank.");
} else {
CHARSET = charSet;
}
}
private static HttpURLConnection getHttpConnection(String url, String method, Map<String, String> headers) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException {
URL _url = new URL(url);
HttpURLConnection conn = (HttpURLConnection) _url.openConnection();
if (conn instanceof HttpsURLConnection) {
((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory);
((HttpsURLConnection) conn).setHostnameVerifier(trustAnyHostnameVerifier);
}
conn.setRequestMethod(method);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setConnectTimeout(19000);
conn.setReadTimeout(19000);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
if (headers != null && !headers.isEmpty()) {
Iterator var5 = headers.entrySet().iterator();
while (var5.hasNext()) {
Entry<String, String> entry = (Entry) var5.next();
conn.setRequestProperty((String) entry.getKey(), (String) entry.getValue());
}
}
return conn;
}
public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
HttpURLConnection conn = null;
String var4;
try {
conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), "GET", headers);
conn.connect();
var4 = readResponseString(conn);
} catch (Exception var8) {
throw new RuntimeException(var8);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return var4;
}
public static String get(String url, Map<String, String> queryParas) {
return get(url, queryParas, (Map) null);
}
public static String get(String url) {
return get(url, (Map) null, (Map) null);
}
public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
HttpURLConnection conn = null;
String var11;
try {
conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), "POST", headers);
conn.connect();
if (data != null) {
OutputStream out = conn.getOutputStream();
out.write(data.getBytes(CHARSET));
out.flush();
out.close();
}
var11 = readResponseString(conn);
} catch (Exception var9) {
throw new RuntimeException(var9);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return var11;
}
public static String post(String url, Map<String, String> queryParas, String data) {
return post(url, queryParas, data, (Map) null);
}
public static String post(String url, String data, Map<String, String> headers) {
return post(url, (Map) null, data, headers);
}
public static String post(String url, String data) {
return post(url, (Map) null, data, (Map) null);
}
private static String readResponseString(HttpURLConnection conn) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), CHARSET));
String line = reader.readLine();
String var4;
if (line == null) {
var4 = "";
return var4;
} else {
StringBuilder ret = new StringBuilder();
ret.append(line);
while ((line = reader.readLine()) != null) {
ret.append('\n').append(line);
}
var4 = ret.toString();
return var4;
}
} catch (Exception var14) {
throw new RuntimeException(var14);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException var13) {
logger.error(var13.getMessage(), var13);
}
}
}
}
private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
if (queryParas != null && !queryParas.isEmpty()) {
StringBuilder sb = new StringBuilder(url);
boolean isFirst;
if (url.indexOf(63) == -1) {
isFirst = true;
sb.append('?');
} else {
isFirst = false;
}
String key;
String value;
for (Iterator var4 = queryParas.entrySet().iterator(); var4.hasNext(); sb.append(key).append('=').append(value)) {
Entry<String, String> entry = (Entry) var4.next();
if (isFirst) {
isFirst = false;
} else {
sb.append('&');
}
key = (String) entry.getKey();
value = (String) entry.getValue();
if (StringUtils.isNotBlank(value)) {
try {
value = URLEncoder.encode(value, CHARSET);
} catch (UnsupportedEncodingException var9) {
throw new RuntimeException(var9);
}
}
}
return sb.toString();
} else {
return url;
}
}
public static String readData(HttpServletRequest request) {
BufferedReader br = null;
try {
br = request.getReader();
String line = br.readLine();
if (line == null) {
return "";
} else {
StringBuilder ret = new StringBuilder();
ret.append(line);
while ((line = br.readLine()) != null) {
ret.append('\n').append(line);
}
return ret.toString();
}
} catch (IOException var4) {
throw new RuntimeException(var4);
}
}
/**
* @deprecated
*/
@Deprecated
public static String readIncommingRequestData(HttpServletRequest request) {
return readData(request);
}
private static class TrustAnyTrustManager implements X509TrustManager {
private TrustAnyTrustManager() {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
}
private static class TrustAnyHostnameVerifier implements HostnameVerifier {
private TrustAnyHostnameVerifier() {
}
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}