本文主要总结微信小程序通过后台请求访问微信用户信息

创建一个微信小程序工程(自行百度)

微信小程序index.js代码

//index.js

//获取应用实例

const app = getApp()

Page({

data: {

motto: 'Hello World',

userInfo: {},

backUserInfo:{},//后台得到的微信用户信息

hasUserInfo: false,

canIUse: wx.canIUse('button.open-type.getUserInfo')

},

//事件处理函数

bindViewTap: function() {

wx.navigateTo({

url: '../logs/logs'

})

},

onLoad: function () {

//1.静默操作获取用户信息 调用wx.login

var that = this;

wx.login({

success:function(res){

var code = res.code;//2.登录凭证code

console.log('code==='+code);

if(null!=code){

wx.getUserInfo({

success:function(ress){

console.log('res===' + res);

//3.请求自己的服务器,解密用户信息

wx.request({

url: 'http://xxxx.com/wcsp/oauth',

method:'post',

header:{

'content-type': 'application/x-www-form-urlencoded'

},

data: { encryptedData: ress.encryptedData, iv: ress.iv, code: code},

success:function(res){

console.log('resjava===' + res.data.openId);

that.setData({

backUserInfo:res//将后台返回的数据赋值给backUserInfo

})

}

})

}

})

}

}

})

if (app.globalData.userInfo) {

this.setData({

userInfo: app.globalData.userInfo,

hasUserInfo: true

})

} else if (this.data.canIUse){

// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

// 所以此处加入 callback 以防止这种情况

app.userInfoReadyCallback = res => {

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

} else {

// 在没有 open-type=getUserInfo 版本的兼容处理

wx.getUserInfo({

success: res => {

app.globalData.userInfo = res.userInfo

this.setData({

userInfo: res.userInfo,

hasUserInfo: true

})

}

})

}

},

getUserInfo: function(e) {

console.log(e)

app.globalData.userInfo = e.detail.userInfo

this.setData({

userInfo: e.detail.userInfo,

hasUserInfo: true

})

}

})

Java后台处理代码:

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import cn.xsshome.mvcdo.util.AesCbcUtil;

import cn.xsshome.mvcdo.util.PrintUtil;

import cn.xsshome.mvcdo.util.WeChatConstant;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

/**

* 微信小程序code换取微信用户信息

* @author 小帅丶

*

*/

@Controller

@RequestMapping(value="wcsp")

public class WeChatSPController {

private static Logger logger = LoggerFactory.getLogger(WeChatSPController.class);

/**

* 获取微信小程序用户openid等信息

* @param encryptedData 加密数据

* @param iv 加密算法初始向量

* @param code 微信小程序code码

* @param request HttpServletRequest

* @param response HttpServletResponse

* @return String

* @throws Exception

*/

@RequestMapping(value="/oauth")

public String wxOauth(String encryptedData,String iv,String code,HttpServletRequest request,HttpServletResponse response) throws Exception{

try {

logger.info("请求的参数有:\n加密数据="+encryptedData+"\n加密算法初始向量="+iv+"\n微信小程序code="+code);

//1.拼接code等参数换取私钥值

String param = "appid="+WeChatConstant.WCSP_APPID+"&secret="+WeChatConstant.WCSP_APPSECRET+"&grant_type="+WeChatConstant.GRANT_TYPE+"&js_code="+code;

String result = cn.xsshome.mvcdo.util.HttpUtil.post(WeChatConstant.JSCODE2SESSION_URL, param);

logger.info("=======接口返回的数据里面包含私钥值和openid:"+result);

JSONObject jsonObject = JSON.parseObject(result);

String session_key = jsonObject.get("session_key").toString();

logger.info("session_key私钥值===="+session_key);

//2.使用私钥值 和 算法向量值 加密的数据进行解密

String userInfo = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");

logger.info("解密后返回页面的数据==="+userInfo);

PrintUtil.printJson(response, userInfo);

} catch (Exception e) {

logger.error("oauth===出错了"+e.getMessage());

return null;

}

return null;

}

}

返回session_key和openId

{

"session_key": "9EAwD4AYbo4sScCjEviHag==",

"expires_in": 7200,

"openid": "op5Hs0EYFmR7XvvWNrbsMFVn22Ks"

}

通过session_key解密后的数据(微信用户信息)

{

"openId": "op5Hs0EYFmR7XvvWNrbsMFVn22Ks",

"nickName": "小帅丶",

"gender": 1,

"language": "zh_CN",

"city": "Haidian",

"province": "Beijing",

"country": "China",

"avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLib098UOLAHuE1fDldajSPuwR0RcPf3rxCtVicwhvdKibYFE0JNibwMwGdiagRzibdAtkSTU1fYxiaz8CIQ/0",

"watermark": {

"timestamp": 1524633793,

"appid": "wxe11111111111"

}

}

AES解密工具类(需要BC包支持文末给出)

package cn.xsshome.mvcdo.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;

/**

* AES-128-CBC 加密方式

* 注:

* AES-128-CBC可以自己定义“密钥”和“偏移量“。

* AES-128是jdk自动生成的“密钥”。

*/

public class AesCbcUtil {

static {

//BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/

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 {

//被加密的数据

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;

}

}

微信小程序index.wxml内容

获取头像昵称

用户昵称:{{backUserInfo.data.nickName}}

用户性别:男

未知

所在城市:{{backUserInfo.data.city}}

所在省份:{{backUserInfo.data.province}}

所在国家:{{backUserInfo.data.country}}

用户的语言:{{backUserInfo.data.language}}

所需要的jar包

org.bouncycastle

bcprov-jdk15

1.46

演示效果图

后台打印的日志

加密数据=X5Ib86RrR0DbekjW1qnfSDYjcQ2fZ2e9jEzcqiHS54nW/jDPa/qUEAJAXPjB7kDAvjSVoOQ9BGPn2BGruoGyMXssDQHWAsdw9u/dlTPVLuwrKmtiBArgEpeWmYy70+DU3vCrYTFHgXLsg5KWgvXpuhgkz7lcafCr9CBTeq3uIEZ40nNfXJiMeFiQrjT/vCvK8bLWrGv5qBF1LlxlA/7Cxx8oQuAHKjXPaIMjEq+r0/wOhBV13J6n1BZF1J7A0HrtXsy1uw56wAbcJXvWx0dvrS0+Kk//P9uYzOK3+DFHxsne2P2cd1KBqWVY+gg0VWZ8wvYt/FNq9l6zM1RehHCS0Zt3nAjQebHb5IaFSMHjA4qrL21jpjoAAX6SbfgXoLDnENG2cmppqPWBCLAJ6rizTSkAc67sOm9674s4KMz7z8LJr/RIsEnGOMeMhb7ylt3vH+fMtwAA7N9B0wjD908MgtGTPvUhoags/LoqXfpm8DI=

加密算法初始向量=P5ZaAJxSuDBzV6IyxKyPhw==

微信小程序code=081hg8Ez1HvYBe0vDnEz1dwdEz1hg8Ed

result:{"session_key":"JzWvgMpc9CoWVd7fUVhE0A==","expires_in":7200,"openid":"op5Hs0EYFmR7XvvWNrbsMFVn22Kk"}

[cn.xsshome.mvcdo.controller.wechat.WeChatSPController] - =======接口返回的数据:{"session_key":"JzWvgMpc9CoWVd7fUVhE0A==","expires_in":7200,"openid":"op5Hs0EYFmR7XvvWNrbsMFVn22Kk"}

[cn.xsshome.mvcdo.controller.wechat.WeChatSPController] - session_key私钥值====JzWvgMpc9CoWVd7fUVhE0A==

[cn.xsshome.mvcdo.controller.wechat.WeChatSPController] - 解密后返回页面的数据==={"openId":"op5Hs0EYFmR7XvvWNrbsMFVn22Kk","nickName":"小帅丶","gender":1,"language":"zh_CN","city":"Haidian","province":"Beijing","country":"China","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLib098UOLAHuE1fDldajSPuwR0RcPf3rxCtVicwhvdKibYFE0JNibwMwGdiagRzibdAtkSTU1fYxiaz8CIQ/0","watermark":{"timestamp":1524554676,"appid":"wxe71f579c17281234"}}

java登入ajxs_微信小程序之获取并解密用户数据(获取openid,nickName等)相关推荐

  1. 基于java+SpringBoot+HTML+Mysq+微信小程序+小说阅读网站

     详细功能设计:请点击下面链接查看 基于java+SpringBoot+HTML+Mysq+微信小程序+小说阅读网站_哔哩哔哩_bilibili 源码+论文获取: 源码+论文获取请私信获取 基于Spr ...

  2. java计算机毕业设计基于微信小程序的校园外卖订餐系统APP

    项目介绍 网络技术的快速发展给各行各业带来了很大的突破,也给各行各业提供了一种新的管理模块和校园订餐模块,对于校园订餐小程序将是又一个传统管理到智能化信息管理的改革,对于传统的校园订餐管理,所包括的信 ...

  3. java监听微信_一种基于java后台应用监控微信小程序的用户访问量的方法与流程...

    本发明涉及java应用与微信小程序应用开发技术领域,具体涉及一种基于java后台应用监控微信小程序的用户访问量的方法. 背景技术: 微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了 ...

  4. java计算机毕业设计基于微信小程序的药店药品销售管理系统APP

    项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, ...

  5. java写微信小程序答辩问题_java微信小程序开发中加密解密算法总结

    详解java微信小程序开发中加密解密算法 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让 ...

  6. 基于java的ssm和微信小程序实现物业缴费系统的设计与实现【附项目源码+论文说明】

    基于java的ssm和微信小程序实现物业缴费系统的设计与实现 摘要 本论文主要论述了如何使用JAVA语言开发一个基于微信小程序的物业缴费系统的设计与实现,本系统将严格按照软件开发流程进行各个阶段的工作 ...

  7. 微信小程序注册/登陆,若依后台获取token

    微信小程序注册/登陆,若依后台获取token 后端接口: @ApiOperation(value = "小程序登入", httpMethod = "POST") ...

  8. 微信小程序|area组件使用的地址数据文件plus

    area组件使用的地址数据文件 前言 1.解析json的地址转换为area.js的格式 2.转换格式的java代码 3.运行结果截图示意 前言 实战篇内容参考: 1.腾讯的全球地址数据文件及Xml-& ...

  9. 微信小程序后台 iv encryptedData 解密

    微信小程序后台 iv encryptedData  解密准备工作 首先 第一步配置 pom <dependency><groupId>org.bouncycastle</ ...

最新文章

  1. android程序退出 语句,android开发中continue,break、return的区别与使用
  2. python rabitmq_python RabbitMQ队列使用
  3. 2015年第六届蓝桥杯C/C++ B组国赛 —— 第一题:积分之迷
  4. 在Java中如何从一个多层嵌套循环中直接跳出?
  5. cocos2d-x 3.0 画图节点——Node
  6. Oracle RAC万能集群测试大全 支持11g/12c/18c/19c版本
  7. Java web 应用全局变量_将properties文件的配置设置为整个Web应用的全局变量。
  8. java map 面试题_Java 面试系列:集合详解之 Map + 面试题
  9. Vue-cli搭建vue基础项目
  10. 360度测试:KAFKA会丢数据么?其高可用是否满足需求?
  11. 【学习笔记】matlab进行数字信号处理(一)生成信号及信号的时域频域分析
  12. 向量对矩阵列空间的投影_向量(阵列)处理和超标量处理器
  13. R数据分析:如何绘制回归分析结果的森林图
  14. 16个外接SMA天线R2000超高频RFID写卡器HXU2899M上位机命令数据块
  15. Matlab画图 线型控制
  16. 工程、技术与工程师三者之间的相互关系
  17. 戴尔linux改win7教程视频,戴尔台式机预装win10改win7及bios设置详细教程
  18. Android studio Installed Build Tools revision 31.0.0 is corrupted. Remove and install again
  19. ios 换电脑继续使用csr 证书等。
  20. 计算机多媒体对语文教学的提高,终于懂了语文教学如何利用多媒体

热门文章

  1. 使用mdadm创建raid mdadm命令详解
  2. js 金额千分位转换
  3. 浅谈MOS管的工作原理
  4. 【520521】程序员中的“芳心纵火犯”, 这就是面向对象编程吗?
  5. android工程师培训价格,徐州android工程师培训基地
  6. IT十年人生过客-二十三-不要情怀要生活
  7. Unity3D之如何将包大小减少到极致
  8. S5PV210开发板用汇编设置栈和调用C语言
  9. 计算机图形学:B样条画枫叶
  10. 【RTOS训练营】队列的读写、休眠和唤醒、常规应用、使用和晚课提问