java处理企业微信会话内容存档

一、定义类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
在这里插入图片描述

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值