獲取用戶信息有兩種,一種是獲取用戶的基本信息(用戶名稱,圖像等),另一種是獲取用戶在微信中的詳細信息(openId等)
首先要有小程序的appId和secret
第一種:wx.getUserInfo獲取用戶基本信息
wx.getUserInfo({
success: function (res) {
that.setData({
nickName: res.userInfo.nickName,
avatarUrl: res.userInfo.avatarUrl,
})
},
})
第二種:wx.login獲取用戶信息
調用接口獲取登錄憑證code(有效期五分鐘)。通過憑證進而換取用戶登錄態信息,包括用戶的唯一標識(openid)及本次登錄的會話密鑰(session_key)等。用戶數據的加解密通訊需要依賴會話密鑰完成
在login獲取到code,然後發送到開發者後端,
後端再通過接口去微信後端換取到openid和sessionKey,如果小程序綁定公衆平臺就會將用戶的唯一標識
unionid一併返回之後(用戶在公衆平臺關聯的賬號內unionid不變),
然後把3rd_session返回給前端,
就已經完成登錄行爲。而login行爲是靜默,不必授權的,不會對用戶造成騷擾。
getUserInfo只是爲了提供更優質的服務而存在,
比如展示頭像暱稱,判斷性別,通過unionId和其他公衆號上已有的用戶畫像結合起來提供歷史數據。
所以不必在剛剛進入小程序的時候就強制要求授權。
wx.login({
success (res) {
if (res.code) {//登錄憑證code
wx.getUserInfo({
success: function(res2) {
wx.request({
//後臺接口地址
url: 'https://....com/wx/login',
data: {
code: res.code,
encryptedData: res2.encryptedData,
iv: res2.iv
},
method: 'GET',
header: {
'content-type': 'application/json'
},
success: function (res) {
that.setData({
nickName: res.data.nickName,//用戶名稱
avatarUrl: res.data.avatarUrl,//用戶圖像
})
wx.setStorageSync('openId', res.data.openId);//用戶唯一標識openId
}
})
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
後臺請求:
package com.deshangshidai.utils;
import java.security.spec.AlgorithmParameterSpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.lang3.StringUtils;
import org.apache.xerces.impl.dv.util.Base64;
import org.json.JSONObject;
import com.deshangshidai.redis.RedisUtils;
/**
* <p>Title: WxxcxUtils</p>
* <p>Description: </p>
* @author kq
* @date 2019年3月8日
*/
public class WxxcxUtils {
private static String APP_ID=appid; //小程序appid
private static String SECRET=secret;//小程序secret
public static Map<String,String> getOpenId(String code){
if(StringUtils.isBlank(code)){
return null;
}
String url="https://api.weixin.qq.com/sns/jscode2session?appid="+APP_ID+"&secret="+SECRET+"&js_code="+code+"&grant_type=authorization_code";
String result=HttpUtil.GetContentByGet(url);
JSONObject jo=new JSONObject(result);
Map<String,String> m=new HashMap<String,String>();
m.put("unionid", jo.getString("unionid"));
m.put("openid", jo.getString("openid"));
if(StringUtils.isNotBlank(jo.getString("session_key"))){
RedisUtils.set(jo.getString("openid"), jo.getString("session_key"), RedisUtils.EXRP_YEAR);
}
return m;
}
public static Map<String,String> deciphering(String encrypdata,String ivdata, String openId) {
String encryp=encrypdata.replace("%2B","+");
String iv=ivdata.replace("%2B","+");
String keyvul=RedisUtils.get(openId);
String key=keyvul.replace("%2B","+");
byte[] encrypData = Base64.decode(encryp);
byte[] ivData = Base64.decode(iv);
byte[] sessionKey = Base64.decode(key);
String str="";
try {
str = decrypt(sessionKey,ivData,encrypData);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
if(StringUtils.isBlank(str)){
return null;
}
JSONObject jo=new JSONObject(str);
Map<String,String> m=new HashMap<String,String>();
m.put("phone", jo.getString("phoneNumber"));
return m;
}
public static String decrypt(byte[] key, byte[] iv, byte[] encData) throws Exception {
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
return new String(cipher.doFinal(encData),"UTF-8");
}
}
工具類
package com.deshangshidai.utils;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.StringUtils;
/**
* http 助手類
* @author Administrator
*
*/
//@Deprecated
public class HttpUtil {
private static final String encoding = "UTF-8";
@SuppressWarnings("finally")
/**
* http get
* @param tagUrl 目標地址+參數 K=v&K=v
* @return
*/
public static String GetContentByGet(String tagUrl) {
StringBuffer sbf = new StringBuffer();
try {
URL url = new URL(tagUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type","application/json");
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String lines;
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), encoding);
sbf.append(lines);
}
reader.close();
// 斷開連接
connection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
return e.getMessage();
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
} finally {
return sbf.toString();
}
}
/**
* http post
* @param tagUrl 目標地址
* @param parms 參數模型
* @return
*/
@Deprecated
@SuppressWarnings({ "finally", "deprecation" })
public static String GetContentByPost(String tagUrl,Object parms) {
StringBuffer sbf = new StringBuffer();
try {
URL url = new URL(tagUrl);
String jsonParms = JsonUtils.stringify(parms);
byte[] data = jsonParms.getBytes(encoding);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("Content-Type","application/json");
//添加請求超時限制
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
connection.connect();
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.write(data);
out.flush();
out.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String lines;
while ((lines = reader.readLine()) != null) {
lines = new String(lines.getBytes(), encoding);
sbf.append(lines);
}
reader.close();
// 斷開連接
connection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
return e.getMessage();
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
} finally {
return sbf.toString();
}
}
/**
* http post
* @param url 目標地址
* @param paramMap 請求參數
* @return
*/
public static String sendPost(String url, Map<String, String> paramMap) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打開和URL之間的連接
URLConnection conn = realUrl.openConnection();
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Charset", "UTF-8");
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
// 設置請求屬性
String param = "";
if (paramMap != null && paramMap.size() > 0) {
Iterator<String> ite = paramMap.keySet().iterator();
while (ite.hasNext()) {
String key = ite.next();// key
String value = paramMap.get(key);
param += key + "=" + value + "&";
}
param = param.substring(0, param.length() - 1);
}
// 發送請求參數
out.print(param);
// flush輸出流的緩衝
out.flush();
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.err.println("發送 POST 請求出現異常!" + e);
e.printStackTrace();
}
// 使用finally塊來關閉輸出流、輸入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
json和對象之間的轉換類
package com.deshangshidai.utils;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.springframework.core.annotation.AnnotationUtils;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
public class JsonUtils {
private static Log log = LogFactory.getLog(JsonUtils.class);
private static ObjectMapper objectMapper = null;
static {
objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setFilters(new SimpleFilterProvider().setFailOnUnknownId(false));
}
public static String stringify(Object object) {
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
public static String stringify(Object object, String... properties) {
try {
return objectMapper.writer(new SimpleFilterProvider().addFilter(AnnotationUtils.getValue(AnnotationUtils.findAnnotation(object.getClass(),JsonFilter.class)).toString(), SimpleBeanPropertyFilter.filterOutAllExcept(properties))).writeValueAsString(object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
public static void stringify(OutputStream out, Object object) {
try {
objectMapper.writeValue(out, object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public static void stringify(OutputStream out, Object object,String... properties) {
try {
objectMapper.writer(new SimpleFilterProvider().addFilter(AnnotationUtils.getValue(AnnotationUtils.findAnnotation(object.getClass(),JsonFilter.class)).toString(), SimpleBeanPropertyFilter.filterOutAllExcept(properties))).writeValue(out, object);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
/**
* json轉對象
* @param json
* @param clazz
* @return
*/
public static <T> T parse(String json, Class<T> clazz) {
if (json == null || json.length() == 0) {
return null;
}
try {
return objectMapper.readValue(json, clazz);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
}
這樣就獲取到了用戶的信息