微信开发总结 四

1.获取token,接入微信服务器

public class Token {
	//获取到的凭证
	private String accessToken;
	//凭证有效时间,单位:秒
	private int expiresIn;

public class BaseConstant {
	/**设置的接入token*/
	public static final String TOKEN = "lwtoken";

	/**接入凭证接口: GET*/
	public static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
	
	/**GET请求方式*/
	public static final String TOKEN_URL_GET = "GET";
	/**POST请求方式*/
	public static final String TOKEN_URL_POST = "POST";
}

处理https请求:

public class LWTrustManager implements X509TrustManager {

	//检查客户端证书
	public void checkClientTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
	}

	//检查服务器端证书
	public void checkServerTrusted(X509Certificate[] chain, String authType)
			throws CertificateException {
	}

	//返回受信用的x509证书数组
	public X509Certificate[] getAcceptedIssuers() {
		
		return null;
	}

}


1.验证工具类

public class SignUtil {
	/**
	 * 校验签名
	 * @author wuyw
	 * 2015-7-29下午8:13:30
	 * @param signature  微信加密签名
	 * @param timestamp  时间戳
	 * @param nonce 随机数
	 * @return
	 */
	public static boolean checkSignature(String signature, String timestamp, String nonce){
		String[] params = new String[] {BaseConstant.TOKEN, timestamp, nonce};
		Arrays.sort(params);
		
		String content = params[0].concat(params[1]).concat(params[2]);
		
		String text=null;
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-1");
			byte[] digest = md.digest(content.getBytes());
			text = byteToStr(digest);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return text != null ?text.equals(signature.toUpperCase()) : false;
		
	}
	
	/**
	 * 将字节数组转换为十六进制字符串 
	 * @author wuyw
	 * 2015-7-29下午8:19:19
	 * @return
	 */
	private static String byteToStr(byte[] byteArray) {  
        String strDigest = "";  
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;  
    }  
	/**
	 * 将字节转换为十六进制字符串 
	 * @author wuyw
	 * 2015-7-29下午8:23:20
	 * @param mByte
	 * @return
	 */
	private static String byteToHexStr(byte mByte) {  
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];  
  
