JAVA对接微信登录,有这一篇就够了
大家好,最近工作有个项目是做小程序,需要用到微信登录,于是稍加研究了一下下面是给大家整理的内容
首先对接微信登录,微信会提供一个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对接微信登录,有这一篇就够了相关推荐
- Java对接微信公众平台详解
Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...
- Android绕过微信包名限制对接微信登录和支付
Android绕过微信包名限制对接微信登录和支付 前言 最终效果 原理 代码 通过 APT 生成 WXEntryActivity 文件 对接微信SDK End 前言 Android对接微信登录和支付几 ...
- java对接微信支付收不到支付通知问题(亲身实践)
问题描述: 用java对接微信支付时,统一下单接口正常.但是用户扫码付款成功后,设置用于回调的notify_url对应的接口并没有收到请求(这个url测试过,是正常的且外网能访问的). 由于官方文档没 ...
- Java对接微信支付实现微信APP支付
Java对接微信实现微信APP支付 之前对接过第三方的支付方式,也有接入微信jsapi的支付方式,这次项目需求要求对接微信APP支付,找了很多,几乎都没有最新版的微信支付v3的对接相关的详细博客,真的 ...
- Java对接微信支付(完整全流程)
Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...
- 最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+
最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+搭建视频教程 [别站亲测源码]11月最新H5早起打卡网抑云熬夜打卡定制版对接微信登录/免签 支付 源码全修复完美版本/搭建视频教程 全新的早起 ...
- 最全的java对接微信小程序客服功能实现(包含自动回复文本消息、图片消息,进入人工客服)
java对接微信小程序客服功能实现(包含自动回复文本消息.图片消息,进入人工客服) 第一步:请求校验(确认请求来自微信服务器) 代码如下: @ApiOperation(value = " 微 ...
- [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)
[个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...
- Java对接微信公众号模板消息推送(架包WxJava)
内容有点多,请耐心! 最近公司的有这个业务需求,又很凑巧让我来完成: 首先想要对接,先要一个公众号,再就是开发文档了:https://developers.weixin.qq.com/doc/offi ...
最新文章
- 图解粒子群优化算法(PSO)
- 皮一皮:听说这门专业挺难学...
- linux ---jenkins的安装与配置
- 幼儿园计算机教案 妈妈的爱,幼儿园大班教案《妈妈的爱》(通用)
- Java nio Socket非阻塞模式
- 《Java特种兵》1.8 老A是在逆境中迎难而上者
- 必背单词_初中英语:2000个必背单词(附音标)汇总,打印背完,3年考高分
- C++:如何在VS中配置第三方动态库 【visual Studio 2017 + Opencv 】
- 如何将日志系统切换到 Logback?
- 9行Python代码搭建神经网络来掌握一些基本概念
- 如何部署Java_web项目到云服务器上
- 10. Django基础:静态文件
- Akash,全球首个去中心化云计算
- 无盘 电影服务器,网吧电影服务器解决方案完全攻略指南
- 关于Jquery使用的一些注意事项
- MySQL基础之二 | 详解(SQL-DDL)
- krpano 场景切换 通知_krpano 场景转换模式
- 易语言EIDE助手(内测体验版),更便捷好用的易语言助手。
- 2021-2025年中国物理疗法电子病历和计费软件行业市场供需与战略研究报告
- 已知二叉树:先序和中序求后序/后序和中序求先序