获得session_key和openId(加解密、签名系列)

2020-08-05  本文已影响0人  蛋皮皮652

微信小程序免登录的验证步骤

验证步骤:

1.首先获取微信的unionId

2.通unionId查询账户。

3.如果查询到,则生成token返回给 小程序 (新增账户信息也要返回过去)

4.如果没有查询到,则将状态码 变成false 返回。  让小程序跳到绑定账号页面

以下是接口中具体的操作步骤:

1.调用wx.login()接口就可获取登录凭证(js_code)

2.去微信公众平台查看appid和appsecret

3.利用以下链接替换appid,secret,js_code后调用即可获取

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

写一个接口执行小程序免登录状态

传参 code,通过1获取的js_code,

encryptedData  敏感数据在内的完整用户信息的加密数据

iv   偏移量

通过解密算法即可获取如下数据

将你需要的数据set到你的返回实体中就可以了

以下是解密工具类的具体实现

/**

* @Author: wuyue

* @Date: 2020/8/3 18:20

* AES-128-CBC 加密方式

* 注:

* AES-128-CBC可以自己定义“密钥”和“偏移量“。

* AES-128是jdk自动生成的“密钥”。

*/

public class AesCbcUtil {

static {

//BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/

        Security.addProvider(new BouncyCastleProvider());

    }

/**

    * AES解密

    *

    * @param data      //密文,被加密的数据

    * @param key      //秘钥

    * @param iv      //偏移量

    * @param encodingFormat //解密后的结果需要进行的编码

    * @return

    * @throws Exception

*/

    public static Stringdecrypt(String data, String key, String iv, String encodingFormat)throws Exception {

//    initialize();

        String result ="";

        //被加密的数据

        byte[] dataByte = Base64.decodeBase64(data);

        //加密秘钥

        byte[] keyByte = Base64.decodeBase64(key);

        //偏移量

        byte[] ivByte = Base64.decodeBase64(iv);

        // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要

        int base =16;

        if (keyByte.length % base !=0) {

int groups = keyByte.length / base + (keyByte.length % base !=0 ?1 :0);

            byte[] temp =new byte[groups * base];

            Arrays.fill(temp, (byte)0);

            System.arraycopy(keyByte, 0, temp, 0, keyByte.length);

            keyByte = temp;

        }

// 初始化

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");

        SecretKeySpec spec =new SecretKeySpec(keyByte, "AES");

        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");

        parameters.init(new IvParameterSpec(ivByte));

        // 初始化

        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);

        byte[] resultByte = cipher.doFinal(dataByte);

        if (null != resultByte && resultByte.length >0) {

result =new String(resultByte, "UTF-8");

        }

return result;

    }

具体调用方法

喜欢请微信扫码关注公众号

上一篇下一篇

猜你喜欢

热点阅读