        String s = new String(tempArr);  
        return s;  
    }  
	
	public static String urlEncodeUTF8(String source) {
		String result = source;
		try {
			result=URLEncoder.encode(source, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
}

2.处理请求工具类

public class TokenUtil {
	/**
	 * 发送https的接入请求
	 * @author wuyw
	 * 2015-7-30上午8:53:43
	 * @return
	 */
	public static JSONObject httpsRequest(String requestUrl, String requestMedthod, String outputStr){
		
		JSONObject jsonObject = null;
		
		try {
			//创建sslContext对象,并使用指定的信任管理器初始化
			TrustManager[] tm = {new LWTrustManager()};
			//基于sunJVM, SunJSSE
			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
			sslContext.init(null, tm, new SecureRandom());
			//从sslContext中获取factory对象
			SSLSocketFactory ssf = sslContext.getSocketFactory();
			URL url = new URL(requestUrl);
			HttpsURLConnection connection = (HttpsURLConnection) url
					.openConnection();
			connection.setSSLSocketFactory(ssf);
			connection.setDoOutput(true);
			connection.setDoInput(true);
			connection.setUseCaches(false);
			//设置请求的方式(get/post)
			connection.setRequestMethod(requestMedthod);
			//当outputStr不为空时输出数据
			if (null != outputStr) {
				OutputStream outputStream = connection.getOutputStream();
				outputStream.write(outputStr.getBytes("UTF-8"));
				outputStream.close();
			}
			InputStream inputStream = connection.getInputStream();
			BufferedReader bufferedReader = new BufferedReader(
					new InputStreamReader(inputStream, "UTF-8"));
			String str = null;
			StringBuffer buffer = new StringBuffer();
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}
			
			bufferedReader.close();
			connection.disconnect();
			jsonObject = JSONObject.fromObject(buffer.toString());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return jsonObject;
	}
	
	public static Token getToken(String appId, String appsecret){
		Token token = null;
		String requestUrl = BaseConstant.TOKEN_URL.replace("APPID", appId).replace("APPSECRET", appsecret);
		
		//获取Get请求的接入凭证
		JSONObject jsonObject = httpsRequest(requestUrl, BaseConstant.TOKEN_URL_GET, null);
		if (null != jsonObject) {
			token = new Token();
			token.setAccessToken(jsonObject.getString("access_token"));
			token.setExpiresIn(jsonObject.getInt("expires_in"));
		}
		
		return token;
	}
}

核心控制器

@Controller
@RequestMapping("/wechat/core")
public class CoreController extends SpringController{
	
	Logger logger = LoggerFactory.getLogger(CoreController.class);
	
	@Autowired
	private CoreService coreService;
	
	/**
	 * 微信get请求,微信token接入验证
	 * @author wuyw
	 * 2015-7-29下午8:50:24
	 */
	@RequestMapping(value = "/getToken", method = RequestMethod.GET)
	@ResponseBody
	public void getToken(){
		String signature = getRequest().getParameter("signature");
		logger.debug(signature);
		
		String timestamp = getRequest().getParameter("timestamp");
		String nonce = getRequest().getParameter("nonce");
		String echostr = getRequest().getParameter("echostr");
		
		if(SignUtil.checkSignature(signature, timestamp, nonce)){
			print(echostr);
		}
	}
	
	@RequestMapping(value = "/getToken", method = RequestMethod.POST)
	@ResponseBody
	public void getTokenPost(){
		
		String signature = getRequest().getParameter("signature");
		String timestamp = getRequest().getParameter("timestamp");
		String nonce = getRequest().getParameter("nonce");
		
		if(SignUtil.checkSignature(signature, timestamp, nonce)){
			 String respXml = coreService.processRequest(getRequest());
			 print(respXml);
		}
	}
}

处理请求的service

public class CoreService {
	/**
	 * 处理用户发送的请求
	 * @author wuyw
	 * 2015-7-29下午8:53:02
	 * @return
	 */
	public String processRequest(HttpServletRequest request){
		String respContent = "";
		
		Map<String, String> requestMap = MessageUtil.parseXml(request);		
		 // 发送方帐号(open_id)  
        String fromUserName = requestMap.get("FromUserName");  
        // 公众帐号  
        String toUserName = requestMap.get("ToUserName");  
        // 消息类型  
        String msgType = requestMap.get("MsgType"); 
        
        TextResMsg resMsg = new TextResMsg();
        resMsg.setFromUserName(toUserName);
        resMsg.setToUserName(fromUserName);
        resMsg.setCreateTime(new Date().getTime());
        resMsg.setMsgType(MessageConstant.RES_MESSAGE_TYPE_TEXT);
        
        if(msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_TEXT)) {
        	respContent = "文本请求";
        	//TODO
        }else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_IMAGE)) {
        	respContent = "图片请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_VOICE)) {
			respContent = "语音请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_VIDEO)) {
			respContent = "视频请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_SHORTVIDEO)) {
			respContent = "小视频请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_LOCATION)) {
			respContent = "地理请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.REQ_MESSAGE_TYPE_LINK)) {
			respContent = "链接请求";
        	//TODO
		}else if (msgType.equals(MessageConstant.EVENT_TYPE_SUBSCRIBE)) {
			respContent = "关注事件";
        	//TODO
		}else if (msgType.equals(MessageConstant.EVENT_TYPE_UNSUBSCRIBE)) {
			respContent = "取消关注";
			//TODO
		}else if (msgType.equals(MessageConstant.EVENT_TYPE_SCAN)) {
			respContent = "扫描事件";
			//TODO
		}else if (msgType.equals(MessageConstant.EVENT_TYPE_LOCATION)) {
			respContent = "地理位置事件";
			//TODO
		}else if (msgType.equals(MessageConstant.EVENT_TYPE_CLICK)) {
			respContent = "扫描事件";
			//TODO
			//TODO
		}
 
        resMsg.setContent(respContent);
        return MessageUtil.messageToXml(resMsg);
        
	}
}

验证浏览器

public class BrowserInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object obj) throws Exception {
		
		String userAgent = request.getHeader("User-Agent");
		//微信内置浏览器
		if (userAgent.contains("MicroMessenger")) {
			return true;
		}
		return false;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response,
			Object obj, ModelAndView view) throws Exception {
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object obj, Exception exception)
			throws Exception {
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值