公众号开发

This commit is contained in:
huangdeliang 2021-01-29 20:03:23 +08:00
parent 2fb4395eb7
commit ef261ff833
9 changed files with 216 additions and 381 deletions
pom.xml
stdiet-admin/src/main/java/com/stdiet/web/controller/custom
stdiet-custom

@ -118,6 +118,13 @@
<version>${poi.version}</version>
</dependency>
<!-- xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
<!--velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>

@ -1,12 +1,15 @@
package com.stdiet.web.controller.custom;
import com.stdiet.common.core.controller.BaseController;
import com.stdiet.common.core.domain.AjaxResult;
import com.stdiet.custom.domain.WxXmlData;
import com.stdiet.custom.service.ISysWxService;
import com.thoughtworks.xstream.XStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.xml.bind.annotation.XmlMimeType;
@RestController
@RequestMapping("/wx")
@ -20,4 +23,9 @@ public class CusWxController extends BaseController {
return sysWxService.wxCheckAuth(signature, timestamp, nonce, echostr);
}
@PostMapping("/checkSign")
public String autoResonse(HttpServletRequest request){
return sysWxService.autoResponse(request);
}
}

@ -45,6 +45,28 @@
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.21.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>

@ -5,6 +5,7 @@ import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.stdiet.common.annotation.Excel;
@ -16,6 +17,7 @@ import com.stdiet.common.core.domain.BaseEntity;
* @author wonder
* @date 2020-09-24
*/
@Data
public class SysOrder extends BaseEntity {
private static final long serialVersionUID = 1L;
@ -227,386 +229,9 @@ public class SysOrder extends BaseEntity {
private List<SysOrderPause> orderPauseList;
private Integer amountFlag;
public Long getCusId() {
return cusId;
}
public void setCusId(Long cusId) {
this.cusId = cusId;
}
@JsonFormat(pattern = "yyyy-MM-dd")
public Date getStartTime() {
return startTime;
}
public BigDecimal getWeight() {
return weight;
}
public Date getPauseTime() {
return pauseTime;
}
public String getStatus() {
return status;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public void setPauseTime(Date pauseTime) {
this.pauseTime = pauseTime;
}
public void setStatus(String status) {
this.status = status;
}
public void setWeight(BigDecimal weight) {
this.weight = weight;
}
public String getServeTime() {
return serveTime;
}
public void setServeTimeId(Long serveTimeId) {
this.serveTimeId = serveTimeId;
}
public Long getServeTimeId() {
return serveTimeId;
}
public void setServeTime(String serveTime) {
this.serveTime = serveTime;
}
public void setOperatorAssis(String operatorAssis) {
this.operatorAssis = operatorAssis;
}
public void setOperatorAssisId(Long operatorAssisId) {
this.operatorAssisId = operatorAssisId;
}
public Long getOperatorAssisId() {
return operatorAssisId;
}
public String getOperatorAssis() {
return operatorAssis;
}
public String getReviewStatus() {
return reviewStatus;
}
public void setReviewStatus(String reviewStatus) {
this.reviewStatus = reviewStatus;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Long getOrderId() {
return orderId;
}
public void setCustomer(String customer) {
this.customer = customer;
}
public String getCustomer() {
return customer;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return phone;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public BigDecimal getAmount() {
return amount;
}
public void setPayTypeId(Long payTypeId) {
this.payTypeId = payTypeId;
}
public Long getPayTypeId() {
return payTypeId;
}
public void setPayType(String payType) {
this.payType = payType;
}
public String getPayType() {
return payType;
}
public void setPreSaleId(Long preSaleId) {
this.preSaleId = preSaleId;
}
public Long getPreSaleId() {
return preSaleId;
}
public void setPreSale(String preSale) {
this.preSale = preSale;
}
public String getPreSale() {
return preSale;
}
public void setAfterSaleId(Long afterSaleId) {
this.afterSaleId = afterSaleId;
}
public Long getAfterSaleId() {
return afterSaleId;
}
public void setAfterSale(String afterSale) {
this.afterSale = afterSale;
}
public String getAfterSale() {
return afterSale;
}
public void setNutritionistId(Long nutritionistId) {
this.nutritionistId = nutritionistId;
}
public Long getNutritionistId() {
return nutritionistId;
}
public void setNutritionist(String nutritionist) {
this.nutritionist = nutritionist;
}
public String getNutritionist() {
return nutritionist;
}
public void setNutriAssisId(Long nutriAssisId) {
this.nutriAssisId = nutriAssisId;
}
public Long getNutriAssisId() {
return nutriAssisId;
}
public void setNutriAssis(String nutriAssis) {
this.nutriAssis = nutriAssis;
}
public String getNutriAssis() {
return nutriAssis;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public Long getAccountId() {
return accountId;
}
public void setAccount(String account) {
this.account = account;
}
public String getAccount() {
return account;
}
public void setPlannerId(Long plannerId) {
this.plannerId = plannerId;
}
public Long getPlannerId() {
return plannerId;
}
public void setPlanner(String planner) {
this.planner = planner;
}
public String getPlanner() {
return planner;
}
public void setPlannerAssisId(Long plannerAssisId) {
this.plannerAssisId = plannerAssisId;
}
public Long getPlannerAssisId() {
return plannerAssisId;
}
public void setPlannerAssis(String plannerAssis) {
this.plannerAssis = plannerAssis;
}
public String getPlannerAssis() {
return plannerAssis;
}
public void setOperatorId(Long operatorId) {
this.operatorId = operatorId;
}
public Long getOperatorId() {
return operatorId;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getOperator() {
return operator;
}
public void setRecommender(String recommender) {
this.recommender = recommender;
}
public String getRecommender() {
return recommender;
}
public void setOrderTime(Date orderTime) {
this.orderTime = orderTime;
}
public Date getOrderTime() {
return orderTime;
}
public Integer getGiveServeDay() {
return giveServeDay;
}
public void setGiveServeDay(Integer giveServeDay) {
this.giveServeDay = giveServeDay;
}
public List<SysOrderPause> getOrderPauseList() {
return orderPauseList;
}
public void setOrderPauseList(List<SysOrderPause> orderPauseList) {
this.orderPauseList = orderPauseList;
}
public Integer getConditioningProjectId() {
return conditioningProjectId;
}
public void setConditioningProjectId(Integer conditioningProjectId) {
this.conditioningProjectId = conditioningProjectId;
}
public Date getServerEndTime() {
return serverEndTime;
}
public void setServerEndTime(Date serverEndTime) {
this.serverEndTime = serverEndTime;
}
public Date getBecomeFanTime() {
return becomeFanTime;
}
public void setBecomeFanTime(Date becomeFanTime) {
this.becomeFanTime = becomeFanTime;
}
public Integer getServerDay() {
return serverDay;
}
public void setServerDay(Integer serverDay) {
this.serverDay = serverDay;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("orderId", getOrderId())
.append("customer", getCustomer())
.append("phone", getPhone())
.append("amount", getAmount())
.append("payTypeId", getPayTypeId())
.append("payType", getPayType())
.append("preSaleId", getPreSaleId())
.append("createBy", getCreateBy())
.append("preSale", getPreSale())
.append("createTime", getCreateTime())
.append("afterSaleId", getAfterSaleId())
.append("updateBy", getUpdateBy())
.append("afterSale", getAfterSale())
.append("updateTime", getUpdateTime())
.append("nutritionistId", getNutritionistId())
.append("remark", getRemark())
.append("nutritionist", getNutritionist())
.append("nutriAssisId", getNutriAssisId())
.append("nutriAssis", getNutriAssis())
.append("accountId", getAccountId())
.append("account", getAccount())
.append("plannerId", getPlannerId())
.append("planner", getPlanner())
.append("plannerAssisId", getPlannerAssisId())
.append("plannerAssis", getPlannerAssis())
.append("operatorId", getOperatorId())
.append("operator", getOperator())
.append("operatorAssisId", getOperatorAssisId())
.append("operatorAssis", getOperatorAssis())
.append("recommender", getRecommender())
.append("orderTime", getOrderTime())
.append("serveTimeId", getServeTimeId())
.append("serveTime", getServeTime())
.append("reviewStatus", getReviewStatus())
.append("status", getStatus())
.append("startTime", getStartTime())
.append("pauseTime", getPauseTime())
.append("weight", getWeight())
.toString();
}
public String getConditioningProject() {
return conditioningProject;
}
public void setConditioningProject(String conditioningProject) {
this.conditioningProject = conditioningProject;
}
public Integer getAmountFlag() {
return amountFlag;
}
public void setAmountFlag(Integer amountFlag) {
this.amountFlag = amountFlag;
}
}

@ -0,0 +1,39 @@
package com.stdiet.custom.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import java.io.Serializable;
@Data
@XStreamAlias("xml")
public class WxXmlData implements Serializable {
@XStreamAlias("ToUserName")
private String toUserName;
@XStreamAlias("FromUserName")
private String fromUserName;
@XStreamAlias("CreateTime")
private Long createTime;
@XStreamAlias("MsgType")
private String msgType;
@XStreamAlias("Content")
private String content;
@XStreamAlias("MsgId")
private String msgId;
//
@XStreamAlias("Title")
private String title;
@XStreamAlias("Description")
private String description;
@XStreamAlias("Url")
private String url;
/**
* 订阅或者取消订阅的事件
*/
@XStreamAlias("Event")
private String event;
@XStreamAlias("EventKey")
private String eventkey;
}

@ -1,5 +1,9 @@
package com.stdiet.custom.service;
import com.stdiet.custom.domain.WxXmlData;
import javax.servlet.http.HttpServletRequest;
public interface ISysWxService {
/**
* 微信token验证
@ -10,4 +14,6 @@ public interface ISysWxService {
* @return
*/
public String wxCheckAuth(String signature, String timestamp, String nonce, String echostr);
public String autoResponse(HttpServletRequest request);
}

@ -1,10 +1,17 @@
package com.stdiet.custom.service.impl;
import com.stdiet.common.utils.StringUtils;
import com.stdiet.custom.domain.WxXmlData;
import com.stdiet.custom.service.ISysWxService;
import com.stdiet.custom.utils.WechatMessageUtil;
import com.stdiet.custom.utils.WxTokenUtils;
import com.thoughtworks.xstream.XStream;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Service
@Transactional
public class SysWxServiceImpl implements ISysWxService {
@ -13,4 +20,39 @@ public class SysWxServiceImpl implements ISysWxService {
public String wxCheckAuth(String signature, String timestamp, String nonce, String echostr) {
return WxTokenUtils.checkSignature(signature, timestamp, nonce) ? echostr : null;
}
@Override
public String autoResponse(HttpServletRequest request) {
try {
WxXmlData wxData = WxTokenUtils.resolveXmlData(request.getInputStream());
WxXmlData resultXmlData = new WxXmlData();
resultXmlData.setToUserName(wxData.getFromUserName()); //收到的消息是谁发来的再发给谁
resultXmlData.setFromUserName(wxData.getToUserName()); //
if (!StringUtils.isEmpty(wxData.getEvent())) {
if (wxData.getEvent().equals(WechatMessageUtil.MESSAGE_EVENT_SUBSCRIBE)) {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("欢迎来到胜唐体控,这是一条测试用的关注信息");
} else if (wxData.getEvent().equals(WechatMessageUtil.MESSAGE_EVENT_UNSUBSCRIBE)) {
}
} else if (wxData.getContent().equalsIgnoreCase("vip")) {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("<a href=\"https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322\">点击该链接,获取博客解锁验证码</a>");
} else {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("公众号正在开发中。后期请多多关注!");
}
XStream xstream = new XStream();
xstream.processAnnotations(WxXmlData.class);
xstream.setClassLoader(WxXmlData.class.getClassLoader());
return xstream.toXML(resultXmlData); //XStream的方法直接将对象转换成 xml数据
} catch (IOException e) {
return null;
}
}
}

@ -0,0 +1,63 @@
package com.stdiet.custom.utils;
public class WechatMessageUtil {
// 各种消息类型,除了扫带二维码事件
/**
* 文本消息
*/
public static final String MESSAGE_TEXT = "text";
/**
* 图片消息
*/
public static final String MESSAtGE_IMAGE = "image";
/**
* 图文消息
*/
public static final String MESSAGE_NEWS = "news";
/**
* 语音消息
*/
public static final String MESSAGE_VOICE = "voice";
/**
* 视频消息
*/
public static final String MESSAGE_VIDEO = "video";
/**
* 小视频消息
*/
public static final String MESSAGE_SHORTVIDEO = "shortvideo";
/**
* 地理位置消息
*/
public static final String MESSAGE_LOCATION = "location";
/**
* 链接消息
*/
public static final String MESSAGE_LINK = "link";
/**
* 事件推送消息
*/
public static final String MESSAGE_EVENT = "event";
/**
* 事件推送消息中,事件类型subscribe(订阅)
*/
public static final String MESSAGE_EVENT_SUBSCRIBE = "subscribe";
/**
* 事件推送消息中,事件类型unsubscribe(取消订阅)
*/
public static final String MESSAGE_EVENT_UNSUBSCRIBE = "unsubscribe";
/**
* 事件推送消息中,上报地理位置事件
*/
public static final String MESSAGE_EVENT_LOCATION_UP = "LOCATION";
/**
* 事件推送消息中,自定义菜单事件,点击菜单拉取消息时的事件推送
*/
public static final String MESSAGE_EVENT_CLICK = "CLICK";
/**
* 事件推送消息中,自定义菜单事件,点击菜单跳转链接时的事件推送
*/
public static final String MESSAGE_EVENT_VIEW = "VIEW";
}

@ -1,5 +1,11 @@
package com.stdiet.custom.utils;
import com.stdiet.custom.domain.WxXmlData;
import com.thoughtworks.xstream.XStream;
import org.apache.commons.io.IOUtils;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@ -81,4 +87,21 @@ public class WxTokenUtils {
}
}
}
public static WxXmlData resolveXmlData(InputStream in) {
WxXmlData wxXmlData = null;
try {
String xmlData = IOUtils.toString(in, StandardCharsets.UTF_8.name());
XStream xstream = new XStream();
//这个必须要加 不然无法转换成WxXmlData对象
xstream.setClassLoader(WxXmlData.class.getClassLoader());
xstream.processAnnotations(WxXmlData.class);
xstream.alias("xml", WxXmlData.class);
wxXmlData = (WxXmlData) xstream.fromXML(xmlData);
// log.info("【wxXmlData: {}】 ", wxXmlData);
} catch (Exception e) {
// log.error("【error】{}", e.getMessage());
}
return wxXmlData;
}
}