有关小程序的JAVA后台解密encryptedData获取openid及用户信息

先贴上工具类,可获取openid及session_key,session_key在解密时会用到,这里还需要用到几个jar包

**bouncycastle-jce-jdk13-112.jar**

**xfire-core-1.2.6.jar**

百度搜一下就有

如果使用maven可以采用以下方法引入

<dependency>

  <groupId>bouncycastle</groupId>

  <artifactId>bouncycastle-jce-jdk13</artifactId>

  <version>112</version>

</dependency>

<dependency>

<groupId>org.codehaus.xfire</groupId>

<artifactId>xfire-core</artifactId>

<version>1.2.6</version>

</dependency>


GetOpenid.java获取信息工具类

```

package com.hongbao.utils;

import java.io.UnsupportedEncodingException;

import java.security.AlgorithmParameters;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.Security;

import java.security.spec.InvalidParameterSpecException;

import java.util.Arrays;

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 org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.codehaus.xfire.util.Base64;

import net.sf.json.JSONObject;

/**

*

* @author silen

* 获取微信信息工具类

*/

public class GetOpenid {

String appid = "wxd81c8f4c18******";

String secret = "7bebc83146c9979ce08d22f244******";

//可获取openid及session_key,其实这里openid不需要获取,encryptedData解密后包含openid

public String get(String js_code) throws Exception {

//官方接口,需要自己提供appid,secret和js_code

String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+js_code+"&grant_type=authorization_code";

//HttpRequestor是一个网络请求工具类,贴在了下面

String oppid = new HttpRequestor().doGet(requestUrl);

JSONObject oppidObj = JSONObject.fromObject(oppid);

String openid = (String) oppidObj.get("openid");

String session_key = (String) oppidObj.get("session_key");

return session_key;

}

/**

* 获取信息

    */

    public JSONObject getUserInfo(String encryptedData,String sessionkey,String iv){

        // 被加密的数据

        byte[] dataByte = Base64.decode(encryptedData);

        // 加密秘钥

        byte[] keyByte = Base64.decode(sessionkey);

        // 偏移量

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

        try {

              // 如果密钥不足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;

            }

            // 初始化

            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);

            }

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        } catch (InvalidParameterSpecException e) {

            e.printStackTrace();

        } catch (IllegalBlockSizeException e) {

            e.printStackTrace();

        } catch (BadPaddingException e) {

            e.printStackTrace();

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        } catch (InvalidKeyException e) {

            e.printStackTrace();

        } catch (InvalidAlgorithmParameterException e) {

            e.printStackTrace();

        } catch (NoSuchProviderException e) {

            e.printStackTrace();

        }

        return null;

    }

}

```

网络请求工具类,在使用官方提供的接口获取信息的时候使用,在上面的类中已经有使用方法,很简单

HttpRequestor.java

