前台获取(code,ivData,encryptedData)以json的形式传到后台,因为较长的字符串中的“,”“+”号会在传参的过程中过滤掉

JSONArray jsonArry=JSONArray.fromObject(threedata);(取出必要的三个参数)

JSONObject jsonValue;

for(int i=0;i<jsonArry.size();i++){
        jsonValue = jsonArry.getJSONObject(i); 
        code = (String)jsonValue.get("code");
        ivData = (String)jsonValue.get("ivData");
        encryptedData = (String)jsonValue.get("encryptedData");

}

//授权(必填)       grant_type 为固定值
       String grant_type = "authorization_code";
        if (code == null || code.length() == 0) {
              return null;

}

1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
//请求参数
//appid小程序唯一标识   (在微信小程序管理后台获取)  , appsecret 小程序的 app secret (在微信小程序管理后台获取)
            String params = "appid=" + appid + "&secret=" + appsecret + "&js_code=" + code + "&grant_type=" + grant_type;
            //发送请求
            synchronized(this) {
            String sr = HttpRequestUtil.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();
            String result = AesCbcUtil.decrypt(encryptedData, session_key, ivData, "UTF-8").toString();
             if (null != result && result.length() > 0) {
                 JSONObject userInfoJSON = JSONObject.fromObject(result);
                  mobile = userInfoJSON.get("phoneNumber").toString();
             }

}

HttpRequestUtil类:

public class HttpRequestUtil {

public static void main(String[] args) {
        //发送 GET 请求
        String s=HttpRequestUtil.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o", "");
        System.out.println(s);

//        //发送 POST 请求
//        String sr=HttpRequestUtil.sendPost("http://www.toutiao.com/stream/widget/local_weather/data/?city=%E4%B8%8A%E6%B5%B7", "");
//        JSONObject json = JSONObject.fromObject(sr);
//        System.out.println(json.get("data"));
    }

/**
     * 向指定URL发送GET方法的请求
     * @param  url 发送请求的URL
     * @param  param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept","*/*");
            connection.setRequestProperty("connection","Keep-Alive");
            connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

/**
     * 向指定 URL 发送POST方法的请求
     * @param url 发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        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)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            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.out.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;
    }

}

AesCbcUtil类:

/**
 * AES-128-CBC 加密方式
 * 注:
 * AES-128-CBC可以自己定义“密钥”和“偏移量“。
 * AES-128是jdk自动生成的“密钥”。
 */
public class AesCbcUtil {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }

/**
     * AES解密
     *
     * @param data           //密文,被加密的数据
     * @param key            //秘钥
     * @param iv             //偏移量
     * @param encodingFormat //解密后的结果需要进行的编码
     * @return
     * @throws Exception
     */
    public static JSONObject decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
//        initialize();
        //被加密的数据
        byte[] dataByte = Base64.decodeBase64(data);
        //加密秘钥
        byte[] keyByte = Base64.decodeBase64(key);
        //偏移量
        byte[] ivByte = Base64.decodeBase64(iv);

try {
            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;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            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) {
//            解密后的值
                String result = new String(resultByte, "UTF-8");
//                return JSONObject.fromObject(result);
                return JSONObject.parseObject(result);
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidParameterSpecException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

}

小程序ASC解密(java)相关推荐

  1. java实现微信小程序加密数据解密的代码怎么写

    前言 微信小程序好坑啊!java明明是用户量最大的编程语言,可是都2021年了,他的小程序文档到现在都没有更新上java实现加密数据解密算法.... 微信小程序官方文档如下: 服务端获取开放数据 | ...

  2. JAVA 微信小程序AES解密数据 demo

    这个链接是官方文档的地址,但是demo下载中没有java的demo https://developers.weixin.qq.com/miniprogram/dev/framework/open-ab ...

  3. 微信小程序密文解密工具

