在微信公众号刚刚开始配置开发中的基本配置时,
根据接入指南 (https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319)提示是三个参数进行操作
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
在本页中的详情请参考消息体签名及加解密部分的文档 。
根据路径中提供的示例代码
下载JAVA示例代码,在WXBizMsgCrypt.java中提供了验证url的方法
/** * 验证URL * @param msgSignature 签名串,对应URL参数的msg_signature * @param timeStamp 时间戳,对应URL参数的timestamp * @param nonce 随机串,对应URL参数的nonce * @param echoStr 随机串,对应URL参数的echostr * * @return 解密之后的echostr * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 */ public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr) throws AesException { String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr); if (!signature.equals(msgSignature)) { throw new AesException(AesException.ValidateSignatureError); } String result = decrypt(echoStr); return result; } |
并提供了test方法
@Test public void testVerifyUrl() throws AesException { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt( "QDG6eK" , "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C" , "wx5823bf96d3bd56c7" ); String verifyMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3" ; String timeStamp = "1409659589" ; String nonce = "263014780" ; String echoStr = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==" ; wxcpt.verifyUrl(verifyMsgSig, timeStamp, nonce, echoStr); // 只要不抛出异常就好 } |
测试代码和源码非常清晰,可以通过测试
但是实际开发中的echoStr参数是不会加密的,无论选择以下[明文模式][兼容模式][安全模式] 其中echoStr参数都是19位的数字
作为开发自行调用源码API进行加密,在原有测试代码上做尝试,进行解密自行加密,再次调用方法,发现并不可行.
@Test public void testVerifyUrl() throws AesException { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt( "QDG6eK" , "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C" , "wx5823bf96d3bd56c7" ); String verifyMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3" ; String timeStamp = "1409659589" ; String nonce = "263014780" ; String echoStr = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==" ; //解密 String decrypt = wxcpt.decrypt(echoStr); System.out.println( "解密后:" +decrypt); //加密 echoStr = wxcpt.encrypt(wxcpt.getRandomStr(),decrypt); System.out.println( "加密后:" +echoStr); //解密 decrypt = wxcpt.decrypt(echoStr); System.out.println( "再次解密:" +decrypt); wxcpt.verifyUrl(verifyMsgSig, timeStamp, nonce, echoStr); // 只要不抛出异常就好 } |
解密后: 1616140317555161061 加密后:HfgmaBM9GWwZLn3y8TYiDSLw2oDqVYcXO+IFJiXLVs+ptZRESUO743aYZkbCROtR6IrKB75azeSZBDtG2VHu6Q== 再次解密: 1616140317555161061 |
不知道如何利用这套源码进行开发.
开发环境:JDK1.8 Spring boot 2.1.1.RELEASE commons-codec1.9(使用pom文件引入,否则默认使用是1.11版本)
< dependency > < groupId >commons-codec</ groupId > < artifactId >commons-codec</ artifactId > < version >1.9</ version > </ dependency > |
如有其它问题请回帖留言,我近期关注此贴
echostr是随机串,不加密的。
为什么没有管理员回复我.两天了是我反馈错地方了么
2019年6月25日
明明编辑的时候代码有格式的,为什么发布成文章就没有格式了.
帖子简版意思:demo和真实接口参数以及文档三者匹配不对
2019年7月6日
没有解决,也不指望了,已从收藏夹删除.