首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信公众号指定用户推送消息以及微信小程序加密数据解密算法

微信公众号指定用户推送消息以及微信小程序加密数据解密算法

作者头像
芈亓
发布于 2022-06-17 06:40:52
发布于 2022-06-17 06:40:52
70900
代码可运行
举报
文章被收录于专栏:笔记2022笔记2022
运行总次数:0
代码可运行

首先需要创建一个maven工程

1.在自己的pom中加入如下代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>
 
 <dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.4</version>
</dependency>
 
<dependency> 
    <groupId>net.sf.json-lib</groupId> 
    <artifactId>json-lib</artifactId> 
    <version>2.2.3</version> 
    <classifier>jdk15</classifier> 
</dependency>
2.写实现类AES
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.chwl.medical.crypto.wx;
 
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
 
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 org.bouncycastle.jce.provider.BouncyCastleProvider;
 
/**
 * AES加密
 * @author liuyazhuang
 *
 */
public class AES {
	
	public static boolean initialized = false;
 
	/**
	 * AES解密
	 * 
	 * @param content
	 *            密文
	 * @return
	 * @throws InvalidAlgorithmParameterException
	 * @throws NoSuchProviderException
	 */
	public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
		initialize();
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
			Key sKeySpec = new SecretKeySpec(keyByte, "AES");
			cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
			byte[] result = cipher.doFinal(content);
			return result;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		} catch (NoSuchProviderException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
 
	public static void initialize() {
		if (initialized)
			return;
		Security.addProvider(new BouncyCastleProvider());
		initialized = true;
	}
 
	// 生成iv
	public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
		AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
		params.init(new IvParameterSpec(iv));
		return params;
	}
}
3.编写实现WxPKCS7Encoder类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.chwl.medical.crypto.wx;
 
import java.nio.charset.Charset;
import java.util.Arrays;
 
 
/**
 * 微信小程序加解密
 * @author liuyazhuang
 *
 */
public class WxPKCS7Encoder {
	private static final Charset CHARSET = Charset.forName("utf-8");
	private static final int BLOCK_SIZE = 32;
 
	/**
	 * 获得对明文进行补位填充的字节.
	 *
	 * @param count
	 *            需要进行填充补位操作的明文字节个数
	 * @return 补齐用的字节数组
	 */
	public static byte[] encode(int count) {
		// 计算需要填充的位数
		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
		if (amountToPad == 0) {
			amountToPad = BLOCK_SIZE;
		}
		// 获得补位所用的字符
		char padChr = chr(amountToPad);
		String tmp = new String();
		for (int index = 0; index < amountToPad; index++) {
			tmp += padChr;
		}
		return tmp.getBytes(CHARSET);
	}
 
	/**
	 * 删除解密后明文的补位字符
	 *
	 * @param decrypted
	 *            解密后的明文
	 * @return 删除补位字符后的明文
	 */
	public static byte[] decode(byte[] decrypted) {
		int pad = decrypted[decrypted.length - 1];
		if (pad < 1 || pad > 32) {
			pad = 0;
		}
		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
	}
 
	/**
	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
	 *
	 * @param a
	 *            需要转化的数字
	 * @return 转化得到的字符
	 */
	public static char chr(int a) {
		byte target = (byte) (a & 0xFF);
		return (char) target;
	}
}
4.编写实现WXCore类(这个类主要是对具体算法的封装,统一对外提供方法。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.chwl.medical.crypto.wx;
 
import org.apache.commons.codec.binary.Base64;
 
import net.sf.json.JSONObject;
 
 
/**
 * 封装对外访问方法
 * @author liuyazhuang
 *
 */
public class WXCore {
	
	private static final String WATERMARK = "watermark";
	private static final String APPID = "appid";
	/**
	 * 解密数据
	 * @return
	 * @throws Exception
	 */
	public static String decrypt(String appId, String encryptedData, String sessionKey, String iv){
		String result = "";
		try {
			AES aes = new AES();  
		    byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));  
		    if(null != resultByte && resultByte.length > 0){  
		        result = new String(WxPKCS7Encoder.decode(resultByte));  
		    	JSONObject jsonObject = JSONObject.fromObject(result);
		    	String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString(APPID);
		    	if(!appId.equals(decryptAppid)){
		    		result = "";
		    	}
	        }  
		} catch (Exception e) {
			result = "";
			e.printStackTrace();
		}
	    return result;
	}
	
	
	public static void main(String[] args) throws Exception{
	   String appId = "wx4f4bc4dec97d474b";
	   String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
	   String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
	   String iv = "r7BXXKkLb8qrSNn05n0qiA==";
       System.out.println(decrypt(appId, encryptedData, sessionKey, iv));
    }
}

