小程序獲取用戶信息

獲取用戶信息有兩種,一種是獲取用戶的基本信息(用戶名稱,圖像等),另一種是獲取用戶在微信中的詳細信息(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;
	}

}

這樣就獲取到了用戶的信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章