详解java微信企业号开发之开发模式的开启步骤

互联网 17-3-15
这篇文章主要为大家详细介绍了java微信企业号开发之开发模式的开启方法,感兴趣的小伙伴们可以参考一下

首先说微信企业号的开发模式分为:编辑模式(普通模式)开发模式(回调模式) ,在编辑模式下,只能做简单的自定义菜单和自动回复消息,要想实现其他功能还得开启开发者模式。

一、编辑模式和开发模式对消息的处理流程

1.编辑模式下,所有的业务流程都配置在微信服务器上,由它处理

2.开发模式,消息通过第三方服务器处理,最后经过微信服务器把消息发送给用户

开发模式能处理的消息比编辑模式多,所以要先开启开发模式才能开发更多功能。

二、开发模式的开启

在回调模式下,企业不仅可以主动调用企业号接口,还可以接收用户的消息或事件。接收的信息使用XML数据格式、UTF8编码,并以AES方式加密

1.开启回调模式后要配置参数如下:

其中url是要访问的servlet,token和EncodingAESKey是随机获取的,但要和项目中保持一致。

2.验证URL的有效性

当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。

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编码的字符串).   * <ol>   * <li>第三方回复加密消息给公众平台</li>   * <li>第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。</li>   * </ol>   * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案   * <ol>   * <li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:   *   http://www.php.cn/;/li>   * <li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>   * <li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>   * <li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>   * </ol>   */  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);   }  }

企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应用对echostr参数解密并原样返回echostr明文(不能加引号),则接入验证生效,回调模式才能开启。开启后一些功能会陆续实现,敬请期待!

以上就是详解java微信企业号开发之开发模式的开启步骤的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:图文详解微信公众平台发布图文消息步骤

相关资讯