java微信企业号开发之开发模式如何开启
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍java微信企业号开发之开发模式如何开启,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先说微信企业号的开发模式分为:编辑模式(普通模式)和开发模式(回调模式)
千家信息网最后更新 2025年01月22日java微信企业号开发之开发模式如何开启
这篇文章主要介绍java微信企业号开发之开发模式如何开启,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
首先说微信企业号的开发模式分为:编辑模式(普通模式)和开发模式(回调模式) ,在编辑模式下,只能做简单的自定义菜单和自动回复消息,要想实现其他功能还得开启开发者模式。
一、编辑模式和开发模式对消息的处理流程
1.编辑模式下,所有的业务流程都配置在微信服务器上,由它处理
2.开发模式,消息通过第三方服务器处理,最后经过微信服务器把消息发送给用户
开发模式能处理的消息比编辑模式多,所以要先开启开发模式才能开发更多功能。
二、开发模式的开启
在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密。
1.开启回调模式后要配置参数如下:
其中url是要访问的servlet,token和EncodingAESKey是随机获取的,但要和项目中保持一致。
2.验证URL的有效性
当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。
3.代码
CoreServlet1类
public class CoreServlet1 extends HttpServlet { private static final long serialVersionUID = 4440739483644821986L; String sToken = "weixinCourse"; String sCorpID = "wxe510946434680dab"; String sEncodingAESKey = "DjlyZxgKiWRESIW2VnV9dSr7HsS7usWDfnwA8Q1ove1"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { WXBizMsgCrypt wxcpt; try { wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); String sVerifyMsgSig = request.getParameter("msg_signature"); String sVerifyTimeStamp = request.getParameter("timestamp"); String sVerifyNonce = request.getParameter("nonce"); String sVerifyEchoStr = request.getParameter("echostr"); String sEchoStr; sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr); System.out.println("verifyurl echostr: " + sEchoStr); PrintWriter out = response.getWriter(); out.print(sEchoStr); out.close(); out = null; } catch (AesException e1) { e1.printStackTrace(); } }}
工具类:
/** * 对公众平台发送给公众账号的消息加解密示例代码. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */// ------------------------------------------------------------------------/** * 针对org.apache.commons.codec.binary.Base64, * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本) * 官方下载地址:http://www.php.cn/ */package com.qq.weixin.mp.aes;import java.nio.charset.Charset;import java.util.Arrays;import java.util.Random;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/** * 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串). **
* 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案 *- 第三方回复加密消息给公众平台
*- 第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。
**
*/public class WXBizMsgCrypt { static Charset CHARSET = Charset.forName("utf-8"); Base64 base64 = new Base64(); byte[] aesKey; String token; String corpId; /** * 构造函数 * @param token 公众平台上,开发者设置的token * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey * @param corpId 企业的corpid * * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息 */ public WXBizMsgCrypt(String token, String encodingAesKey, String corpId) throws AesException { if (encodingAesKey.length() != 43) { throw new AesException(AesException.IllegalAesKey); } this.token = token; this.corpId = corpId; aesKey = Base64.decodeBase64(encodingAesKey + "="); } /** * 对密文进行解密. * * @param text 需要解密的密文 * @return 解密得到的明文 * @throws AesException aes解密失败 */ String decrypt(String text) throws AesException { byte[] original; try { // 设置解密模式为AES的CBC模式 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16)); cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); // 使用BASE64对密文进行解码 byte[] encrypted = Base64.decodeBase64(text); // 解密 original = cipher.doFinal(encrypted); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.DecryptAESError); } String xmlContent, from_corpid; try { // 去除补位字符 byte[] bytes = PKCS7Encoder.decode(original); // 分离16位随机字符串,网络字节序和corpId byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); int xmlLength = recoverNetworkBytesOrder(networkOrder); xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET); from_corpid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.IllegalBuffer); } // corpid不相同的情况 if (!from_corpid.equals(corpId)) { throw new AesException(AesException.ValidateCorpidError); } return xmlContent; } /** * 验证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; }} /** * 对公众平台发送给公众账号的消息加解密示例代码. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */// ------------------------------------------------------------------------package com.qq.weixin.mp.aes;import java.security.MessageDigest;import java.util.Arrays;/** * SHA1 class * * 计算公众平台的消息签名接口. */class SHA1 { /** * 用SHA1算法生成安全签名 * @param token 票据 * @param timestamp 时间戳 * @param nonce 随机字符串 * @param encrypt 密文 * @return 安全签名 * @throws AesException */ public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException { try { String[] array = new String[] { token, timestamp, nonce, encrypt }; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0; i < 4; i++) { sb.append(array[i]); } String str = sb.toString(); // SHA1签名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.ComputeSignatureError); } }} class PKCS7Encoder { static Charset CHARSET = Charset.forName("utf-8"); static int BLOCK_SIZE = 32;/** * 删除解密后明文的补位字符 * * @param decrypted 解密后的明文 * @return 删除补位字符后的明文 */ static byte[] decode(byte[] decrypted) { int pad = (int) decrypted[decrypted.length - 1]; if (pad < 1 || pad > 32) { pad = 0; } return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); }}- 在官方网站下载JCE无限制权限策略文件(JDK7的下载地址: * http://www.php.cn/;/li> *
- 下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt
*- 如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件
*- 如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件
*
以上是"java微信企业号开发之开发模式如何开启"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
模式
开发
消息
公众
企业
平台
字符
参数
文件
处理
信息
字符串
密文
明文
错误
验证
安全
代码
开发者
接口
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
本地服务器文件恢复
网络安全公司与产品介绍
wpf 实时提交数据库
为什么设置代理服务器抓不到包
区块链网络安全技巧
女生的服务器
戴尔t620服务器列阵
在数据库中怎么加事务
网络安全宣传活动的手抄报
数据库坐标转换用什么软件
本地出行软件开发商
网络安全法公民如何做
国防网络安全部门
宝酷网络技术
天天象棋登录服务器异常
重庆网络安全专业
bms服务器
一年一度网络安全周
应用多的软件开发
数字化展厅软件开发要求
数据库查询姓名的长度
枣庄网络安全审计
郑州星云软件开发有限公司
软件开发纪律
tcl软件开发招聘信息
清华大学网络安全实验室
学好数据库和java能做什么
数据库备份 远程复制
软件开发平台 趋势
网络安全相关规定