大家好,最近工作有个项目是做小程序,需要用到微信登录,于是稍加研究了一下下面是给大家整理的内容

首先对接微信登录,微信会提供一个api

在调用这个api的时候需要一个HttpClient工具

   private static final CloseableHttpClient httpclient = HttpClients.createDefault();
/*** 发送HttpGet请求* @param url   请求地址 ** @return      返回字符串*/public static String sendGet(String url, Map<String, String> headerList) throws Exception{String result = null;CloseableHttpResponse response = null;try {HttpGet httpGet = new HttpGet(url);if(headerList != null){Set<String> keySet = headerList.keySet();for (String key :keySet) {httpGet.setHeader(key, headerList.get(key));}}response = httpclient.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {result = EntityUtils.toString(entity);}} finally {if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}}return result;}

此工具类需要两个依赖

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.7</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version><scope>compile</scope>
</dependency>

在这个api中,前端调用微信的wx.login接口会得到一个code码,得到这个code码,在发送给后台,后台就会得到session_key以及openId

注: session_key解密微信数据包的,而openId是微信返回的唯一标识,可以直接存储到数据库中

得到session_key和openId之后前端再次调用wx.getUserInfo/wx.getUserProfile 接口会得到微信加密的数据包,以及加密算法的初始向量等

public void getAuth(Map<String,Object> params){String url = "";  //此处是你的api params中会携带参数入jsCode,iv,rawData,userInfo等参数try {String sendGet = sendGet(url, null);JSONObject jsonObject = JSONObject.parseObject(sendGet);Object openId = jsonObject.get("openId");Object session_key = jsonObject.get("session_key");} catch (Exception e) {e.printStackTrace();}}

需要注意: 前端在调用wx.login和wx.getUserInfo的时候只调用后端的一个接口就可以了,前端获取到jsCode以及加密的数据包和IV等数据时,直接调用后端接口,由后端操作!

得到了session_key之后,我们就可以解密数据,我们需要一个解密的数据util,注: 使用这个util的时候注意导包的位置

package **.**.utils;
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;/**** @author gxh* 获取微信隐私数据并解密*/
public class AesUtil {static {//BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/Security.addProvider(new BouncyCastleProvider());}/*** AES解密** @param data           //密文,被加密的数据* @param key            //秘钥  sessionKey* @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;}
}

此工具类需要的pom坐标

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.59</version>
</dependency>

得到这个界面算法之后我们就可以解密数据了,login接口就可以是这样的了

 public void getAuth(Map<String,String> params){String url = "";try {//获取api中的session_keyString sendGet = sendGet(url, null);JSONObject jsonObject = JSONObject.parseObject(sendGet);Object openId = jsonObject.get("openId");String session_key = (String) jsonObject.get("session_key");//解密微信数据String decrypt = decrypt(params.get("data"), session_key, params.get("iv"), "UTF-8");JSONObject resultJson = JSONObject.parseObject(decrypt);//获取数据String nickName = resultJson.getString( "nickName" );String avatarUrl = resultJson.getString( "avatarUrl" );String gender  = resultJson.getString( "gender" );String city = resultJson.getString( "city" );String country = resultJson.getString( "country" );String province = resultJson.getString( "province" );} catch (Exception e) {e.printStackTrace();}}

说一下思路:

​ 1: 获取到了微信返回的数据之后就可以存储到数据库中,openId是一定要存的,是微信用户的唯一标识符,

​ 2: 获取到微信的信息之后就要给微信用户给我们系统的认证了

好了今天就到这里

JAVA对接微信登录,有这一篇就够了相关推荐

  1. Java对接微信公众平台详解

    Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...

  2. Android绕过微信包名限制对接微信登录和支付

    Android绕过微信包名限制对接微信登录和支付 前言 最终效果 原理 代码 通过 APT 生成 WXEntryActivity 文件 对接微信SDK End 前言 Android对接微信登录和支付几 ...

  3. java对接微信支付收不到支付通知问题(亲身实践)

    问题描述: 用java对接微信支付时,统一下单接口正常.但是用户扫码付款成功后,设置用于回调的notify_url对应的接口并没有收到请求(这个url测试过,是正常的且外网能访问的). 由于官方文档没 ...

  4. Java对接微信支付实现微信APP支付

    Java对接微信实现微信APP支付 之前对接过第三方的支付方式,也有接入微信jsapi的支付方式,这次项目需求要求对接微信APP支付,找了很多,几乎都没有最新版的微信支付v3的对接相关的详细博客,真的 ...

  5. Java对接微信支付(完整全流程)

    Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...

  6. 最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+

    最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+搭建视频教程 [别站亲测源码]11月最新H5早起打卡网抑云熬夜打卡定制版对接微信登录/免签 支付 源码全修复完美版本/搭建视频教程 全新的早起 ...

  7. 最全的java对接微信小程序客服功能实现(包含自动回复文本消息、图片消息,进入人工客服)

    java对接微信小程序客服功能实现(包含自动回复文本消息.图片消息,进入人工客服) 第一步:请求校验(确认请求来自微信服务器) 代码如下: @ApiOperation(value = " 微 ...

  8. [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)

    [个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...

  9. Java对接微信公众号模板消息推送(架包WxJava)

    内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offi ...

最新文章

  1. 图解粒子群优化算法(PSO)
  2. 皮一皮:听说这门专业挺难学...
  3. linux ---jenkins的安装与配置
  4. 幼儿园计算机教案 妈妈的爱,幼儿园大班教案《妈妈的爱》(通用)
  5. Java nio Socket非阻塞模式
  6. 《Java特种兵》1.8 老A是在逆境中迎难而上者
  7. 必背单词_初中英语:2000个必背单词(附音标)汇总,打印背完,3年考高分
  8. C++:如何在VS中配置第三方动态库 【visual Studio 2017 + Opencv 】
  9. 如何将日志系统切换到 Logback?
  10. 9行Python代码搭建神经网络来掌握一些基本概念
  11. 如何部署Java_web项目到云服务器上
  12. 10. Django基础:静态文件
  13. Akash,全球首个去中心化云计算
  14. 无盘 电影服务器,网吧电影服务器解决方案完全攻略指南
  15. 关于Jquery使用的一些注意事项
  16. MySQL基础之二 | 详解(SQL-DDL)
  17. krpano 场景切换 通知_krpano 场景转换模式
  18. 易语言EIDE助手(内测体验版),更便捷好用的易语言助手。
  19. 2021-2025年中国物理疗法电子病历和计费软件行业市场供需与战略研究报告
  20. 已知二叉树:先序和中序求后序/后序和中序求先序

热门文章

  1. JAVA实现PDF和EXCEL生成和数据动态插入以及导出
  2. 云原生数据库的下一次变革发生在哪里?
  3. 大型项目实战Vue+Vuex+Koa2+Socket.io+Jssdk联合打造无人点餐系统
  4. 用Java开发贪食蛇小游戏
  5. 1198:逆波兰表达式(递归,前缀表达式,波兰表达式)
  6. 随机数与随机序列生成
  7. 注册宝网络验证系统,安全免费的网络验证系统
  8. Unity3D 截取6面图 做全景图脚本
  9. [深度学习] 百度api的asr语音识别(包括长音频,识别多个语句)
  10. 【NOIP2013初赛】整除