找回密码
 立即注册

QQ登录

只需一步,快速开始

微信小程序+java后台实现openid获取

[复制链接]
查看: 77|回复: 2
最佳答案
0 

3

主题

13

帖子

120

积分

新人求带

积分
120
写了好一阵子终于把微信小程序的登陆功能实现了,之前就因为返回openid耽误了好一段时间,所以今天就跟大家分享一下java后台的返回openid及解密用户信息。

微信小程序前端:

js页面:
  1.    wx.login({
  2.       success: function (res) {
  3.         var code = res.code;//登录凭证
  4.         if (code) {
  5.           //2、调用获取用户信息接口
  6.           wx.getUserInfo({
  7.             success: function (res) {
  8.               console.log({ encryptedData: res.encryptedData, iv: res.iv, code: code })
  9.               //3.请求自己的服务器,解密用户信息 获取unionId等加密信息
  10.               wx.request({
  11.                 url: 'http://域名/**.action',//自己的服务接口地址
  12.                 method: 'get',
  13.                 header: {
  14.                   "Content-Type": "applciation/json"
  15.                 },
  16.                 data: { encryptedData: res.encryptedData, iv: res.iv, code: code },
  17.                 success: function (data) {

  18.                   //4.解密成功后 获取自己服务器返回的结果
  19.                   if (data.data.status == 1) {
  20.                     var userInfo_ = data.data.userInfo;
  21.                     console.log(userInfo_)
  22.                   } else {
  23.                     console.log('解密失败')
  24.                   }
  25.                 },
  26.                 fail: function () {
  27.                   console.log('系统错误')
  28.                 }
  29.               })
  30.             },
  31.             fail: function () {
  32.               console.log('获取用户信息失败')
  33.             }
  34.           })
  35.         } else {
  36.           console.log('获取用户登录态失败!' + r.errMsg)
  37.         }
  38.       },
  39.       fail: function () {
  40.         console.log('登陆失败')
  41.       }
  42.     })
复制葡京赌场网站

java后台:我是用ssm搭的框架

spring+springMVC+mybatis+sqlserver

先上controller的葡京赌场网站:
  1. @ResponseBody
  2. @RequestMapping(value = "/decodeUserInfo", method = RequestMethod.GET)
  3. public Map decodeUserInfo(String encryptedData, String iv, String code) {

  4.     Map map = new HashMap();
  5.     //登录凭证不能为空
  6.     if (code == null || code.length() == 0) {
  7.         map.put("status", 0);
  8.         map.put("msg", "code 不能为空");
  9.         return map;
  10.     }

  11.     //小程序唯一标识   (在微信小程序管理后台获取)
  12.     String wxspAppid = "***********************;
  13.     //小程序的 app secret (在微信小程序管理后台获取)
  14.     String wxspSecret = "************************";
  15.     //授权(必填)
  16.     String grant_type = "***************************";


  17.     //////////////// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid ////////////////
  18.     //请求参数
  19.     String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
  20.     //发送请求
  21.     String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
  22.     //解析相应内容(转换成json对象)
  23.     JSONObject json = JSONObject.fromObject(sr);
  24.     //获取会话密钥(session_key)
  25.     String session_key = json.get("session_key").toString();
  26.     //用户的唯一标识(openid)
  27.     String openid = (String) json.get("openid");

  28.     //////////////// 2、对encryptedData加密数据进行AES解密 ////////////////
  29.     try {
  30.         String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "utf-8");
  31.         if (null != result && result.length() > 0) {
  32.             map.put("status", 1);
  33.             map.put("msg", "解密成功");

  34.             JSONObject userInfoJSON = JSONObject.fromObject(result);
  35.             Map userInfo = new HashMap();
  36.             userInfo.put("openId", userInfoJSON.get("openId"));
  37.             userInfo.put("nickName", userInfoJSON.get("nickName"));
  38.             userInfo.put("gender", userInfoJSON.get("gender"));
  39.             userInfo.put("city", userInfoJSON.get("city"));
  40.             userInfo.put("province", userInfoJSON.get("province"));
  41.             userInfo.put("country", userInfoJSON.get("country"));
  42.             userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));
  43.             userInfo.put("unionId", userInfoJSON.get("unionId"));
  44.             map.put("userInfo", userInfo);
  45.             return map;
  46.         }
  47.     } catch (Exception e) {
  48.         e.printStackTrace();
  49.     }
  50.     map.put("status", 0);
  51.     map.put("msg", "解密失败");
  52.     return map;
  53. }
复制葡京赌场网站

