2023年6月28日发(作者:)
微信⼩程序登录状态java后台解密⼀、登录流程图⼆、微信⼩程序端doLogin:function(callback = () =>{}){let that = this;({ success:function(loginRes){ if(loginRes){ //获取⽤户信息 rInfo({ withCredentials:true,//⾮必填 默认为true success:function(infoRes){ (infoRes,'>>>'); //请求服务端的登录接⼝ t({ url: rl, data:{ code:,//临时登录凭证 rawData:a,//⽤户⾮敏感信息 signature:ure,//签名 encrypteData:tedData,//⽤户敏感信息 iv://解密算法的向量 }, success:function(res){ ('login success'); res = ; if(==0){ fo = fo; rageSync('userInfo',ify(fo)); rageSync('loginFlag',); ("skey="+); callback(); }else{ fo(''); } }, fail:function(error){ //调⽤服务端登录接⼝失败 // fo('调⽤接⼝失败'); (error); } }); } }); }else{ } }});}微信⼩程序端发起登录请求,携带的参数主要有:code:,//临时登录凭证rawData:a,//⽤户⾮敏感信息signature:ure,//签名encrypteData:tedData,//⽤户敏感信息iv://解密算法的向量需要的数据主要有:result、userInfo和skeyresult⽤来判断是否登录成功,userInfo是⽤户的⼀些信息,保存在缓存中,不⽤每次都从后台获取,skey是⽤户登录态标识,也放在缓存中,如果skey存在就直接登录,维护⽤户的登录状态,具有时效性三、Java后台@ResponseBody@RequestMapping("/login")public Map doLogin(Model model, @RequestParam(value = "code",required = false) String code, @RequestParam(value = "rawData",required = false) String rawData, @RequestParam(value = "signature",required = false) String signature, @RequestParam(value = "encrypteData",required = false) String encrypteData, @RequestParam(value = "iv",required = false) String iv){ ( "Start get SessionKey" ); Map map = new HashMap( ); n("⽤户⾮敏感信息"+rawData); JSONObject rawDataJson = bject( rawData ); n("签名"+signature); JSONObject SessionKeyOpenId = getSessionKeyOrOpenId( code ); n("post请求获取的SessionAndopenId="+SessionKeyOpenId); String openid = ing("openid" ); String sessionKey = ing( "session_key" ); n("openid="+openid+",session_key="+sessionKey); User user = Openid( openid ); //uuid⽣成唯⼀key String skey = UUID().toString(); if(user==null){ //⼊库 String nickName = ing( "nickName" ); String avatarUrl = ing( "avatarUrl" ); String gender = ing( "gender" ); String city = ing( "city" ); String country = ing( "country" ); String province = ing( "province" ); user = new User(); ( openid ); ateTime( new Date( ) ); sionkey( sessionKey ); lance( 0 ); y( skey ); dress( country+" "+province+" "+city ); atar( avatarUrl ); nder( nt( gender ) ); me( nickName ); ateTime( new Date( ) ); ( user ); }else { //已存在 ( "⽤户openid已存在,不需要插⼊" ); } //根据openid查询skey是否存在 String skey_redis = (String) Value().get( openid ); if(lank( skey_redis )){ //存在 删除 skey 重新⽣成skey 将skey返回 ( skey_redis ); } // 缓存⼀份新的 JSONObject sessionObj = new JSONObject( ); ( "openId",openid ); ( "sessionKey",sessionKey ); Value().set( skey,String() ); Value().set( openid,skey ); //把新的sessionKey和oppenid返回给⼩程序 ( "skey",skey ); ( "result","0" ); JSONObject userInfo = getUserInfo( encrypteData, sessionKey, iv ); n("根据解密算法获取的userInfo="+userInfo); ( "balance",lance() ); ( "userInfo",userInfo ); return map;}获取openid和sessionKey⽅法public static JSONObject getSessionKeyOrOpenId(String code){ //微信端登录code String wxCode = code; String requestUrl = "/sns/jscode2session"; Map requestUrlParam = new HashMap( ); ( "appid","你的⼩程序appId" );//⼩程序appId ( "secret","你的⼩程序appSecret" ); ( "js_code",wxCode );//⼩程序端返回的code ( "grant_type","authorization_code" );//默认参数 //发送post请求读取调⽤微信接⼝获取openid⽤户唯⼀标识 JSONObject jsonObject = bject( st( requestUrl,requestUrlParam )); return jsonObject;}解密⽤户敏感数据获取⽤户信息public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){ // 被加密的数据 byte[] dataByte = (encryptedData); // 加密秘钥 byte[] keyByte = (sessionKey); // 偏移量 byte[] ivByte = (iv); try { // 如果密钥不⾜16位,那么就补⾜. 这个if 中的内容很重要 int base = 16; if ( % base != 0) { int groups = / base + ( % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; (temp, (byte) 0); opy(keyByte, 0, temp, 0, ); keyByte = temp; } // 初始化 vider(new BouncyCastleProvider()); Cipher cipher = tance("AES/CBC/PKCS7Padding","BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = tance("AES"); (new IvParameterSpec(ivByte)); ( T_MODE, spec, parameters);// 初始化 byte[] resultByte = l(dataByte); if (null != resultByte && > 0) { String result = new String(resultByte, "UTF-8"); return bject(result); } } catch (NoSuchAlgorithmException e) { (sage(), e); } catch (NoSuchPaddingException e) { (sage(), e); } catch (InvalidParameterSpecException e) { (sage(), e); } catch (IllegalBlockSizeException e) { (sage(), e); } catch (BadPaddingException e) { (sage(), e); } catch (UnsupportedEncodingException e) { (sage(), e); } catch (InvalidKeyException e) { (sage(), e); } catch (InvalidAlgorithmParameterException e) { (sage(), e); } catch (NoSuchProviderException e) { (sage(), e); } return null;}四、流程1.⼩程序端发起请求并携带主要参数后台接到/login请求后,根据code去调⽤微信接⼝获取⽤户唯⼀标识openid和sessionKey3.根据openid查询mysql数据库,判断该⽤户是否存在,如果不存在将⽤户⾮敏感信息和其他初始化数据存⼊到数据库中,如果已存在,不操作4.根据openid查询redis数据库,判断openid对应的skey是否存在,如果存在则删除原来⽼的skey以及对应的openid和sessionKey5.通过uuid⽣成唯⼀的skey,⽤openid做键,skey做值,存⼊到redis中6.然后把skey做键,openid和sessionKey的json串做值也重新存⼊到redis中7.根据解密算法,参数有encryptedData、sessionKey和iv,获取⽤户信息userInfo,如果userInfo字段不满⾜需要,可通过( “balance”,lance() );添加所需要的字段和值8.将微信⼩程序需要的数据封装到map中,返回给⼩程序端( "skey",skey );( "result","0" );( "userInfo",userInfo );
return map;以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1687893803a54595.html
评论列表(0条)