成都创新互联网站制作重庆分公司

java微信企业号开发之开发模式如何开启

这篇文章主要介绍java微信企业号开发之开发模式如何开启,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

10年积累的成都网站设计、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有穆棱免费网站建设让你可以放心的选择与我们合作。

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

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

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

java微信企业号开发之开发模式如何开启

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

java微信企业号开发之开发模式如何开启

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

二、开发模式的开启

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

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

java微信企业号开发之开发模式如何开启

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

2.验证URL的有效性

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

java微信企业号开发之开发模式如何开启

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

以上是“java微信企业号开发之开发模式如何开启”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!


名称栏目:java微信企业号开发之开发模式如何开启
文章来源:http://cxhlcq.com/article/gcchsj.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部