    微信小程序密文解密工具 小程序对于敏感信息采用了加密,如果想得到明文必须解密,官方上提供了几种语言的demo,唯独没有java版的,这是在搞事情啊 因此在此提供一个java版的解密工具类 此工具类需要 ...

  4. 支付宝小程序授权登录 (Java 后台篇)

    支付宝小程序授权登录 (Java 后台篇) 开始 : 实现支付宝小程序授权登录功能, 本文主要是介绍支付宝小程序授权登录流程,与关键登录与处理代码. 流程 : 关键代码 : 1.获取用户信息 /*** ...

  5. 微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed

    微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed 参考文章: (1)微信小程序加密解密 C# 以及 ...

  6. Golang 微信小程序加密数据解密算法实现

    Go 语言 微信小程序加密数据解密算法实现 代码实现 本实现参考官方PHP例程实现,Go代码实现如下: func DecryptData (app_id, session_key, iv, encry ...

  7. 微信小程序商城 (后台JAVA)

    微信小程序商城(Java版) 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.4.1 1.3 shiro1.3.2 1.4 se ...

  8. 小程序加密解密完成版

    (仔细看,别慌,特别简单) 小程序项目中有个叫 utils 文件目录. 在utils中创建一个aes.js文件,然后从我的上一篇文章复制代码AES.JS并把内容复制进去即可. 在utils文件里面的 ...

  9. 小程序画布功能+JAVA用KUMO生成词云图片

    小程序画布功能+JAVA用KUMO生成词云图片 KUMO git地址:https://github.com/kennycason/kumo 原理:利用Kumo生成词云,并转换成64位传到小程序,小程序 ...

  10. 使用LINUX云服务器搭建web、小程序服务器MySql+Java+Tomcat

    记小白第一次使用LINUX搭建web.小程序服务器 MySql+Java+Tomcat (很全的安装过程收集整合) 一.使用LINUX搭建服务器的原因 准备工具 二.下载配置 2.1 阿里云服务器的购 ...

最新文章

  1. apache的keepalive和keepalivetimeout(apache优化)
  2. IC卡读卡器web开发,支持IE,Chrome,Firefox,Safari,Opera等主流浏览 器
  3. 2016年华为网络技术精英大赛复赛试题
  4. 今天完成任务之SQL中len的使用
  5. Qt+ArcGIS Engine 10.1 开发(一)
  6. Xcode 静态库调试策略
  7. 招投标相关法律及条例
  8. linux人工智能识别停车牌,一种人工智能车牌识别停车场收费装置的制作方法
  9. 小白开始学RTOS 1
  10. linux笔记本 亮度调节,Ubuntu Linux笔记本屏幕背光亮度调节
  11. 飞机加油游戏 --- 我的易术
  12. VC,Http库(get,post,upload(File))
  13. 小程序组件库ColorUI的使用,一键复制粘贴
  14. mysql中的汉字怎么转换_Mysql中文汉字转拼音的实现(每个汉字转换全拼)
  15. Python爬虫实战(3):安居客房产经纪人信息采集
  16. 第二十三章:面向对象(3)
  17. (ISC)² 2021年会暨网络安全峰会
  18. MIT线性代数笔记九 线性无关,基和维度
  19. Java web应用中如何判断Web容器类型
  20. React入门小册(三)组件

热门文章

  1. 宝塔面板修改端口号无法登陆解决方案
  2. C语言打印斐波那契数列
  3. 【前端】相信你会用到的一篇笔记---HTML篇
  4. python3安装pymysql_ubuntu16.04 python3安装pymysql错误
  5. java判断字符串不为空_Java判断字符串是否为空的方法
  6. python数据库教程_python使用mysql操作教程
  7. 网络中的一些专业名词解释
  8. thinkcmf5调用指定分类的二级_Mybatis一二级缓存的使用和实现原理
  9. iphone已停用怎么解锁_iPhone锁屏密码忘记了怎么办?维修店老板说出了绝招
  10. 【UVA11059】Maximum Product(set+set默认从大到小排列---水题)