liyiorg / weixin-popular

微信SDK JAVA (公众平台、开放平台、 商户平台、 服务商平台)
Apache License 2.0
2.5k stars 1.06k forks source link

可否增加一个类,以方便解密,微信每10分钟会发送加密消息给open平台的第三方应用 #147

Closed xtwvf207 closed 6 years ago

xtwvf207 commented 6 years ago

包 weixin.popular.bean.component下,可否增加一个类ComponentEncryptXML.java用于解密微信定时10分钟每次发送过来的加密数据。

package weixin.popular.bean.component;

import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "xml") @XmlAccessorType(XmlAccessType.FIELD) public class ComponentEncryptXML {

@XmlElement(name = "AppId")
private String appId;

@XmlElement(name = "Encrypt")
private String encrypt;

public String getAppId() {
    return appId;
}

public void setAppId(String appId) {
    this.appId = appId;
}

public String getEncrypt() {
    return encrypt;
}

public void setEncrypt(String encrypt) {
    this.encrypt = encrypt;
}

}

liyiorg commented 6 years ago

@xtwvf207 发下相关文档的链接

xtwvf207 commented 6 years ago

主要是在安全模式下,微信给第三方系统的通知,是加密后的 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=&lang=zh_CN

拿每隔10分钟,微信发给第三方的数据举例: 我们收到的数据如下: <xml> <AppId><![CDATA[wxee9eaed635441255]]></AppId> <Encrypt><![CDATA[i0Daw26UQhti4FUu2OdCz3bMZZTH5/G68Vhu9xo6vui5mt2AP3vEVmzWhR+HdVZuwtxVGPWQV/r5OhP4WZrGv2m6bfXgvC3m91yFpWxr8+lW2jo+nZH7zk3/eKkOpzlg+UT2m9rQR3N19Drt97x1/TTy7XbZqpoUaWMX1pUK87Jpd0UdOZ/nTQKDdb6OHom/7LaddBWWPVTCarOAQB+GbDZT7HKSqgsuvCw6z3wKOiUk3lxoFcqhyZ8eyD5XzuQy6/RsYuCrC4iXoapRIxKC8f/El0HwcigX5WljmfbAuF7UN8HFFoeysAUzIN7xrNGbN8wHy06ebI7XQr+8GC5jAEgH3RpGRoqenXbhIdnuM4b50b9CPGMjSyGwXLsZGpqtBfdV/E8nc+Rib7CV0b88McxcuJ4Ej3rD3vGQ8kG3OLu7fo9Ifqiw+QDG2QhFGJrd6KZOcmy2rz+EQuA7IAn/Qg==]]></Encrypt></xml>

其中,我们把Encrypt中的内容进行解密,解密后的数据为:

<xml><AppId><![CDATA[wxee9eaed635441255]]></AppId>
<CreateTime>1523869379</CreateTime>
<InfoType><![CDATA[component_verify_ticket]]></InfoType>
<ComponentVerifyTicket><![CDATA[ticket@@@YKpz2m7RaMnH7zeGhWS2gDBh56Y_5SMfuO4f6MfslcE0pClowYHTjKD5HOrcpH8LfhaRnr2t3AAQt55qAuhN5Q]]></ComponentVerifyTicket>
</xml>

如果不是安全模式,那么第三方平台收到的数据,就直接是上面的xml内容。

另外,还有其它格式,比如,加密消息,那么加密的数据格式为:

<xml>
<ToUserName></ToUserName>
<Encrypt></Encrypt>
</xml>

所以,针对加密消息,可能还需要创建一个javaBean。

解密之后,变成:

<xml>
<ToUserName></ToUserName>
<FromUserName></FromUserName>
<CreateTime>1411035097</CreateTime>
<MsgType></MsgType>
<Content></Content>
<MsgId>6060349595123187712</MsgId>
</xml>

参考网址: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=&lang=zh_CN

liyiorg commented 6 years ago

@xtwvf207 对于api 调用我们主要关心的是解密后数据,可以使用以下方式操作:

String postData = StreamUtils.copyToString(inputStream, Charset.forName("utf-8"));
//使用 XMLConverUtil 将数据转成map ,
XMLConverUtil.convertToMap(postData);
xtwvf207 commented 6 years ago

恩,很有道理。就按照你说的,我修改一下我这边代码。谢谢!