微信开放平台全网发布

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.http.client.methods.HttpPost;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.dhw.wechat.A01_utils.commonUtils.DateUtils;
import com.dhw.wechat.A01_utils.commonUtils.HttpClientUtils;
import com.dhw.wechat.A01_utils.commonUtils.JSONUtils;
import com.dhw.wechat.A01_utils.commonUtils.MessageUtil;
import com.dhw.wechat.A01_utils.domain.PublicAccount;
import com.dhw.wechat.A01_utils.domain.UserMaster;
import com.dhw.wechat.A01_utils.service.PublicAccountService;
import com.dhw.wechat.A01_utils.service.WechatComponentService;
import com.dhw.wechat.B01_msg.controller.WechatServiceController;
import com.dhw.wechat.B01_msg.domain.AutoMessage;
import com.dhw.wechat.B02_templateManage.domain.TemplateMsg;
import com.dhw.wechat.B05_extPowerManage.bo.ResTextMessage;
import com.dhw.wechat.B05_extPowerManage.domain.Power;
import com.dhw.wechat.B06_authorityManage.domain.EnterpriseUsers;
import com.dhw.wechat.Z01.controller.util.AesException;
import com.dhw.wechat.Z01.controller.util.TicketUtil;
import com.dhw.wechat.Z01.controller.util.WXBizMsgCrypt;
import com.dhw.wechat.Z01.domain.Ticket;
import com.dhw.wechat.Z01.service.TicketService;