解密工具包AesCbcUtil.class
  1. package com.zking.util;

  2. import org.apache.commons.codec.binary.Base64;
  3. import org.bouncycastle.jce.provider.BouncyCastleProvider;

  4. import javax.crypto.BadPaddingException;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.IllegalBlockSizeException;
  7. import javax.crypto.NoSuchPaddingException;
  8. import javax.crypto.spec.IvParameterSpec;
  9. import javax.crypto.spec.SecretKeySpec;
  10. import java.io.UnsupportedEncodingException;
  11. import java.security.*;
  12. import java.security.spec.InvalidParameterSpecException;

  13. public class AesCbcUtil {

  14.     static {
  15.         //BouncyCastle是一个葡京娱乐网站的加解密解决方案,主页在http://www.bouncycastle.org/
  16.         Security.addProvider(new BouncyCastleProvider());
  17.     }

  18.     /**
  19.      * AES解密
  20.      *
  21.      * @param data           //密文,被加密的数据
  22.      * @param key            //秘钥
  23.      * @param iv             //偏移量
  24.      * @param encodingFormat //解密后的结果需要进行的编码
  25.      * @return
  26.      * @throws Exception
  27.      */
  28.     public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
  29. //        initialize();

  30.         //被加密的数据
  31.         byte[] dataByte = Base64.decodeBase64(data.getBytes());
  32.         //加密秘钥
  33.         byte[] keyByte = Base64.decodeBase64(key.getBytes());
  34.         //偏移量
  35.         byte[] ivByte = Base64.decodeBase64(iv.getBytes());


  36.         try {
  37.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

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

  39.             AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
  40.             parameters.init(new IvParameterSpec(ivByte));

  41.             cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化

  42.             byte[] resultByte = cipher.doFinal(dataByte);
  43.             if (null != resultByte && resultByte.length > 0) {
  44.                 String result = new String(resultByte, encodingFormat);
  45.                 return result;
  46.             }
  47.             return null;
  48.         } catch (NoSuchAlgorithmException e) {
  49.             e.printStackTrace();
  50.         } catch (NoSuchPaddingException e) {
  51.             e.printStackTrace();
  52.         } catch (InvalidParameterSpecException e) {
  53.             e.printStackTrace();
  54.         } catch (InvalidKeyException e) {
  55.             e.printStackTrace();
  56.         } catch (InvalidAlgorithmParameterException e) {
  57.             e.printStackTrace();
  58.         } catch (IllegalBlockSizeException e) {
  59.             e.printStackTrace();
  60.         } catch (BadPaddingException e) {
  61.             e.printStackTrace();
  62.         } catch (UnsupportedEncodingException e) {
  63.             e.printStackTrace();
  64.         }

  65.         return null;
  66.     }

  67. }
复制葡京赌场网站

