Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명

高洛峰
풀어 주다: 2017-03-15 17:49:07
원래의
2475명이 탐색했습니다.

이 글에서는 주로 Java WeChat 기업 계정 개발 모드를 여는 방법을 자세히 소개합니다. 관심 있는 친구들은 이를 참고할 수 있습니다.

우선, WeChat 기업 계정 개발 모드는 다음과 같이 나뉩니다. 🎜>편집 모드(일반 모드)개발 모드(콜백 모드) 편집 모드에서는 간단한 사용자 정의 메뉴만 수행할 수 있으며 자동으로 수행됩니다. 메시지에 답장을 보내세요. 다른 기능을 사용하려면 개발자 모드를 켜야 합니다.

1. 편집 모드와 개발 모드의 메시지 처리 프로세스

1. 편집 모드에서는 모든 비즈니스 프로세스가 WeChat 서버에 구성되어 처리됩니다.

Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명

2. 개발 모드에서는 메시지가 타사 서버를 통해 처리되고 최종적으로 메시지가 WeChat 서버를 통해 사용자에게 전송됩니다.

Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명

개발 모드는 편집 모드보다 더 많은 메시지를 처리할 수 있으므로, 더 많은 기능을 개발하려면 먼저 개발 모드를 활성화해야 합니다.

2. 개발 모드 켜기

콜백 모드에서 기업은 기업 계정

인터페이스 를 적극적으로 호출할 수 있을 뿐만 아니라 사용자 또는 이벤트. 수신된 정보는 XML 데이터 형식, UTF8 인코딩을 사용하고 AES로 암호화됩니다.

1. 콜백 모드를 켠 후 다음과 같이 매개변수를 구성합니다.

Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명

URL은

서블릿 접근을 위해서는 토큰과 EncodingAESKey를 무작위로 획득하되, 프로젝트의 키와 일치해야 합니다.

2. URL의 유효성을 확인하세요

위 정보를 제출하면 기업 계정이 입력된 URL로 GET 요청을 보냅니다.

기업에서 가져올 때 urldecode 처리를 해야 합니다. 그렇지 않으면 인증이 실패합니다.

Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명

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();
 }
 
  }
}
로그인 후 복사

Tool 클래스 :


 /**
 * 对公众平台发送给公众账号的消息加解密示例代码.
 * 
 * @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);
 }
}
로그인 후 복사

3. 요약
기업은 msg_signature 매개변수를 통해 요청을 확인합니다. 요청이 엔터프라이즈 계정에서 오는 경우 엔터프라이즈 애플리케이션은 echostr 매개변수를 해독하고 echostr 일반 텍스트를 있는 그대로(따옴표 없음) 반환한 다음 액세스 확인이 적용되고 콜백 모드를 켤 수 있습니다. 전원을 켜면 일부 기능이 차례로 구현되므로 계속 지켜봐 주시기 바랍니다!


위 내용은 Java WeChat 기업 계정 개발의 개발 모드를 시작하는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