微信小程序后臺解密用戶數據實例詳解
微信小程序API文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html
openId : 用戶在當前小程序的唯一標識
因為最近根據API調用https://api.weixin.qq.com/sns/jscode2session所以需要配置以下服務,但是官方是不贊成這種做法的,
而且最近把在服務器配置的方法給關閉了。也就是說要獲取用戶openid,地區等信息只能在后臺獲取。
一下是官方的流程
那么問題來了,代碼怎么實現呢,以下是用java后臺的實現
微信客戶端的代碼實現是這樣的
wx.login({ success: function (r) { if (r.code) { var code = r.code;//登錄憑證 if (code) { //2、調用獲取用戶信息接口 wx.getUserInfo({ success: function (res) { //發起網絡請求 wx.request({ url: that.data.net + '/decodeUser.json', header: { "content-type": "application/x-www-form-urlencoded" }, method: "POST", data: { encryptedData: res.encryptedData, iv: res.iv, code: code }, success: function (result) { // wx.setStorage({ // key: 'openid', // data: res.data.openid, // }) console.log(result) } }) }, fail: function () { console.log('獲取用戶信息失敗') } }) } else { console.log('獲取用戶登錄態失敗!' + r.errMsg) } } else { } } }) (服務端 java)自己的服務器發送code到微信服務器獲取openid(用戶唯一標識)和session_key(會話密鑰),
最后將encryptedData、iv、session_key通過AES解密獲取到用戶敏感數據
1、獲取秘鑰并處理解密的controller
/** * 解密用戶敏感數據 * * @param encryptedData 明文,加密數據 * @param iv 加密算法的初始向量 * @param code 用戶允許登錄后,回調內容會帶上 code(有效期五分鐘),開發者需要將 code 發送到開發者服務器后臺,使用code 換取 session_key api,將 code 換成 openid 和 session_key * @return */ @ResponseBody @RequestMapping(value = "/decodeUser", method = RequestMethod.POST) public Map decodeUser(String encryptedData, String iv, String code) { Map map = new HashMap(); //登錄憑證不能為空 if (code == null || code.length() == 0) { map.put("status", 0); map.put("msg", "code 不能為空"); return map; } //小程序唯一標識 (在微信小程序管理后臺獲取) String wxspAppid = "wxd8980e77d335c871"; //小程序的 app secret (在微信小程序管理后臺獲取) String wxspSecret = "85d29ab4fa8c797423f2d7da5dd514cf"; //授權(必填) String grant_type = "authorization_code"; //////////////// 1、向微信服務器 使用登錄憑證 code 獲取 session_key 和 openid //////////////// //請求參數 String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type; //發送請求 String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params); //解析相應內容(轉換成json對象) JSONObject json = JSONObject.fromObject(sr); //獲取會話密鑰(session_key) String session_key = json.get("session_key").toString(); //用戶的唯一標識(openid) String openid = (String) json.get("openid"); //////////////// 2、對encryptedData加密數據進行AES解密 //////////////// try { String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8"); if (null != result && result.length() > 0) { map.put("status", 1); map.put("msg", "解密成功"); JSONObject userInfoJSON = JSONObject.fromObject(result); Map userInfo = new HashMap(); userInfo.put("openId", userInfoJSON.get("openId")); userInfo.put("nickName", userInfoJSON.get("nickName")); userInfo.put("gender", userInfoJSON.get("gender")); userInfo.put("city", userInfoJSON.get("city")); userInfo.put("province", userInfoJSON.get("province")); userInfo.put("country", userInfoJSON.get("country")); userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl")); userInfo.put("unionId", userInfoJSON.get("unionId")); map.put("userInfo", userInfo); return map; } } catch (Exception e) { e.printStackTrace(); } map.put("status", 0); map.put("msg", "解密失敗"); return map; }
新聞熱點
疑難解答