通过上面的代码就可以获取到openid和unionid,然后就可以通过unionid发送消息给指定用户啦! 亲测可用,有什么不懂得大家提出来一起解决!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java之——实现微信小程序加密数据解密算法
微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法。这着实让广大的Java开发人员蛋疼。
良月柒
2019/03/19
1.1K0
原来Java是这样实现微信小程序加密与解密数据算法的!超赞的有木有?!
微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法。这着实让广大的Java开发人员蛋疼。
冰河
2020/10/29
6660
原来Java是这样实现微信小程序加密与解密数据算法的!超赞的有木有?!
JAVA版微信小程序用户数据的签名验证和加解密
签名验证和加解密 数据签名校验 为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。 签名校验算法涉及用户的session_key,通过 wx.login 登录流程获取用户session_key,并自行维护与应用自身登录态的对应关系。 通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key
小柒2012
2018/04/13
1.8K0
微信小程序获取手机号
微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤 实现思路,步骤如下 1.前端需先调用官方wx.login接口获取登录凭证code。 2.后端接收code 调用官方接口地址获取用户秘钥 sessionKey。 3.前端通过官方getPhoneNumber获取encryptedData,iv 4.前端通过参数**【encryptedData】 、【iv】 、【sessionKey】** 发送请求后端接口,解密用户手机号
崔笑颜
2020/07/17
3.3K0
小程序 获取用户信息
小程序端 一、页面index.js var commRequest=require("../../request/commRequest.js"); Page({ /** * 页面
用户5899361
2020/12/07
1.4K0
微信小程序之获取并解密用户数据(获取openid,nickName等)
本文主要总结微信小程序通过后台请求访问微信用户信息 创建一个微信小程序工程(自行百度) 微信小程序index.js代码 //index.js //获取应用实例 const app = getApp() Page({ data: { motto: 'Hello World', userInfo: {}, backUserInfo:{},//后台得到的微信用户信息 hasUserInfo: false, canIUse: wx.canIUse('button.o
小帅丶
2021/12/28
5.3K0
微信小程序之获取并解密用户数据(获取openid,nickName等)
解密微信小程序加密信息
  获取微信程序人员信息之后,会给一个加密字符串,这个时候,前端不太好解密,因为浪费性能,会请求后端解密,那么后端如何解密呢?demo来说话;
allsmallpig
2021/02/25
1.1K0
微信小程序如何获取用户手机号 ?
1、小程序端调用 wx.login() 方法,获取 code 后,将 code 通过后台 api 接口传递到后台。
热心的程序员
2020/03/20
9.3K2
​微信小程序如何获取用户手机号 ?
1、小程序端调用 wx.login() 方法,获取 code 后,将 code 通过后台 api 接口传递到后台。
热心的程序员
2020/03/09
12.7K1
​微信小程序如何获取用户手机号 ?
进击微信小程序-Java版AES/CBC/PKCS7Padding加解密字符串
进击微信小程序,最初找到腾讯云给的解决方案,无奈后端是node.js,而且才一开始配上去还不能用,之后仔细看readme,摸到它开源的Wafer,本来以为找到终极解决方案了,仔细看后,发现提供的java方面仅有业务服务器端的代码(要不要如此“歧视”= =),会话服务器只有一个php版的,信道服务。。就更不用说了。于是乎只能自己啃了。
WindCoder
2018/09/20
2.3K0
进击微信小程序-Java版AES/CBC/PKCS7Padding加解密字符串
微信小程序+Java获取用户授权手机号码
小程序内可以直接通过授权获取用户微信号绑定的手机号码或用户添加的其他手机号码,这样可以使得小程序在进行账户的身份可控上又提高了一步,那么应该如何来获取手机号码呢?这篇文章就和大家一起来研究一下。
炒香菇的书呆子
2021/02/16
1.9K0
微信小程序+Java获取用户授权手机号码
微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)
signature,//签名、encryptedData,//用户敏感信息、iv//解密算法的向量:
好好学java
2018/07/17
3.4K1
微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)
Java.Utils:AES-128-CBC 加密方式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127712.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
1.6K0
Java实现微信跳一跳抓包修改分数
原改分代码为Python代码, import requests import json import time from Crypto.Cipher import AES import base64 action_data = { "score": 10086, "times": 666, "game_data": "{}" } session_id = "5TrXoE7IXtM/Nr7vITnbU9bmR53VH0u8RkVnm6m/Fezg==" aes_key = ses
杨逸轩
2018/06/14
1.4K0
前后端请求AES加解密
AES前后端加解密 前端 安装依赖 npm install --save crypto-js 工具类 const CryptoJS = require("crypto-js"); exports.aes = { // 加密 encrypt: function (str, key) { return CryptoJS.AES.encrypt(str, key).toString(); }, //解密 decrypt: function (str, key) { let b
码客说
2021/05/13
6.1K0
【详解】Java实现与JS相同的Des加解密算法
在开发过程中,我们常常需要在不同的编程语言之间进行数据的加密和解密操作。本文将介绍如何在Java中实现与JavaScript相同的DES(Data Encryption Standard)加解密算法,确保在两个平台之间可以无缝地传递加密信息。
大盘鸡拌面
2025/04/07
2230
好玩的接口 之 Java 解密微信小程序获取手机号
官方地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
贺biubiu
2021/01/19
3.2K0
哈希算法是对称算法还是非对称算法_对称加密和非对称加密原理
作用:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希算法的目的:为了验证原始数据是否被篡改。 哈希算法最重要的特点就是: 相同的输入一定得到相同的输出; 不同的输入大概率得到不同的输出。
全栈程序员站长
2022/11/01
1.3K0
python笔记43-加解密AES/CBC/pkcs7padding
有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回。
上海-悠悠
2019/10/24
3.7K0
Android开发笔记(七十二)数据加密算法
编码算法 URL编码 URL编码其实并非加解密算法,只是对特殊字符进行字符转义,从而方便在URL中传输参数。URL编码有两种方式,一种是狭义的URL编码,另一种是广义的URL编码。 狭义的URL
aqi00
2019/01/18
8690
推荐阅读
相关推荐
Java之——实现微信小程序加密数据解密算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验