微信公众平台开发模式

高级功能

微信公众平台地址:https://mp.weixin.qq.com 

登录微信公众平台后台,在左侧列表中最下方,找到“ 基本配置 ”,点击进入

企业微信服务器 python 企业微信服务器设置_System

进入服务器配置填写框。

企业微信服务器 python 企业微信服务器设置_企业微信服务器 python_02

点击“修改配置”按钮

企业微信服务器 python 企业微信服务器设置_微信_03

企业微信服务器 python 企业微信服务器设置_微信_04

 

在弹出的提示框中,点击“确定”

企业微信服务器 python 企业微信服务器设置_System_05

配置修改后如图所示,再点击“启用”按钮

企业微信服务器 python 企业微信服务器设置_System_06

询问“是否确定开启服务器配置”,点击“确定”

如果提示“token验证失败”,可以先重次几次,微信服务器有时候不稳定。另外新浪SAE要求进行实名认证,请先上传身份证进行实名认证并通过审核后再试!

如果还是失败,请先用微信调试器测试一下url和token是否正确,点此查看详细测试方法。

企业微信服务器 python 企业微信服务器设置_服务器_07

成功启用后如图。

恭喜,你成功启用开发模式。

开发模式成为开发者时的消息校验原理

在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。

此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。

参数

描述

signature

微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

timestamp

时间戳

nonce

随机数

echostr

随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

@RequestMapping(value="getSign",method=RequestMethod.GET)
	public void getSignature(HttpServletRequest request,HttpServletResponse response) throws AesException, IOException{
		System.out.println("signatrue:start");
		System.out.println(request.getParameterMap().toString());
		System.out.println(request.getMethod());
		String signature = request.getParameter("signature");
		  String timestamp = request.getParameter("timestamp");
		  String nonce = request.getParameter("nonce");
		  String echostr = request.getParameter("echostr");
		  String mySignature="";
		  mySignature=SHA1.getSHA1(Constants.token, timestamp, nonce);

		  if (null!= mySignature&& !"".equals(mySignature)&& mySignature.equals(signature)) {  
			  System.out.println("签名校验成功."+echostr);
			  if(null!=echostr)
				  	response.getWriter().write(echostr);
		  } else {
	            System.out.println("签名校验失败.");
	        }

	}

public 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 };
			return sha1Comm(array);
		} catch (Exception e) {
			e.printStackTrace();
			throw new AesException(AesException.ComputeSignatureError);
		}
	}
	
	/**
	 * 用SHA1算法生成安全签名
	 * @param token 票据
	 * @param timestamp 时间戳
	 * @param nonce 随机字符串
	 * @return 安全签名
	 * @throws AesException 
	 */
public static String getSHA1(String token, String timestamp, String nonce) throws AesException {
	try {
		String[] array = new String[] { token, timestamp, nonce};
		return sha1Comm(array);
	} catch (Exception e) {
		e.printStackTrace();
		throw new AesException(AesException.ComputeSignatureError);
		}
}

private static String  sha1Comm (String[] array ) throws Exception{
	StringBuffer sb = new StringBuffer();
	// 字符串排序
	Arrays.sort(array);
	for (int i = 0; i < array.length; i++) {
		sb.append(array[i]);
	}
	String str = sb.toString();
	// SHA1签名生成
	MessageDigest md = MessageDigest.getInstance("SHA-1");
	md.update(str.getBytes()); //加入数据
	byte[] digest = md.digest();

  return	MD5Util.byteArrayToHexString(digest);

}

}

MD5帮助类:连接