请求包HttpRequest
  1. HttpRequest
  2. package com.zking.util;
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintWriter;
  7. import java.net.URL;
  8. import java.net.URLConnection;
  9. import java.util.List;
  10. import java.util.Map;

  11. public class HttpRequest {

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

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

  21.     /**
  22.      * 向指定URL发送GET方法的请求
  23.      *
  24.      * @param url
  25.      *            发送请求的URL
  26.      * @param param
  27.      *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  28.      * [url=home.php?mod=space&uid=67594]@Return[/url] URL 所代表远程资源的响应结果
  29.      */
  30.     public static String sendGet(String url, String param) {
  31.         String result = "";
  32.         BufferedReader in = null;
  33.         try {
  34.             String urlNameString = url + "?" + param;
  35.             URL realUrl = new URL(urlNameString);
  36.             // 打开和URL之间的连接
  37.             URLConnection connection = realUrl.openConnection();
  38.             // 设置通用的请求属性
  39.             connection.setRequestProperty("accept", "*/*");
  40.             connection.setRequestProperty("connection", "Keep-Alive");
  41.             connection.setRequestProperty("user-agent",
  42.                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  43.             // 建立实际的连接
  44.             connection.connect();
  45.             // 获取所有响应头字段
  46.             Map<String, List<String>> map = connection.getHeaderFields();
  47.             // 遍历所有的响应头字段
  48.             for (String key : map.keySet()) {
  49.                 System.out.println(key + "--->" + map.get(key));
  50.             }
  51.             // 定义 BufferedReader输入流来读取URL的响应
  52.             in = new BufferedReader(new InputStreamReader(
  53.                     connection.getInputStream()));
  54.             String line;
  55.             while ((line = in.readLine()) != null) {
  56.                 result += line;
  57.             }
  58.         } catch (Exception e) {
  59.             System.out.println("发送GET请求出现异常!" + e);
  60.             e.printStackTrace();
  61.         }
  62.         // 使用finally块来关闭输入流
  63.         finally {
  64.             try {
  65.                 if (in != null) {
  66.                     in.close();
  67.                 }
  68.             } catch (Exception e2) {
  69.                 e2.printStackTrace();
  70.             }
  71.         }
  72.         return result;
  73.     }

  74.     /**
  75.      * 向指定 URL 发送POST方法的请求
  76.      *
  77.      * @param url
  78.      *            发送请求的 URL
  79.      * @param param
  80.      *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  81.      * @return 所代表远程资源的响应结果
  82.      */
  83.     public static String sendPost(String url, String param) {
  84.         PrintWriter out = null;
  85.         BufferedReader in = null;
  86.         String result = "";
  87.         try {
  88.             URL realUrl = new URL(url);
  89.             // 打开和URL之间的连接
  90.             URLConnection conn = realUrl.openConnection();
  91.             // 设置通用的请求属性
  92.             conn.setRequestProperty("accept", "*/*");
  93.             conn.setRequestProperty("connection", "Keep-Alive");
  94.             conn.setRequestProperty("user-agent",
  95.                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  96.             // 发送POST请求必须设置如下两行
  97.             conn.setDoOutput(true);
  98.             conn.setDoInput(true);
  99.             // 获取URLConnection对象对应的输出流
  100.             out = new PrintWriter(conn.getOutputStream());
  101.             // 发送请求参数
  102.             out.print(param);
  103.             // flush输出流的缓冲
  104.             out.flush();
  105.             // 定义BufferedReader输入流来读取URL的响应
  106.             in = new BufferedReader(
  107.                     new InputStreamReader(conn.getInputStream()));
  108.             String line;
  109.             while ((line = in.readLine()) != null) {
  110.                 result += line;
  111.             }
  112.         } catch (Exception e) {
  113.             System.out.println("发送 POST 请求出现异常!"+e);
  114.             e.printStackTrace();
  115.         }
  116.         //使用finally块来关闭输出流、输入流
  117.         finally{
  118.             try{
  119.                 if(out!=null){
  120.                     out.close();
  121.                 }
  122.                 if(in!=null){
  123.                     in.close();
  124.                 }
  125.             }
  126.             catch(IOException ex){
  127.                 ex.printStackTrace();
  128.             }
  129.         }
  130.         return result;
  131.     }
  132. }
复制葡京赌场网站

pom.xml的配置:要配置:rt.jar跟jce.jar都是在jdk/jre/lib里的,记得对应好路劲
  1. <bootclasspath>${java.home}/jre/lib/rt.jar${path.separator}${java.home}/jre/lib/jce.jar</bootclasspath>
  2. <build>
  3.   <finalName>OneProject</finalName>
  4.   <pluginManagement>
  5.     <plugins>
  6.       <plugin>
  7.         <artifactId>maven-clean-plugin</artifactId>
  8.         <version>3.0.0</version>
  9.       </plugin>
  10.       <plugin>
  11.         <groupId>org.apache.maven.pluginsgroupId</groupId>
  12.         <artifactId>maven-compiler-pluginartifactId</artifactId>
  13.         <version>2.5.1version</version>
  14.       <configuration>
  15.         <source>1.7source</source>
  16.         <target>1.7target</target>
  17.       <compilerArguments>
  18.       <verbose />
  19.       <bootclasspath>${java.home}/jre/lib/rt.jar${path.separator}${java.home}/jre/lib/jce.jar</bootclasspath>
  20.      </compilerArguments>
  21.       <encoding>utf-8encoding</encoding>
  22.       </configuration>
  23.      </plugin>
  24.       <plugin>
  25.         <artifactId>maven-resources-plugin</artifactId>
  26.         <version>3.0.2</version>
  27.       </plugin>
  28.       <plugin>
  29.         <artifactId>maven-compiler-plugin</artifactId>
  30.         <version>3.7.0</version>
  31.       </plugin>
  32.       <plugin>
  33.         <artifactId>maven-surefire-plugin</artifactId>
  34.         <version>2.20.1</version>
  35.       </plugin>
  36.       <plugin>
  37.         <artifactId>maven-war-plugin</artifactId>
  38.         <version>3.2.0</version>
  39.       </plugin>
  40.       <plugin>
  41.         <artifactId>maven-install-plugin</artifactId>
  42.         <version>2.5.2</version>
  43.       </plugin>
  44.       <plugin>
  45.         <artifactId>maven-deploy-plugin</artifactId>
  46.         <version>2.8.2</version>
  47.       </plugin>
  48.     </plugins>
  49.   </pluginManagement>
  50.   <resources>
  51.     <resource>
  52.       <directory>src/main/java</directory>
  53.       <includes>
  54.         <include>**/*.xml</include>
  55.       </includes>
  56.     </resource>
  57.   </resources>
  58. </build>
复制葡京赌场网站

这里可能还会报406错误,主要是因为返回结果类型的问题

所以得在springmvc.xml中配置
  1. <context:annotation-config />
  2. <mvc:annotation-driven />
复制葡京赌场网站

这样就可以了,然后我们去小程序控制台看返回结果

这样就大功告成了!

原文:https://blog.csdn.net/abgglive/article/details/80666807
回复

使用道具 举报

最佳答案
0 

4

主题

274

帖子

2795

积分

专家路上

积分
2795
发表于 7 天前 | 显示全部楼层
拜大神。求包养。
回复 支持 反对

使用道具 举报

最佳答案
0 

3

主题

13

帖子

120

积分

新人求带

积分
120
 楼主| 发表于 7 天前 | 显示全部楼层

我也是 转载别人的文章,觉得写得好不错,有问题的话建议你发帖提问吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



www.mainetimberworks.com—微信开发者的分享交流平台,专注微信开发生态。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

微信葡京娱乐网址号

市场合作
[email protected]