1. 程式人生 > >後臺微信開發入口+關鍵字 回覆等

後臺微信開發入口+關鍵字 回覆等

package com.epalmpay.controller.apiweixin;

import com.epalmpay.commom.BaseController;
import com.epalmpay.entity.GroupWxKeyword;
import com.epalmpay.entity.GroupWxconfig;
import com.epalmpay.enumdef.BizEnum;
import com.epalmpay.mapper.GroupWxconfigMapper;
import com.epalmpay.service.group.IGroupService;
import com.epalmpay.service.management.ITemplateMailSendService;
import com.epalmpay.service.weixin.IWxApiMemberService;
import com.epalmpay.service.weixin.IWxBaseService;
import com.epalmpay.service.weixin.impl.WxService;
import com.epalmpay.util.PageData;
import me.chanjar.weixin.common.util.crypto.SHA1;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
* 類名稱:WechatController.java
* 類描述: 微信公眾號開發入口
*
* @author zsj
* 建立時間:2017年5月18日
*/
@Controller
@RequestMapping(value = "/wechat")
public class WechatController extends BaseController {


@Autowired
protected WxService wxService;

@Autowired
protected IWxBaseService wxBaseService;

@Autowired
private IGroupService groupService;

@Autowired
private GroupWxconfigMapper groupWxconfigMapper;

@Autowired
@Lazy
private ITemplateMailSendService templateMailSendService;

@Resource
private IWxApiMemberService wxApiMemberService;

@RequestMapping(value = "serverno", method = {RequestMethod.GET, RequestMethod.POST})
public void index(HttpServletRequest request, HttpServletResponse response
) throws Exception {
logBefore(logger, "------------------------------------微信入口------------------------------------");
PageData pd = new PageData();
response.setContentType("text/html;charset=UTF-8");
pd = this.getPageData();
String signature = pd.getString("signature"); //微信加密簽名
String timestamp = pd.getString("timestamp"); //時間戳
String nonce = pd.getString("nonce"); //隨機數
String echostr = pd.getString("echostr"); //字串
String groupId = pd.getString("groupId");
//所有使用wxService 前 設定 WxMpInMemoryConfigStorage
if (StringUtils.isBlank(groupId)) {
return;
}
logger.info("校驗開始=======================");

try {
GroupWxconfig groupWxconfig = groupWxconfigMapper.selectByGroupId(Long.parseLong(groupId));
if(groupWxconfig != null){
logger.info("獲取到配置了+==============================");
String desSignature = SHA1.gen(groupWxconfig.getAccessToken(), timestamp, nonce);
logger.info("AccessToken");
logger.info(groupWxconfig.getAccessToken());
logger.info("desSignature");
logger.info(desSignature);
logger.info("signature");
logger.info(signature);
logger.info("desSignature.equals(signature)");
logger.info(desSignature.equals(signature));
if(StringUtils.isNotEmpty(echostr)){
logger.info("echostr"+"------------------"+echostr);
logger.info("echostr是空的");
}else{
logger.info("echostr"+"------------------"+echostr);
}
logger.info("echostr"+"------------------"+echostr);
if(StringUtils.isNotEmpty(desSignature) && desSignature.equals(signature) && StringUtils.isNotEmpty(echostr)){
logger.info("進入返回階段");
OutputStream os=response.getOutputStream();
os.write(URLEncoder.encode(echostr,"UTF-8").getBytes());
os.flush();
os.close();
}else{
logger.info("進入關鍵字____________________________________________");
String encryptType = StringUtils.isBlank(pd.getString("encrypt_type"))
? "raw"
: request.getParameter("encrypt_type");
request.getInputStream();

if ("raw".equals(encryptType)) {
// 明文傳輸的訊息
String inMessageXml = readContent(request);
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(inMessageXml);
String toUser = inMessage.getToUser();
String content = inMessage.getContent();
String fromUser = inMessage.getFromUser();
GroupWxconfig groupWxconfig2 = groupService.selectByTxidKey(toUser);
WxMpXmlOutMessage outMessage = this.wxService.route(inMessage);
if (groupWxconfig2 != null) {
Long groupid = groupWxconfig2.getGroupId();
GroupWxKeyword groupWxKeyword = new GroupWxKeyword();
groupWxKeyword.setGroupId(groupid);
groupWxKeyword.setKeyword(content);
GroupWxKeyword groupWxKeyword1 = groupService.getWxKeywordByKey(groupWxKeyword);
if (groupWxKeyword1 != null) {//如果該關鍵字有對應的回覆
int replytype = groupWxKeyword1.getReplyType();
if (replytype == 0) {//文本回復
outMessage = WxMpXmlOutMessage.TEXT().content(groupWxKeyword1.getReply())
.fromUser(toUser)
.toUser(fromUser)
.build();
} else if (replytype == 1) {//圖片回覆
outMessage = WxMpXmlOutMessage.IMAGE().mediaId(groupWxKeyword1.getReply())
.fromUser(toUser)
.toUser(fromUser)
.build();
} else if (replytype == 2) {//圖文訊息
outMessage = WxMpXmlOutMessage.NEWS().addArticle(wxApiMemberService.sendArticlesMessage(groupWxKeyword1.getReply(), groupid))
.fromUser(toUser)
.toUser(fromUser)
.build();
}
}
}
String outXml = outMessage.toXml();
System.out.println(outXml);
response.getWriter().write(outXml);
return;
}
if ("aes".equals(encryptType)) {
// 是aes加密的訊息
String msgSignature = pd.getString("msg_signature");
String inMessageXml = readContent(request);
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(
inMessageXml, wxService.getWxMpConfigStorage(), timestamp, nonce,
msgSignature);
logBefore(logger, "訊息解密後內容為" + inMessage.toString());
WxMpXmlOutMessage outMessage = this.wxService.route(inMessage);
response.getWriter().write(outMessage.toEncryptedXml(wxService.getWxMpConfigStorage()));
return;
}
logger.info("開發入口=======================");
}
}
logger.info("校驗結束=======================");
} catch (Exception e) {
e.printStackTrace();
logger.info("這是異常訊息"+e);
}

response.getWriter().println("不可識別的加密型別");
return;
}


private String readContent(HttpServletRequest request) throws IOException {
ServletInputStream sis = request.getInputStream();
// 取HTTP請求流長度
int size = request.getContentLength();
// 用於快取每次讀取的資料
byte[] buffer = new byte[size];
// 用於存放結果的陣列
byte[] xmldataByte = new byte[size];
int count = 0;
int rbyte = 0;
// 迴圈讀取
while (count < size) {
// 每次實際讀取長度存於rbyte中
rbyte = sis.read(buffer);
for (int i = 0; i < rbyte; i++) {
xmldataByte[count + i] = buffer[i];
}
count += rbyte;
}
return new String(xmldataByte, "UTF-8");
}


@RequestMapping(value = "test", method = {RequestMethod.GET, RequestMethod.POST})
public void test(HttpServletRequest request, HttpServletResponse response, String memberId) throws Exception {

try {
templateMailSendService.sendMemberTemplate(Long.valueOf(memberId), BizEnum.WebTemplateType.template1.getType(), ROOT_HOME_URL, null);
} catch (Exception e) {
System.out.println("模板訊息傳送失敗" + e);
e.printStackTrace();
}
return;
}


}