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