@Controller
@RequestMapping("/accredit")
public class AccreditSecond {
Logger logger = Logger.getLogger(WechatServiceController.class);
@Autowired
private TicketService ticketService;
@Autowired
private WechatComponentService componentService;
@Autowired
private PublicAccountService accountService;
@Autowired
WechatServiceController serviceController;


@ResponseBody
@RequestMapping(value="/accreditMessage.do", method = RequestMethod.POST)
public String getComponent_verify_ticket(HttpServletRequest request){
Document receiveXml = null;
try {
InputStream inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
receiveXml = reader.read(inputStream);//获得微信的xml
Element root = receiveXml.getRootElement();
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String msgSignature = request.getParameter("msg_signature");//获得timestamp
String miwen = receiveXml.asXML();
/*
* 以下是解密
*/
String token = componentService.TOKEN;
String encodingAesKey = componentService.ENCODINGAESKEY;
String appId= componentService.COMPONENTAPPID;
String mingwen = TicketUtil.decode(msgSignature,token, encodingAesKey, appId, miwen, timestamp, nonce);
Document minwenXml = reader.read(new ByteArrayInputStream(mingwen.getBytes("UTF-8")));
Element mingwenroot = minwenXml.getRootElement();
Element ComponentVerifyTicketXml = mingwenroot.element("ComponentVerifyTicket");
if(ComponentVerifyTicketXml!=null){
String ComponentVerifyTicket=ComponentVerifyTicketXml.getText();
String InfoType = mingwenroot.element("InfoType").getText();
String CreateTime = mingwenroot.element("CreateTime").getText();
String AppId = mingwenroot.element("AppId").getText();
Ticket ticket = ticketService.get(1);
ticket.setAppId(AppId);
ticket.setCreateTime(CreateTime);
ticket.setInfoType(InfoType);
ticket.setTicket(ComponentVerifyTicket);
ticketService.update(ticket);
}
} catch (Exception e) {
e.printStackTrace();
logger.error(ExceptionUtils.getStackTrace(e));
}
return "success";
}
@ResponseBody
@RequestMapping(value="/autoPage.do")
public String autoPage(HttpServletRequest request){//获取预授权码
//调用doService的第一个参数
String accessToken=componentService.getComponentAccessToken();
HttpClientUtils t = new HttpClientUtils();
Map params = new HashMap();
params.put("component_access_token", accessToken);
String componentAppId=componentService.COMPONENTAPPID;
Map resultMap1= t.doService("https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode", "post", params, "{\"component_appid\":\""+componentAppId+"\"}");
String returnJson1=resultMap1.get("returndata");
JSONObject object1 = JSON.parseObject(returnJson1);
String precode = object1.getString("pre_auth_code");
Map retMap = new HashMap();
retMap.put("precode", precode);
retMap.put("component_access_token", accessToken);
return JSONUtils.toJSONString(retMap);
}
@ResponseBody
@RequestMapping(value="/ShouQuan.do")
public String ShouQuan(HttpServletRequest request){//获取预授权码
//调用doService的第一个参数
UserMaster user= (UserMaster) request.getSession().getAttribute("userMaster");
Integer userId=user.getId();
String auth_code = request.getParameter("auth_code");//获取授权码
String expires_in = request.getParameter("expires_in");//获取时间
String accessToken=componentService.getComponentAccessToken();
logger.info("获取accessToken1:"+accessToken);
logger.info("获取auth_code:"+auth_code);
//受用授权码获取授权公众号的信息
String url="https://api.weixin.qq.com/cgi-bin/component/api_query_auth";
Map data = new HashMap();
String componentAppId=componentService.COMPONENTAPPID;
data.put("component_appid", componentAppId);
data.put("authorization_code",auth_code );
HttpClientUtils t = new HttpClientUtils();
Map params = new HashMap();
params.put("component_access_token", accessToken);
Map resMap= t.doService(url, "post", params, JSONUtils.toJSONString(data));
logger.info("受用授权码获取授权公众号的信息");
logger.info(JSONUtils.toJSONString(resMap));
String resultMap=resMap.get("returndata");
JSONObject jasonObject = JSON.parseObject(resultMap);
Map authorizationInfoObject=jasonObject.getJSONObject("authorization_info");
String authorizer_appid=authorizationInfoObject.get("authorizer_appid").toString();
String authorizer_access_token=authorizationInfoObject.get("authorizer_access_token").toString();
String authorizer_refresh_token=authorizationInfoObject.get("authorizer_refresh_token").toString();
String func_info=authorizationInfoObject.get("func_info")==null?"":authorizationInfoObject.get("func_info").toString();
try{
this.getAccount(userId,func_info, authorizer_appid, authorizer_access_token, authorizer_refresh_token);
}catch(Exception e){
e.printStackTrace();
logger.error(ExceptionUtils.getStackTrace(e));
}
logger.info("authorizer_appid"+authorizer_appid);
logger.info("authorizer_access_token"+authorizer_access_token);
logger.info("authorizer_refresh_token"+authorizer_refresh_token);
return "success";
}

public void getAccount(Integer userId,String func_info,String appId,String access_token,String refresh_token){
/*
* 一下获取公众号详细信息
*/
String url = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info";
HttpClientUtils t = new HttpClientUtils();
Map params = new HashMap();
String component_access_token = componentService.getComponentAccessToken();
params.put("component_access_token", component_access_token);
Map data = new HashMap();
String componentAppId=componentService.COMPONENTAPPID;
data.put("component_appid", componentAppId);
data.put("authorizer_appid", appId);
//根据appId判断授权公众号是否存在
try {
PublicAccount account =null;
HashMap filterMap=new HashMap();
filterMap.put("appId", appId);
filterMap.put("userId", userId);
List accountList=accountService.findByEqPropertyMap(filterMap);
if(accountList!=null){
if(accountList.size()>0){
account=accountList.get(0);
}else{
account=new PublicAccount();
}
}else{
account=new PublicAccount();
}
account.setFunc_info(func_info);
account.setAppId(appId);
account.setAccessToken(access_token);
account.setRefresh_token(refresh_token);
Map resMap= t.doService(url, "post", params, JSON.toJSONString(data));
String resultMap=resMap.get("returndata");
JSONObject jasonObject = JSON.parseObject(resultMap);
Map authorizationInfoObject=jasonObject.getJSONObject("authorizer_info");
String nick_name=authorizationInfoObject.get("nick_name")==null ? "" : authorizationInfoObject.get("nick_name").toString();
String head_img=authorizationInfoObject.get("head_img")==null?"":authorizationInfoObject.get("head_img").toString();
String type="";
JSONObject serviceTypeObject=JSON.parseObject(authorizationInfoObject.get("service_type_info").toString());
if(serviceTypeObject==null){
type="";
}else{
type=serviceTypeObject.getString("id");
}
String verify="";
JSONObject verifyTypeObject=JSON.parseObject(authorizationInfoObject.get("verify_type_info").toString());
if(verifyTypeObject==null){
verify="";
}else{
verify=verifyTypeObject.getString("id");
}
String user_name=authorizationInfoObject.get("user_name")==null?"":authorizationInfoObject.get("user_name").toString();
String business_info=authorizationInfoObject.get("business_info")==null?"":authorizationInfoObject.get("business_info").toString();
String alias=authorizationInfoObject.get("alias")==null?"":authorizationInfoObject.get("alias").toString();//为信号;
String qrcode_url=authorizationInfoObject.get("qrcode_url")==null?"":authorizationInfoObject.get("qrcode_url").toString();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nowDate = df.parse(df.format(new Date()));
account.setCreateTime(nowDate);
account.setAccountName(nick_name);
account.setHead_img(head_img);
account.setAccountType(1);//
account.setVerify_type(verify);
account.setWechatNo(alias);
account.setBussiness_info(business_info);
account.setOriginalId(user_name);
account.setQrcode_url(qrcode_url);
account.setIsComponent(1);
account.setUserId(userId);
accountService.saveOrUpdate(account);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(ExceptionUtils.getStackTrace(e));
}

}
/**
* 处理微信推送过来的授权公众号的消息及事件
*
*/
public void processMessageAndEvent(HttpServletRequest request,HttpServletResponse response,String xml){
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String msgSignature = request.getParameter("msg_signature");
String encodingAesKey = componentService.ENCODINGAESKEY;
String token = componentService.TOKEN;
String appId = componentService.COMPONENTAPPID;
try{
WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
xml = pc.decryptMsg(msgSignature, timestamp, nonce, "ToUserName");
logger.info("-----xml------"+xml);
Document doc = DocumentHelper.parseText(xml);
Element rootElt = doc.getRootElement();
String msgType = rootElt.elementText("MsgType");
String toUserName = rootElt.elementText("ToUserName");
String fromUserName = rootElt.elementText("FromUserName");
switch (msgType) {
case "event":
String event = rootElt.elementText("Event");
break;
case "text":
String content = rootElt.elementText("Content");
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 公众号消息与事件接收
*
* @param request
* @param response
* @throws DocumentException
* @throws AesException
* @throws IOException
*/
@RequestMapping(value = "/{appid}/weiXinCallBack.do", method = RequestMethod.POST)
public String acceptMessageAndEvent(HttpServletRequest request, HttpServletResponse response){
String msgSignature = request.getParameter("msg_signature");
String returnOut="";
if (!StringUtils.isNotBlank(msgSignature))
return "";// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息
try {
StringBuilder sb = new StringBuilder();
BufferedReader in = request.getReader();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
in.close();

String xml = sb.toString();
Document doc;
doc = DocumentHelper.parseText(xml);
Element rootElt = doc.getRootElement();
String toUserName = rootElt.elementText("ToUserName");
if (StringUtils.equalsIgnoreCase(toUserName, "gh_3c884a361561")) {// 微信全网测试账号
logger.info("-----gh_3c884a361561------"+xml);
checkWeixinAllNetworkCheck(request,response,xml);
}else{
logger.info("-----其他------"+xml);
processMessageAndEvent(request,response,xml);
}
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("acceptMessageAndEvent:"+ExceptionUtils.getStackTrace(e));
e.printStackTrace();
}
return "success";
}
public void checkWeixinAllNetworkCheck(HttpServletRequest request, HttpServletResponse response,String xml){
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");
String msgSignature = request.getParameter("msg_signature");
String encodingAesKey = componentService.ENCODINGAESKEY;
String token = componentService.TOKEN;
String appId = componentService.COMPONENTAPPID;
try{
logger.info("-----checkWeixinAllNetworkCheck------");
logger.info("-----msgSignature------"+msgSignature);
logger.info("-----token------"+token);
logger.info("-----encodingAesKey------"+encodingAesKey);
logger.info("-----appId------"+appId);
logger.info("-----xml------"+xml);
logger.info("-----timestamp------"+timestamp);
logger.info("-----nonce------"+nonce);
xml = TicketUtil.decode(msgSignature,token, encodingAesKey, appId, xml, timestamp, nonce);
logger.info("解密后的xml:"+xml);
Document doc = DocumentHelper.parseText(xml);
Element rootElt = doc.getRootElement();
String msgType = rootElt.elementText("MsgType");
String toUserName = rootElt.elementText("ToUserName");
String fromUserName = rootElt.elementText("FromUserName");
switch (msgType) {
case "event":
String event = rootElt.elementText("Event");
replyEventMessage(request,response,event,toUserName,fromUserName,timestamp,nonce);
case "text":
String content = rootElt.elementText("Content");
processTextMessage(request,response,content,toUserName,fromUserName);
default:
}
} catch (Exception e) {
logger.error("checkWeixinAllNetworkCheck:"+ExceptionUtils.getStackTrace(e));
}
}
public void replyEventMessage(HttpServletRequest request, HttpServletResponse response, String event, String toUserName, String fromUserName,String timestamp,String nonce) throws DocumentException, IOException {
String content = event + "from_callback";
replyTextMessage(request,response,content,toUserName,fromUserName);
}
public void processTextMessage(HttpServletRequest request, HttpServletResponse response,String content,String toUserName, String fromUserName) throws IOException, DocumentException{
if("TESTCOMPONENT_MSG_TYPE_TEXT".equals(content)){
String returnContent = content+"_callback";
replyTextMessage(request,response,returnContent,toUserName,fromUserName);
}else if(StringUtils.startsWithIgnoreCase(content, "QUERY_AUTH_CODE")){
output(response, "");
//接下来客服API再回复一次消息
replyApiTextMessage(request,response,content.split(":")[1],fromUserName);
}
}

public void replyApiTextMessage(HttpServletRequest request, HttpServletResponse response, String auth_code, String fromUserName) throws DocumentException, IOException {
// 得到微信授权成功的消息后,应该立刻进行处理!!相关信息只会在首次授权的时候推送过来
PublicAccount account =null;
HashMap filterMap=new HashMap();
filterMap.put("appId", "wx3ced92bca19ffd94");
filterMap.put("userId", 2);
try{
List accountList=accountService.findByEqPropertyMap(filterMap);
if(accountList!=null){
if(accountList.size()>0){
account=accountList.get(0);
}
}
String authorizer_access_token=componentService.getAuthorizerAccessToken(account.getAppId(), account.getRefresh_token());

String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
//JSONObject message = processWechatTextMessage(t, httpPost, fromUserName, auth_code + "_from_api");
HttpClientUtils t = new HttpClientUtils();
Map params = new HashMap();
params.put("access_token", authorizer_access_token);
Map obj = new HashMap();
Map msgMap = new HashMap();
String msg = auth_code + "_from_api";
msgMap.put("content", msg);
obj.put("touser", fromUserName);
obj.put("msgtype", "text");
obj.put("text", msgMap);
logger.info("params:"+params);
logger.info("postData:"+obj);
Map resMap= t.doService(url, "post", params,JSONUtils.toJSONString(obj));

String returnData = resMap.get("returndata");
logger.info("回复消息:"+returnData);
}catch (Exception e) {
logger.error(ExceptionUtils.getStackTrace(e));
e.printStackTrace();
}
}
public void replyTextMessage(HttpServletRequest request, HttpServletResponse response, String content, String toUserName, String fromUserName){
//给粉丝发消息
/*


12345678


*/
String token=componentService.TOKEN;
String encodingAesKey=componentService.ENCODINGAESKEY;
String appId=componentService.COMPONENTAPPID;
Long createTime = Calendar.getInstance().getTimeInMillis() / 1000;
StringBuffer sb = new StringBuffer();
sb.append("");
sb.append("");
sb.append("");
sb.append(""+createTime+"");
sb.append("");
sb.append("");
sb.append("
");
String replyMsg = sb.toString();

String returnvaleue = "";
try {
returnvaleue=TicketUtil.encryptMsg(token, encodingAesKey, appId, replyMsg, createTime.toString(), "easemob");
// System.out.println("------------------加密后的返回内容 returnvaleue: "+returnvaleue);
output(response,returnvaleue);
} catch (Exception e) {
e.printStackTrace();
}
logger.info("**********加密后event:***********"+returnvaleue);


}
/**
* 工具类:回复微信服务器"文本消息"
* @param response
* @param returnvaleue
*/
public void output(HttpServletResponse response,String returnvaleue){
try {
PrintWriter pw = response.getWriter();
pw.write(returnvaleue);
// System.out.println("****************returnvaleue***************="+returnvaleue);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}