```

package com.hongbao.utils;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.InetSocketAddress;

import java.net.Proxy;

import java.net.URL;

import java.net.URLConnection;

import java.util.Iterator;

import java.util.Map;

public class HttpRequestor {

    private String charset = "utf-8";

        private Integer connectTimeout = null;

        private Integer socketTimeout = null;

        private String proxyHost = null;

        private Integer proxyPort = null;


        /**

        * Do GET request

        * @param url

        * @return

        * @throws Exception

        * @throws IOException

        */

        public String doGet(String url) throws Exception {


            URL localURL = new URL(url);


            URLConnection connection = openConnection(localURL);

            HttpURLConnection httpURLConnection = (HttpURLConnection)connection;


            httpURLConnection.setRequestProperty("Accept-Charset", charset);

            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


            InputStream inputStream = null;

            InputStreamReader inputStreamReader = null;

            BufferedReader reader = null;

            StringBuffer resultBuffer = new StringBuffer();

            String tempLine = null;


            if (httpURLConnection.getResponseCode() >= 300) {

                throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());

            }


            try {

                inputStream = httpURLConnection.getInputStream();

                inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

                reader = new BufferedReader(inputStreamReader);


                while ((tempLine = reader.readLine()) != null) {

                    resultBuffer.append(tempLine);

                }


            } finally {


                if (reader != null) {

                    reader.close();

                }


                if (inputStreamReader != null) {

                    inputStreamReader.close();

                }


                if (inputStream != null) {

                    inputStream.close();

                }


            }

            return resultBuffer.toString();

        }


        /**

        * Do POST request

        * @param url

        * @param parameterMap

        * @return

        * @throws Exception

        */

        public String doPost(String url, Map parameterMap) throws Exception {


            /* Translate parameter map to parameter date string */

            StringBuffer parameterBuffer = new StringBuffer();

            if (parameterMap != null) {

                Iterator iterator = parameterMap.keySet().iterator();

                String key = null;

                String value = null;

                while (iterator.hasNext()) {

                    key = (String)iterator.next();

                    if (parameterMap.get(key) != null) {

                        value = (String)parameterMap.get(key);

                    } else {

                        value = "";

                    }


                    parameterBuffer.append(key).append("=").append(value);

                    if (iterator.hasNext()) {

                        parameterBuffer.append("&");

                    }

                }

            }


            System.out.println("POST parameter : " + parameterBuffer.toString());


            URL localURL = new URL(url);


            URLConnection connection = openConnection(localURL);

            HttpURLConnection httpURLConnection = (HttpURLConnection)connection;


            httpURLConnection.setDoOutput(true);

            httpURLConnection.setRequestMethod("POST");

            httpURLConnection.setRequestProperty("Accept-Charset", charset);

            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));


            OutputStream outputStream = null;

            OutputStreamWriter outputStreamWriter = null;

            InputStream inputStream = null;

            InputStreamReader inputStreamReader = null;

            BufferedReader reader = null;

            StringBuffer resultBuffer = new StringBuffer();

            String tempLine = null;


            try {

                outputStream = httpURLConnection.getOutputStream();

                outputStreamWriter = new OutputStreamWriter(outputStream);


                outputStreamWriter.write(parameterBuffer.toString());

                outputStreamWriter.flush();


                if (httpURLConnection.getResponseCode() >= 300) {

                    throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());

                }


                inputStream = httpURLConnection.getInputStream();

                inputStreamReader = new InputStreamReader(inputStream);

                reader = new BufferedReader(inputStreamReader);


                while ((tempLine = reader.readLine()) != null) {

                    resultBuffer.append(tempLine);

                }


            } finally {


                if (outputStreamWriter != null) {

                    outputStreamWriter.close();

                }


                if (outputStream != null) {

                    outputStream.close();

                }


                if (reader != null) {

                    reader.close();

                }


                if (inputStreamReader != null) {

                    inputStreamReader.close();

                }


                if (inputStream != null) {

                    inputStream.close();

                }


            }

            return resultBuffer.toString();

        }

        private URLConnection openConnection(URL localURL) throws IOException {

            URLConnection connection;

            if (proxyHost != null && proxyPort != null) {

                Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));

                connection = localURL.openConnection(proxy);

            } else {

                connection = localURL.openConnection();

            }

            return connection;

        }


        /**

        * Render request according setting

        * @param request

        */

        private void renderRequest(URLConnection connection) {


            if (connectTimeout != null) {

                connection.setConnectTimeout(connectTimeout);

            }


            if (socketTimeout != null) {

                connection.setReadTimeout(socketTimeout);

            }


        }

        /*

        * Getter & Setter

        */

        public Integer getConnectTimeout() {

            return connectTimeout;

        }

        public void setConnectTimeout(Integer connectTimeout) {

            this.connectTimeout = connectTimeout;

        }

        public Integer getSocketTimeout() {

            return socketTimeout;

        }

        public void setSocketTimeout(Integer socketTimeout) {

            this.socketTimeout = socketTimeout;

        }

        public String getProxyHost() {

            return proxyHost;

        }

        public void setProxyHost(String proxyHost) {

            this.proxyHost = proxyHost;

        }

        public Integer getProxyPort() {

            return proxyPort;

        }

        public void setProxyPort(Integer proxyPort) {

            this.proxyPort = proxyPort;

        }

        public String getCharset() {

            return charset;

        }

        public void setCharset(String charset) {

            this.charset = charset;

        }

}

```

controller,这里就是工具类的使用方法了,没什么难度,简单的调用

```

// 获取信息

@ResponseBody

@RequestMapping("getOpenid")

public void getOpenid(HttpServletRequest request,

HttpServletResponse response) throws Exception {

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

//需要使用小程序传过来的js_code获取session_key

String js_code = request.getParameter("js_code");

//这个就是要解密的东西--用户敏感信息加密数据

String encryptedData = request.getParameter("encryptedData");

//加密算法的初始向量

String iv = request.getParameter("iv");

//调用工具类中获取session_key的方法

String sessionkey = new GetOpenid().get(js_code);

//调用工具类中的解密方法,然后返回给小程序就OK了

JSONObject obj = new GetOpenid().getUserInfo(encryptedData, sessionkey,

iv);

Gson gson = new Gson();

String json = gson.toJson(obj);

PrintWriter pw = response.getWriter();

pw.write(json);

pw.close();

}

```

最后是小程序端的请求代码

```

var that = this

    wx.login({

      success: function (res) {

        if (res.code) {

          wx.getUserInfo({

            success: datas => {

              wx.request({

                url: that.baseurl + 'getOpenid',

                data: {

                  js_code: res.code,

                  encryptedData: datas.encryptedData,

                  iv: datas.iv

                },

                header: {

                  'content-type': 'application/json'

                },

                success: function (e) {

                  console.log(e.data)

                }

              })

            }

          })

        }

        else {

          console.log('获取用户登录态失败!' + res.errMsg)

        }

      }

    })

```

大功告成!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352