接收component_verify_ticket
在第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密(详细请见【消息加解密接入指引】),接收到后必须直接返回字符串success。
POST数据示例
<xml>
<AppId></AppId>
<CreateTime>1413192605 </CreateTime>
<InfoType> </InfoType>
<ComponentVerifyTicket> </ComponentVerifyTicket>
</xml>
接收post请求的xml
第一坑:微信发送的请求中一共有5个参数
@RequestMapping(value = "/getComponentVerifyTicket")
@ResponseBody
public String getComponentVerifyTicket(@RequestParam("timestamp")String timestamp, @RequestParam("nonce")String nonce,
@RequestParam("msg_signature")String msgSignature, @RequestBody String postData){
时间戳 timestamp,随机数nonce , encrypt_type(加密类型,为aes)和msg_signature(消息体签名,用于验证消息体的正确性)以及xml内容
详情见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&lang=zh_CN
第二坑:对xml进行解密(整个项目中最恶心的坑)
下载官方demo
java的文件夹
src下的官方demo
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;
public class Program {
public static void main(String[] args) throws Exception {
//
// 第三方回复公众平台
//
// 需要加密的明文
String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
String token = "pamtest";
String timestamp = "1409304348";
String nonce = "xxxxxx";
String appId = "wxb11529c136998cb6";
String replyMsg = " 中文<xml><ToUserName><![CDATA[oia2TjjewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>";
WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
String mingwen = pc.encryptMsg(replyMsg, timestamp, nonce);
System.out.println("加密后: " + mingwen);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(mingwen);
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 format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
String fromXML = String.format(format, encrypt);
//
// 公众平台发送消息给第三方,第三方处理
//
// 第三方收到公众号平台发送的消息
String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
System.out.println("解密后明文: " + result2);
//pc.verifyUrl(null, null, null, null);
}
}
先把 encodingAesKey , token , timestamp , nonce , appId , replyMsg , msgSignature 都替换成你自己的参数
前两个参数在官网 管理中心-平台详情
因为只做解密,所以去掉不必要的代码
public class Program {
    public static void main(String[] args) throws Exception {
        // 需要加密的明文
        String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG";
        String token = "pamtest";
        String timestamp = "1409304348";
        String nonce = "xxxxxx";
        String appId = "wxb11529c136998cb6";
        String replyMsg = " 中文<xml><ToUserName><![CDATA[oia2TjjewbmiOUlr6X-1crbLOvLw]]></ToUserName><FromUserName><![CDATA[gh_7f083739789a]]></FromUserName><CreateTime>1407743423</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[eYJ1MbwPRJtOvIEabaxHs7TX2D-HV71s79GUxqdUkjm6Gs2Ed1KF3ulAOA9H1xG0]]></MediaId><Title><![CDATA[testCallBackReplyVideo]]></Title><Description><![CDATA[testCallBackReplyVideo]]></Description></Video></xml>";
        WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
        String msgSignature = nodelist2.item(0).getTextContent();
        String result2 = pc.decryptMsg(msgSignature, timestamp, nonce, fromXML);
        System.out.println("解密后明文: " + result2);
        //pc.verifyUrl(null, null, null, null);
    }
}
把replyMsg换成微信传过来的xml密文,msgSignature换成微信请求传过来的参数msg_signature
如果出现java.security.InvalidKeyException: Illegal key size这个异常,恭喜你,掉进全是屎的坑里了
别人的解决方法http://www.cnblogs.com/gdayq/p/5919252.html
正常来讲参数都正确的话到这里解密就成功了run一下main方法
如果出现类似xml解析失败什么的,把xml里的AppId手动替换成ToUserName再试一次
对解密成功后的xml进行解析,我是用以前微信支付的工具把xml转成map再提取参数
需要的拿去
public static Map<String, String> xmlToMap(String strXML) throws Exception {
try {
Map<String, String> data = new HashMap<String, String>();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
Document doc = documentBuilder.parse(stream);
doc.getDocumentElement().normalize();
NodeList nodeList = doc.getDocumentElement().getChildNodes();
for (int idx = 0; idx < nodeList.getLength(); ++idx) {
Node node = nodeList.item(idx);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
data.put(element.getNodeName(), element.getTextContent());
}
}
try {
stream.close();
} catch (Exception ex) {
// do nothing
}
return data;
} catch (Exception ex) {
//            WXPayUtil.getLogger().warn("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML);
throw ex;
}
}
然后提取出ComponentVerifyTicket,并保存(之后要用)
怎么保存随意,数据库也好,缓存也好,用静态类存一下也行
ComponentInfo.componentVerifyTicket = xmlMap.get("ComponentVerifyTicket");

