一、定义类RSAEncrypt做加解密处理
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import javax.crypto.Cipher;
import java.io.Reader;
import java.io.StringReader;
import java.security.*;
/**
* @author wl
* @version 1.0
* @description: TODO
* @date 2021/6/28 15:36
*/
public class RSAEncrypt {
public static String decryptRSA(String str, String privateKey) throws Exception {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
rsa.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKey));
byte[] utf8 = rsa.doFinal(Base64.decodeBase64(str));
String result = new String(utf8,"UTF-8");
return result;
}
public static PrivateKey getPrivateKey (String privateKey) throws Exception {
Reader privateKeyReader = new StringReader(privateKey);
PEMParser privatePemParser = new PEMParser(privateKeyReader);
Object privateObject = privatePemParser.readObject();
if (privateObject instanceof PEMKeyPair) {
PEMKeyPair pemKeyPair = (PEMKeyPair) privateObject;
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
PrivateKey privKey = converter.getPrivateKey(pemKeyPair.getPrivateKeyInfo());
return privKey;
}
return null;
}
}
二、引用企业微信提供的工具类Finance(需要修改静态方法中获取dll文件方式)
public class Finance {
public native static long NewSdk();
public native static int Init(long sdk, String corpid, String secret);
public native static int GetChatData(long sdk, long seq, long limit, String proxy, String passwd, long timeout, long chatData);
public native static int GetMediaData(long sdk, String indexbuf, String sdkField, String proxy, String passwd, long timeout, long mediaData);
public native static int DecryptData(long sdk, String encrypt_key, String encrypt_msg, long msg);
public native static void DestroySdk(long sdk);
public native static long NewSlice();
public native static void FreeSlice(long slice);
public native static String GetContentFromSlice(long slice);
public native static int GetSliceLen(long slice);
public native static long NewMediaData();
public native static void FreeMediaData(long mediaData);
public native static String GetOutIndexBuf(long mediaData);
public native static byte[] GetData(long mediaData);
public native static int GetIndexLen(long mediaData);
public native static int GetDataLen(long mediaData);
public native static int IsMediaDataFinish(long mediaData);
static {
if (isWindows()) {
String path = Finance.class.getResource("").getPath().replaceAll("%20", " ").replaceFirst("/", "").replace("/", "\\\\");
System.out.println(path.concat("libeay32.dll"));
System.load(path.concat("libeay32.dll"));
System.load(path.concat("libprotobuf.dll"));
System.load(path.concat("ssleay32.dll"));
System.load(path.concat("libcurl.dll"));
System.load(path.concat("WeWorkFinanceSdk.dll"));
} else {
String path = Finance.class.getResource("").getPath();
System.load(path.concat("libWeWorkFinanceSdk_Java.so"));
}
}
public static boolean isWindows() {
String osName = System.getProperties().getProperty("os.name");
System.out.println("current system is " + osName);
return osName.toUpperCase().indexOf("WINDOWS") != -1;
}
三、编写主业务
import org.json.JSONArray;
import org.json.JSONObject;
public class FinanceTestDemo {
static String priKey ="-----BEGIN RSA PRIVATE KEY-----\n" +
"密钥\n" +
"-----END RSA PRIVATE KEY-----";
public static void main(String[] args) {
long sdk = Finance.NewSdk();
System.out.println(Finance.Init(sdk, "企业id", "会话密钥"));
long ret = 0;
int seq = 0;
int limit =20;
long slice = Finance.NewSlice();
ret = Finance.GetChatData(sdk, seq, limit,null, null, 3, slice);
if (ret != 0) {
System.out.println("getchatdata ret " + ret);
return;
}
String getchatdata = Finance.GetContentFromSlice(slice);
JSONObject jo = new JSONObject(getchatdata);
JSONArray chatdata = jo.getJSONArray("chatdata");
System.out.println("消息数:" + chatdata.length());
for (int i = 0; i < chatdata.length(); i++) {
String item = chatdata.get(i).toString();
JSONObject data = new JSONObject(item);
String encrypt_random_key = data.getString("encrypt_random_key");
String encrypt_chat_msg = data.getString("encrypt_chat_msg");
long msg = Finance.NewSlice();
try {
String message = RSAEncrypt.decryptRSA(encrypt_random_key,priKey);
ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg);
if (ret != 0) {
System.out.println("getchatdata ret " + ret);
return;
}
System.out.println("decrypt ret:" + ret + " msg:" + Finance.GetContentFromSlice(msg));
Finance.FreeSlice(msg);
System.out.println(message);
} catch (Exception e) {
e.printStackTrace();
}
}
Finance.FreeSlice(slice);
}
}
四、项目目录结构
疑问:
不知道为什么必须得是这个结构才可以,不是这个结构就会报错
五、所需pom文件
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.56</version>
</dependency>
六、因为target打包不会包含dll文件,所以pom中还需要添加
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.dll</include>
<include>**/*.so</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
关于文件:libWeWorkFinanceSdk_Java.so获取
https://developer.work.weixin.qq.com/document/path/91774
根据linux或者windows获取SDK