zoukankan      html  css  js  c++  java
  • 小程序之~微信登录后台代码

      //需要一个工具类来进行加解密
        package com.login.util;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    import java.security.spec.InvalidParameterSpecException;
    
    /**
     * Created by yfs on 2017/2/6.
     * <p>
     * AES-128-CBC 加密方式 注: AES-128-CBC可以自己定义“密钥”和“偏移量“。 AES-128是jdk自动生成的“密钥”。
     */
    public class AesCbcUtil {
    
        static {
            // BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/
            // 需要在pom定义版本
            /*
             * <dependency> <groupId>org.bouncycastle</groupId>
             * <artifactId>bcprov-jdk16</artifactId> <version>1.46</version>
             * </dependency>
             * 
             */
            Security.addProvider(new BouncyCastleProvider());
        }
    
        /**
         * AES解密
         *
         * @param data
         *            //密文,被加密的数据
         * @param key
         *            //秘钥
         * @param iv
         *            //偏移量
         * @param encodingFormat
         *            //解密后的结果需要进行的编码
         * @return
         * @throws Exception
         */
        public static String 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 {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    
                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, encodingFormat);
                    return result;
                }
                return null;
            } 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;
        }
    
    }
    //登录接口实现
    package cn.guddqs.wxmini.controller;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.login.util.AesCbcUtil;
    
    import cn.guddqs.wxmini.entity.User;
    import net.sf.json.JSONObject;
    
    @Controller
    public class LoginController {
        public static String GETlogin(String u) {
            String result = "";
            BufferedReader in = null;
    
            try {
    
                URL realUrl = new URL(u);
                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));
                }
    
                in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送GET请求失败");
                e.printStackTrace();
            } finally {
                try {
                    if (in != null) {
                        in.close();
    
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
    
            return result;
    
        }
    
        @ResponseBody
        @RequestMapping("/login")
        public Map<String, String> addr_getList(String encryptedData, String iv, String code) {
    
            Map map = new HashMap<>();
    
            if (code == null || code.length() == 0) {
    
                map.put("status", 0);
                map.put("msg", "code是空的");
                // System.out.println("code" + code);
                return map;
            }
    
            System.out.println(code);
            String wxappid = "**********************";
            String wxSecret = "***************************";
            String grant_type = "authorization_code";
    
            String u = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" + wxappid + "&secret=" + wxSecret
                    + "&js_code=" + code + "&grant_type=" + grant_type;
            ;
            String s = LoginController.GETlogin(u);
                //将这个拼接出来的url打印出来看一下
            System.out.println(u);
    
            JSONObject json = JSONObject.fromObject(s);
    
            System.out.println("这里是openid和session_key" + json);
            String session_key = (String) json.get("session_key");
            String openid = (String) json.get("openid");
    
            try {
                System.out.println("进入解密成功程序");
                String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "utf-8");
                //JSONObject jsonObject = JSONObject.fromObject(result);
                System.out.println(result.length()+"wdsaxsadsadsadsa");
                 if (null != result && result.length() > 0) {
                    map.put("status", 1);
                    map.put("msg", "解密成功");
                    HashMap userinfo = new HashMap<>();
                    userinfo.put("openid", json.get("openid"));
                    userinfo.put("session_key", json.get("session_key"));
                    map.put("userInfo", userinfo);
                }
    
            } catch (Exception e) {
                System.out.println("解密失败");
            }
    
    
            return map;
    
        }
    
    }
    
    /**
    *   基于java ssm框架,需要的jar包可以在网上找到
    */
  • 相关阅读:
    求教——使用node做表单,刷新浏览器页面,浏览器为什么会重复提交上次所填的信息
    sublime 插件
    h5专题应该兼容那些浏览器?
    省市区县镇级联数据JS版
    使用 iscroll 实现焦点图无限循环
    DAO与DTO的区别
    Struts2的DMI的开启方法
    在JSP中的java代码中调用js代码
    Eclipse发布web项目时报错:Multiple Contexts have a path of "/xxx".
    记录:将MyEclipse的Dynamic Web Project项目部署到Eclipse的过程
  • 原文地址:https://www.cnblogs.com/Darkqueen/p/9597142.html
Copyright © 2011-2022 走看看