微信第三方平台开发经验总结(一):接收component_verify_ticket相关推荐

  1. 微信第三方平台开发经验总结(六):接收微信用户发送的事件以及消息

    接收微信用户发送的事件以及消息 进入第三方平台的管理中心,查看并保存以下信息 确认预设的公众号消息与事件接收URL 把token和key保存在项目的静态类中或者数据库中,方便随时调用 微信公众平台技术 ...

  2. 微信第三方平台开发经验总结(四):重定向到授权页

    重定向到授权页 步骤2:引入用户进入授权页 第三方平台方可以在自己的网站:中放置"微信公众号授权"或者"小程序授权"的入口,引导公众号和小程序管理员进入授权页. ...

  3. 微信第三方平台授权流程- java

    1. 微信第三方平台的开发,第一步就是公众号的授权,授权成功后第三方凭条才能利用公众号的appid和token获得公众账号额信息,并代替公众账号完成一些功能. 2. 授权的流程,理论图 代码流程, 1 ...

  4. 用微信第三方平台授权小程序业务

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 本文章转自php中文网:http://www.php.cn/weixin-kaifa-4069 ...

  5. 微信第三方平台开发错误码集合,各种 code

    微信第三方平台开发错误码集合 PHP static $codes = array("-1" => "系统繁忙","0" => & ...

  6. 微信第三方平台开发流程和总结

    微信第三方平台开发流程和总结 创建第三方平台 1).在微信开放平台-管理中心-第三方平台中创建第三方平台账号.创建第三方平台 2).选择"平台型服务商类型"创建第三方平台.填写第三 ...

  7. 微信第三方平台集成公众号发送模板消息

    最近老板下发了个任务,有一个业务是整合用户的微信公众号(服务号),然后在我们的erp系统里给下家客户发送模板消息,找了一下发现微信第三方平台可以实现,那就干起来. 先在微信开放平台,申请一个第三方平台 ...

  8. 微信第三方平台开发接入

    微信第三方平台开发接入 授权流程接入步骤如下:( 微信https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=res ...

  9. 服务器端无微信第三方平台事件传入,致使粉丝关注、公众号自动回复失效

    项目场景: 提示:微信第三方平台无接收事件: 服务器端无事件传入,致使粉丝关注.公众号自动回复失效 问题描述 发送文字测试后,微信提示"该公众号提供的服务出现故障,请稍后再试" 原 ...

最新文章

  1. linux shell脚本 引入外部shell文件
  2. 镜像的分层结构 - 每天5分钟玩转容器技术(11)
  3. python 数据去重_python 对数据常用的几种去重方式
  4. 查看是否安装android sdk
  5. SparkSQL练习+理解+详解
  6. php mysql-proxy报错_MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误...
  7. G4560 HD610安装黑苹果Hakintosh
  8. 读取excel并将其转换为xml
  9. 关于redis的几点思考
  10. js时间对象相关函数
  11. H3C无线终端准入流程
  12. bootstrap 可以拖动 表格宽度_table表格列宽可拖动
  13. 论文重复率太高怎么降重修改
  14. fixed定位失效问题如何解决
  15. BZOJ 2429: [HAOI2006]聪明的猴子 MST
  16. tomcat配置https(jks)证书,启动后提示Keystore was tampered with, or password was incorrect
  17. eureka:自我保护机制_对自我怀疑的开发人员:您足够好吗?
  18. 办公效率该怎么提高呢?五个高效办公小技巧分享给你,职场的你必备的神器。
  19. 《微服务设计》(二)---- 演变式架构师
  20. 深圳打卡(四) 红树林与深圳湾公园

热门文章

  1. 群晖Nas通过jellyfin搭建本地影音库详细全过程(二):jellyfin影音库信息手动刮削和相关设置(100%扫库成功)
  2. apksigner(一级命令)
  3. Docker容器一夜成名的故事
  4. unity3d:UGUI卷轴展开动画效果
  5. nodejs下image-size统计图片的尺寸
  6. 淘宝直播自动匹配关键词回复指定内容
  7. 软件盗版被查怎么办?
  8. 射手播放器编译错误解决方法(splayer)
  9. YYYY-MM-dd
  10. 制作全景图的软件都有哪些?全景图怎么制作做的?