微信小程序授权登录获取用户信息详解

微信小程序授权登录获取用户信息详解今天来说一下微信小程序的授权登录获取用户信息 首先我们看微信提供的小程序开发文档 https blog csdn net article details 微信登录的流程和步骤 步骤 个人 第一步 微信小程序调用 login 和 getUserInfo 拿到 code 和 encryptedDat iv 传入到后台进行业务处理第二步

页面中的代码:

 
   
    
   

js:

 getUserInfo: function (e) { console.log(5); console.log(e) if (e.detail.userInfo) { app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) } else { this.openSetting(); } }, login: function () { console.log(111) var that = this var thist = this; // if (typeof success == "function") { // console.log(6); // console.log('success'); // this.data.getUserInfoSuccess = success // } wx.login({ success: function (res) { var code = res.code; console.log(code); wx.getUserInfo({ success: function (res) { console.log(res); wx.request({ url: app.server.hostUrl + '/api/auth/login_by_weixin.do',//自己的服务接口地址,这里是去拿到code去后台进行业务处理,调用微信接口拿到用户openid和凭证,在解密拿到用户数据 method: 'post', header: { 'content-type': 'application/x-www-form-urlencoded' }, data: { encryptedData: res.encryptedData, iv: res.iv, code: code }, success: function (data) { wx.setStorage({ key: "userif", data: data.data.userinfo }) console.info(data); //4.解密成功后 获取自己服务器返回的结果 if (data.data.code == 1) { var userInfo_ = data.data.userinfo; console.log(7); app.globalData.userInfo = userInfo_ that.setData({ getUserInfoFail: false, userInf: userInfo_, hasUserInfo: true }) thist.setData({ datas: userInfo_, index: 1 }) console.log(userInfo_) that.onLoad(); } else { console.log('解密失败') } }, fail: function () { console.log('系统错误') } }) //平台登录 }, fail: function (res) { console.log(8); console.log(res); that.setData({ getUserInfoFail: true }) } }) } }) }, //跳转设置页面授权 openSetting: function () { var that = this if (wx.openSetting) { wx.openSetting({ success: function (res) { console.log(9); //尝试再次登录 that.login() } }) } else { console.log(10); wx.showModal({ title: '授权提示', content: '小程序需要您的微信授权才能使用哦~ 错过授权页面的处理方法:删除小程序->重新搜索进入->点击授权按钮' }) } } 

JAVA后台代码Controller层:

 / *微信登录 * @param code 凭证 * @param encryptedData 用户数据 * @param iv 用户数据 * @param request request作用域: * @return map */ @RequestMapping("/login_by_weixin") @ResponseBody public Map loginByWeixin(String code, String encryptedData, String iv, HttpServletRequest request) { Map 
  
    map =new HashMap 
   
     (); String sendGet=userService.loginByWeixin(code); //根据code去调用接口获取用户openid和session_key JSONObject json = JSONObject.fromObject(sendGet); System.out.println("返回过来的json数据:"+json.toString()); String sessionkey=json.get("session_key").toString(); //会话秘钥 String openid=json.get("openid").toString(); //用户唯一标识 try{ //拿到用户session_key和用户敏感数据进行解密,拿到用户信息。 String decrypts=AesCbcUtil.decrypt(encryptedData,sessionkey,iv,"utf-8");//解密 JSONObject jsons = JSONObject.fromObject(decrypts); String nickName=jsons.get("nickName").toString(); //用户昵称 String jsonsds=jsonsd.get("avatarUrl").toString(); //用户头像 jsons.get("avatarUrl").toString(); //头像 jsons.get("gender").toString();//性别 jsons.get("unionid").toString(); //unionid jsons.get("city").toString(); //城市 jsons.get("province").toString();//省份 jsons.get("country").toString(); //国家 }catch (Exception e) { e.printStackTrace(); } } 
    
  
 / *微信登录业务实现类: * @param openid 用户id * @return User */ @Override public String loginByWeixin(String code, String encryptedData, String iv) { Map 
  
    map = new HashMap 
   
     (); //发送 https://api.weixin..com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 获取用户的openid和session_key //注意这个是 WeChatTool.wxspAppid 是微信小程序的appid 从微信小程序后台获取 WeChatTool.wxspSecret 这个也一样,我这里是用了常量来进行保存方便多次使用 String params = "appid=" + WeChatTool.wxspAppid + "&secret=" + WeChatTool.wxspSecret + "&js_code=" + code + "&grant_type=authorization_code"; String sendGet = Httprequests.sendGet(WeChatTool.url, params); //发起请求拿到key和openid return sendGet; } 
    
  

Httprequests.java(发送网络请求的工具类)

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; import java.util.Random; import javax.servlet.http.HttpServletRequest; / * 

User: xxx *

Date: 14-1-28 *

Version: 1.0 * 描述: http发起请求: */ public class Httprequests { //测试,发送请求是否成功: public static void main(String[] aegs) { String string = Httprequests.sendGet("http://v..com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o",""); System.out.print(string); } //发送GET请求: public static String sendGet (String url,String param) { String result =""; BufferedReader in =null; try { String urlNameString = url +"?" +param; System.out.println("发送的链接请求:"+urlNameString); URL reaurl = new URL(urlNameString); URLConnection connection = reaurl.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 > map = connection.getHeaderFields(); //定义 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 参数 * @return String 所代表远程资源的响应结果 */ 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.java(拿用户的session_key和微信小程序传过来的iv和encryptedData进行解密的工具类)

import java.io.UnsupportedEncodingException; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidParameterSpecException; 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 javax.management.openmbean.InvalidKeyException; import org.apache.commons.codec.binary.Base64; / * 

User: qrn *

Date: 14-1-28 *

Version: 1.0 * 描述: 解密 */ public class AesCbcUtil { / * AES解密 * * @param encryptedData 包括敏感数据在内的完整用户信息的加密数据, * @param key 秘钥 * @param iv 加密算法的初始向量, * @param encodingFormat 解密后的结果需要进行的编码 * @return String * @see Exception */ public static String decrypt(String encryptedData,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/PKCS5Padding"); 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; } }

如果上面的执行没有错误的话,就可以拿到用户的信息,这个代码应该是不会出问题,如果有问题请下发评论我会及时的回答,其实微信的开发文档中这些东西以经写的很清楚,希望微信开发的朋友可以认真仔细的观看微信文档,希望这篇文字对大家有用,谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201025.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:06
下一篇 2026年3月20日 上午10:06


相关推荐

  • 初次使用Rubymine

    初次使用Rubymine在 Windows 上配置 Redmine 环境后 上一篇有介绍 准备阅读源码 用单纯的文本编辑器阅读代码实在太低下了 非常需要一个类似 VisualStudio 或 SourceInsigh 等高效的代码分析工具 调查了一番 最后决定使用 Rubymine 使用 Rubymine 遇到了一些问题 如何把现有 Rails 项目导入到 Rubymine 中 尝试用 Rubymine 6 3 版本 新建

    2025年10月31日
    6
  • Python Django 搭建文件下载服务器[通俗易懂]

    本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末PythonDjango搭建文件下载服务器环境win10Python:3.6.7Django:2.2.7运行效果1、创建Django项目#创建Download项目django-adminstartprojectDownload#创建down_appapppythonmanage.pystartappdown_app2、修改配置文件:settings.pyDownload/D

    2022年4月12日
    236
  • c语言子程序return,c语言return返回到哪

    c语言子程序return,c语言return返回到哪c 语言 return 返回到哪 c 语言 return 返回给了上一级 比如一个递归程序 从第三层返回到第二层 又比如一个普通的子程序 那就返回到主程序中去 主程序中 return 返回给了操作系统 比如下面一个 c 程序 intsum inta intb returna b intmain intargc charconst argv intc sum 1000 24

    2026年3月17日
    2
  • QT QMap 使用方法实例

    QT QMap 使用方法实例QTQMap使用方法,直接上例子,请仔细体会。

    2022年5月30日
    71
  • 什么是数据安全软件?「建议收藏」

    什么是数据安全软件?「建议收藏」数据安全软件有各种形式和大小。工具存在并且旨在保护所有类型的数据,从单个消息到整个数据库。每家公司,无论规模大小,都应将数据安全作为核心业务实践,并尽其所能确保存储在其业务每个缝隙中的数据受到保护;任何对敏感信息的盗窃都可能损害企业和客户。

    2022年5月21日
    39
  • vue项目中使用postcss-px2rem的方法总结「建议收藏」

    vue项目中使用postcss-px2rem的方法总结「建议收藏」标题vue项目中postcss-px2rem的使用在项目中为了屏幕适配,经常会用到rem,postcss-px2rem就是为了让我们直接在将代码中px自动转化成对应的rem的一个插件如何使用:1.安装npmipostcss-px2rem–save-dev2.设置(以下总结了三种方式)1).找到项目根目录下的.postcssrc文件module.exports={“plugins”:{“postcss-import”:{},”postcss-url”

    2025年8月1日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号