公众服务号开启回调模式与企业号开始回调的区别

我以前做过微信企业开发,后来去做了微信公众号开发,回调模式 应该是很简单的,可我 没认真看文档,以为与企业号一样,整整坑了我 1天时间 。

代码如下:

完整代码下载地址

http://note.youdao.com/yws/public/redirect/share?id=06bc08978584b66e3aba953375ecd912&type=false

package com.servlet;


import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.List;
import java.util.logging.Logger;

import com.qq.weixin.mp.aes.*;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.qq.weixin.mp.aes.WXBizMsgCrypt;


public class Test extends HttpServlet {
	WXBizMsgCrypt wxcpt;
	private Logger log = Logger.getLogger(this.getClass().getName());
	public static String appid = "XXX";
	public static String sToken = "weixin";
	public static String sEncodingAESKey = "XXXwwwwwwwwwwwwwwwwwwwwwwww";
	
	
	public static void main(String[] args) throws Exception {
		
		
		//testForCheckMsgCrypt();
		
		testForCheckSignature();
	}
	

	public static void testForCheckSignature() throws Exception{
		
		String signature="7c1bb93774b9f5810e6f3d7bf0a5b730735581a9";
		
		String echostr="1467575823083721407";
		
		String timestamp="1465077934";
		
		String nonce="512769189";
		
		String csignature=CheckSignature(sToken, timestamp, nonce);
		
		System.out.println("csignature:"+csignature);
		System.out.println("csignature:"+csignature);
		
	}
	
	public static void testForCheckMsgCrypt() throws Exception{

		WXBizMsgCrypt wxcpt;
		
		wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, appid);
		
		testIllegalAesKey(sToken,sEncodingAESKey,appid);
		
		String signature="7c1bb93774b9f5810e6f3d7bf0a5b730735581a9";
		
		String echostr="1467575823083721407";
		
		String timestamp="1465077934";
		
		String nonce="512769189";
		
		System.out.println(echostr+":"+URLDecoder(echostr));
		
		String sEchoStr=wxcpt.verifyUrl(signature, timestamp, nonce, echostr);
		
		// 验证URL成功,将sEchoStr返回
		
		
		System.out.println("sEchoStr:"+sEchoStr);
	}
	
	/**
	 * 确认请求来自微信服务器
	 * @throws IOException 
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
		
		checkSignForService(request,response);
		
	}
	//服务号的校验
	public void checkSignForService(HttpServletRequest request, HttpServletResponse response) throws IOException{
		
		// 微信加密签名 
		String signature = request.getParameter("signature");
		// 随机字符串
		String echostr = request.getParameter("echostr");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		
		String csignature=CheckSignature(sToken, timestamp, nonce);
		
		PrintWriter out = response.getWriter();  
		
		if(csignature.equals(signature)){
			out.println(echostr);
		}
		out.close();
		
	}
	//企业号的校验
	public void checkSignForEnterprise(HttpServletRequest request, HttpServletResponse response) throws IOException{
		 
		response.setContentType("text/html;charset=utf-8");
         request.setCharacterEncoding("utf-8");
         
		/////////////////////////////////////
		
		System.out.println("#############################");
		Enumeration enu=request.getParameterNames();  
		while(enu.hasMoreElements()){  
		String paraName=(String)enu.nextElement();  
		System.out.println(paraName+": "+URLDecoder(request.getParameter(paraName)));  
		}
		System.out.println("#############################");
		
		/////////////////////////////////////
		// 微信加密签名 
		String signature = request.getParameter("signature");
		// 随机字符串
		String echostr = request.getParameter("echostr");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		
		String sEchoStr; //需要返回的明文
		PrintWriter out = response.getWriter();  

		try {
			wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, appid);
			
			testIllegalAesKey(sToken,sEncodingAESKey,appid);
			sEchoStr=wxcpt.verifyUrl(signature, timestamp, nonce, echostr);
			// 验证URL成功,将sEchoStr返回
			System.out.println("sEchoStr:"+sEchoStr);
			out.print(sEchoStr);  
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		
		out.print(signature);
	}

	
	/**
	 * 处理微信服务器发来的消息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Enumeration enu=request.getParameterNames();  
		while(enu.hasMoreElements()){  
		String paraName=(String)enu.nextElement();  
		System.out.println(paraName+": "+request.getParameter(paraName));  
		}
		
	}
	
	public static String URLDecoder(String para){
		String result="";
		 try {
			 result=URLDecoder.decode(para,"utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 return result;
		
	}
	
	public static void testIllegalAesKey(String token,String sEncodingAESKey,String appId) {
		try {
			new WXBizMsgCrypt(token, sEncodingAESKey, appId);
			System.out.println("success!");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("fail!");
			return;
		}
	}
	//自己写的签名方法
	public static String CheckSignature(String token,String timestamp,String nonce){
		List params = new ArrayList();  
        params.add(token);  
        params.add(timestamp);  
        params.add(nonce);  
        // 1. 将token、timestamp、nonce三个参数进行字典序排序  
        Collections.sort(params, new Comparator() {  
            public int compare(String o1, String o2) {  
                return o1.compareTo(o2);  
            }  
        });  
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密  
        String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));  
        
        return temp;
	}
	
	
	


}


你可能感兴趣的:(公众服务号开启回调模式与企业号开始回调的区别)