public static String decrypt( String encryptedMsg, String timestamp, String nonce, String msgSignature) { try { ApiConfig ac = ApiConfigKit.getApiConfig(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); StringReader sr = new StringReader(encryptedMsg); InputSource is = new InputSource(sr); Document document = db.parse(is); Element root = document.getDocumentElement(); NodeList nodelist1 = root.getElementsByTagName("Encrypt"); // NodeList nodelist2 = root.getElementsByTagName("MsgSignature"); String encrypt = nodelist1.item(0).getTextContent(); // String msgSignature = nodelist2.item(0).getTextContent(); String fromXML = String.format(format, encrypt); String encodingAesKey = ac.getEncodingAesKey(); if (encodingAesKey == null) throw new IllegalStateException( "encodingAesKey can not be null, config encodingAesKey first."); WXBizMsgCrypt pc = new WXBizMsgCrypt(ac.getToken(), encodingAesKey, ac.getAppId()); return pc.decryptMsg( msgSignature, timestamp, nonce, fromXML); // 此处 timestamp 如果与加密前的不同则报签名不正确的异常 } catch (Exception e) { throw new RuntimeException(e); } }
public static String encrypt(String msg, String timestamp, String nonce) { try { ApiConfig ac = ApiConfigKit.getApiConfig(); WXBizMsgCrypt pc = new WXBizMsgCrypt(ac.getToken(), ac.getEncodingAesKey(), ac.getAppId()); return pc.encryptMsg(msg, timestamp, nonce); } catch (Exception e) { throw new RuntimeException(e); } }
/** 如果要支持多公众账号,只需要在此返回各个公众号对应的 ApiConfig 对象即可 可以通过在请求 url 中挂参数来动态从数据库中获取 ApiConfig 属性值 */ public ApiConfig getApiConfig() { ApiConfig ac = new ApiConfig(); // 配置微信 API 相关常量 ac.setToken(PropKit.get("token")); ac.setAppId(PropKit.get("appId")); ac.setAppSecret(PropKit.get("appSecret")); /** 是否对消息进行加密,对应于微信平台的消息加解密方式: 1:true进行加密且必须配置 encodingAesKey 2:false采用明文模式,同时也支持混合模式 */ ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false)); ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file")); return ac; }