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 {
- }
-
- }
|