新增验证码自动回复
This commit is contained in:
parent
20bb1efcdc
commit
def94c3996
@ -9,6 +9,7 @@ import ink.wgink.module.wechat.enums.XmlMsgTypeEnum;
|
|||||||
import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountUserVO;
|
import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountUserVO;
|
||||||
import ink.wgink.module.wechat.result.OfficialAccountEventResult;
|
import ink.wgink.module.wechat.result.OfficialAccountEventResult;
|
||||||
import ink.wgink.module.wechat.service.official.account.IOfficialAccountCheckService;
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountCheckService;
|
||||||
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountTextService;
|
||||||
import ink.wgink.module.wechat.service.official.account.IOfficialAccountUserService;
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountUserService;
|
||||||
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
|
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
|
||||||
import ink.wgink.util.xml.XMLUtil;
|
import ink.wgink.util.xml.XMLUtil;
|
||||||
@ -49,6 +50,8 @@ public class OfficialAccountWechatController extends DefaultBaseController {
|
|||||||
private IOfficialAccountCheckService officialAccountCheckService;
|
private IOfficialAccountCheckService officialAccountCheckService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOfficialAccountUserService officialAccountUserService;
|
private IOfficialAccountUserService officialAccountUserService;
|
||||||
|
@Autowired
|
||||||
|
private IOfficialAccountTextService officialAccountTextService;
|
||||||
|
|
||||||
@RequestMapping("event")
|
@RequestMapping("event")
|
||||||
public void event(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
public void event(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||||
@ -83,19 +86,20 @@ public class OfficialAccountWechatController extends DefaultBaseController {
|
|||||||
*/
|
*/
|
||||||
private void handleMsgType(AsyncContext asyncContext, HttpServletRequest request, HttpServletResponse response) throws IOException {
|
private void handleMsgType(AsyncContext asyncContext, HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||||
OfficialAccountEventResult officialAccountEventResult = getEventResult(request);
|
OfficialAccountEventResult officialAccountEventResult = getEventResult(request);
|
||||||
// 解析完流之后,直接返回,防止微信服务器重复请求
|
|
||||||
PrintWriter writer = response.getWriter();
|
|
||||||
writer.write("");
|
|
||||||
writer.flush();
|
|
||||||
asyncContext.complete();
|
|
||||||
// 处理消息事件
|
// 处理消息事件
|
||||||
if (officialAccountEventResult == null) {
|
if (officialAccountEventResult == null) {
|
||||||
throw new ParamsException("事件错误");
|
throw new ParamsException("事件错误");
|
||||||
}
|
}
|
||||||
if (StringUtils.equalsIgnoreCase(XmlMsgTypeEnum.EVENT.getValue(), officialAccountEventResult.getMsgType())) {
|
if (StringUtils.equalsIgnoreCase(XmlMsgTypeEnum.EVENT.getValue(), officialAccountEventResult.getMsgType())) {
|
||||||
|
// 解析完流之后,直接返回,防止微信服务器重复请求
|
||||||
|
PrintWriter writer = response.getWriter();
|
||||||
|
writer.write("");
|
||||||
|
writer.flush();
|
||||||
|
asyncContext.complete();
|
||||||
handleEvent(officialAccountEventResult, request, response);
|
handleEvent(officialAccountEventResult, request, response);
|
||||||
|
} else if (StringUtils.equalsIgnoreCase(XmlMsgTypeEnum.TEXT.getValue(), officialAccountEventResult.getMsgType())) {
|
||||||
|
officialAccountTextService.getReplay(officialAccountEventResult, asyncContext, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,6 +47,13 @@ public interface IOfficialAccountUserDao {
|
|||||||
*/
|
*/
|
||||||
void update(Map<String, Object> params) throws UpdateException;
|
void update(Map<String, Object> params) throws UpdateException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改用户码(邀请码)
|
||||||
|
* @param params
|
||||||
|
* @throws UpdateException
|
||||||
|
*/
|
||||||
|
void updateUserCode(Map<String, Object> params) throws UpdateException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 删除
|
||||||
*
|
*
|
||||||
|
@ -12,7 +12,8 @@ package ink.wgink.module.wechat.enums;
|
|||||||
*/
|
*/
|
||||||
public enum XmlMsgTypeEnum {
|
public enum XmlMsgTypeEnum {
|
||||||
|
|
||||||
EVENT("event");
|
EVENT("event"),
|
||||||
|
TEXT("text");
|
||||||
|
|
||||||
private String value;
|
private String value;
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ public class OfficialAccountEventResult {
|
|||||||
private String msgType;
|
private String msgType;
|
||||||
private String event;
|
private String event;
|
||||||
private String eventKey;
|
private String eventKey;
|
||||||
|
private String content;
|
||||||
|
|
||||||
public String getToUserName() {
|
public String getToUserName() {
|
||||||
return toUserName == null ? "" : toUserName;
|
return toUserName == null ? "" : toUserName;
|
||||||
@ -67,6 +68,14 @@ public class OfficialAccountEventResult {
|
|||||||
this.eventKey = eventKey;
|
this.eventKey = eventKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content == null ? "" : content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(String content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final StringBuilder sb = new StringBuilder("{");
|
final StringBuilder sb = new StringBuilder("{");
|
||||||
@ -82,6 +91,8 @@ public class OfficialAccountEventResult {
|
|||||||
.append(event).append('\"');
|
.append(event).append('\"');
|
||||||
sb.append(",\"eventKey\":\"")
|
sb.append(",\"eventKey\":\"")
|
||||||
.append(eventKey).append('\"');
|
.append(eventKey).append('\"');
|
||||||
|
sb.append(",\"content\":\"")
|
||||||
|
.append(content).append('\"');
|
||||||
sb.append('}');
|
sb.append('}');
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
package ink.wgink.module.wechat.service.official.account;
|
||||||
|
|
||||||
|
import ink.wgink.common.base.DefaultBaseService;
|
||||||
|
import ink.wgink.interfaces.consts.ISystemConstant;
|
||||||
|
|
||||||
|
import javax.servlet.AsyncContext;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When you feel like quitting. Think about why you started
|
||||||
|
* 当你想要放弃的时候,想想当初你为何开始
|
||||||
|
*
|
||||||
|
* @ClassName: BaseOfficialAccountService
|
||||||
|
* @Description: 公众号基类
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/5/2 11:11 上午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
public class BaseOfficialAccountService extends DefaultBaseService {
|
||||||
|
|
||||||
|
protected void write(AsyncContext asyncContext, HttpServletResponse response, String content) throws IOException {
|
||||||
|
response.setCharacterEncoding(ISystemConstant.CHARSET_UTF8);
|
||||||
|
PrintWriter writer = response.getWriter();
|
||||||
|
writer.write(content);
|
||||||
|
writer.flush();
|
||||||
|
asyncContext.complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package ink.wgink.module.wechat.service.official.account;
|
||||||
|
|
||||||
|
import ink.wgink.module.wechat.result.OfficialAccountEventResult;
|
||||||
|
|
||||||
|
import javax.servlet.AsyncContext;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When you feel like quitting. Think about why you started
|
||||||
|
* 当你想要放弃的时候,想想当初你为何开始
|
||||||
|
*
|
||||||
|
* @ClassName: IOfficialAccountAutoReplyService
|
||||||
|
* @Description: 自动回复
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/5/2 10:54 上午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
public interface IOfficialAccountTextService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回复
|
||||||
|
*
|
||||||
|
* @param officialAccountEventResult
|
||||||
|
* @param asyncContext
|
||||||
|
* @param response
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
void getReplay(OfficialAccountEventResult officialAccountEventResult, AsyncContext asyncContext, HttpServletResponse response) throws IOException;
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package ink.wgink.module.wechat.service.official.account;
|
package ink.wgink.module.wechat.service.official.account;
|
||||||
|
|
||||||
|
import ink.wgink.interfaces.wechat.official.account.IAccountOfficialUserBaseService;
|
||||||
import ink.wgink.module.wechat.enums.XmlEventTypeEnum;
|
import ink.wgink.module.wechat.enums.XmlEventTypeEnum;
|
||||||
import ink.wgink.module.wechat.pojo.dtos.official.account.OfficialAccountUserDTO;
|
import ink.wgink.module.wechat.pojo.dtos.official.account.OfficialAccountUserDTO;
|
||||||
import ink.wgink.module.wechat.pojo.pos.official.account.OfficialAccountUserPO;
|
import ink.wgink.module.wechat.pojo.pos.official.account.OfficialAccountUserPO;
|
||||||
@ -20,7 +21,7 @@ import java.util.Map;
|
|||||||
* @Date: 2021/4/28 6:15 下午
|
* @Date: 2021/4/28 6:15 下午
|
||||||
* @Version: 1.0
|
* @Version: 1.0
|
||||||
*/
|
*/
|
||||||
public interface IOfficialAccountUserService {
|
public interface IOfficialAccountUserService extends IAccountOfficialUserBaseService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 公众号用户前缀
|
* 公众号用户前缀
|
||||||
@ -100,4 +101,11 @@ public interface IOfficialAccountUserService {
|
|||||||
*/
|
*/
|
||||||
SuccessResultList<List<OfficialAccountUserDTO>> listPage(ListPage page);
|
SuccessResultList<List<OfficialAccountUserDTO>> listPage(ListPage page);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户码
|
||||||
|
*
|
||||||
|
* @param openId 公众号用户openId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String getUserCodeByOpenId(String openId);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
package ink.wgink.module.wechat.service.official.account.impl;
|
||||||
|
|
||||||
|
import ink.wgink.module.wechat.result.OfficialAccountEventResult;
|
||||||
|
import ink.wgink.module.wechat.service.official.account.BaseOfficialAccountService;
|
||||||
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountTextService;
|
||||||
|
import ink.wgink.module.wechat.service.official.account.IOfficialAccountUserService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.servlet.AsyncContext;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When you feel like quitting. Think about why you started
|
||||||
|
* 当你想要放弃的时候,想想当初你为何开始
|
||||||
|
*
|
||||||
|
* @ClassName: OfficialAccountTextServiceImpl
|
||||||
|
* @Description: 自动回复
|
||||||
|
* @Author: wanggeng
|
||||||
|
* @Date: 2021/5/2 10:54 上午
|
||||||
|
* @Version: 1.0
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class OfficialAccountTextServiceImpl extends BaseOfficialAccountService implements IOfficialAccountTextService {
|
||||||
|
|
||||||
|
public static String[] KEYWORD_ARRAY = {"验证码"};
|
||||||
|
@Autowired
|
||||||
|
private IOfficialAccountUserService officialAccountUserService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getReplay(OfficialAccountEventResult officialAccountEventResult, AsyncContext asyncContext, HttpServletResponse response) throws IOException {
|
||||||
|
String content = officialAccountEventResult.getContent().replaceAll("\\s+", "");
|
||||||
|
if (content.contains(KEYWORD_ARRAY[0])) {
|
||||||
|
String userCode = officialAccountUserService.getUserCodeByOpenId(officialAccountEventResult.getFromUserName());
|
||||||
|
write(asyncContext, response, responseXML(officialAccountEventResult.getFromUserName(),
|
||||||
|
officialAccountEventResult.getToUserName(), "您的验证码为:" + userCode));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
write(asyncContext, response, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String responseXML(String toUser, String fromUserName, String replay) {
|
||||||
|
return "<xml><ToUserName><![CDATA[" +
|
||||||
|
toUser +
|
||||||
|
"]]></ToUserName><FromUserName><![CDATA[" +
|
||||||
|
fromUserName +
|
||||||
|
"]]></FromUserName><CreateTime>" +
|
||||||
|
System.currentTimeMillis()
|
||||||
|
+ "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" +
|
||||||
|
replay
|
||||||
|
+ "]]></Content></xml>";
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,7 @@ import ink.wgink.service.user.service.IUserService;
|
|||||||
import ink.wgink.util.date.DateUtil;
|
import ink.wgink.util.date.DateUtil;
|
||||||
import ink.wgink.util.map.HashMapUtil;
|
import ink.wgink.util.map.HashMapUtil;
|
||||||
import ink.wgink.util.string.WStringUtil;
|
import ink.wgink.util.string.WStringUtil;
|
||||||
|
import ink.wgink.util.verification.share.ShareCodeUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -70,7 +71,6 @@ public class OfficialAccountUserServiceImpl extends DefaultBaseService implement
|
|||||||
// 用户码,用于绑定账号时使用
|
// 用户码,用于绑定账号时使用
|
||||||
// 绑定用户
|
// 绑定用户
|
||||||
officialAccountUserVO.setUserId(userId);
|
officialAccountUserVO.setUserId(userId);
|
||||||
officialAccountUserVO.setUserCode(WStringUtil.randomSubStr(String.valueOf(System.currentTimeMillis()), 6));
|
|
||||||
// 标记为初始化账号
|
// 标记为初始化账号
|
||||||
officialAccountUserVO.setIsInitAccount(1);
|
officialAccountUserVO.setIsInitAccount(1);
|
||||||
Map<String, Object> params = HashMapUtil.beanToMap(officialAccountUserVO);
|
Map<String, Object> params = HashMapUtil.beanToMap(officialAccountUserVO);
|
||||||
@ -79,6 +79,10 @@ public class OfficialAccountUserServiceImpl extends DefaultBaseService implement
|
|||||||
params.put("gmtCreate", time);
|
params.put("gmtCreate", time);
|
||||||
params.put("gmtModified", time);
|
params.put("gmtModified", time);
|
||||||
officialAccountUserDao.save(params);
|
officialAccountUserDao.save(params);
|
||||||
|
// 更新用户码
|
||||||
|
Long id = Long.parseLong(params.get("id").toString());
|
||||||
|
String userCode = ShareCodeUtil.gen(id);
|
||||||
|
updateUserCode(openId, userCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -132,4 +136,24 @@ public class OfficialAccountUserServiceImpl extends DefaultBaseService implement
|
|||||||
public SuccessResultList<List<OfficialAccountUserDTO>> listPage(ListPage page) {
|
public SuccessResultList<List<OfficialAccountUserDTO>> listPage(ListPage page) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUserCodeByOpenId(String openId) {
|
||||||
|
OfficialAccountUserPO officialAccountUserPO = getPO(officialAccountProperties.getAppId(), openId);
|
||||||
|
return officialAccountUserPO.getUserCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新用户码(邀请码)
|
||||||
|
* @param openId
|
||||||
|
* @param userCode
|
||||||
|
*/
|
||||||
|
private void updateUserCode(String openId, String userCode) {
|
||||||
|
Map<String, Object> params = getHashMap(6);
|
||||||
|
params.put("appId", officialAccountProperties.getAppId());
|
||||||
|
params.put("openId", openId);
|
||||||
|
params.put("userCode", userCode);
|
||||||
|
officialAccountUserDao.updateUserCode(params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
<result column="app_id" property="appId"/>
|
<result column="app_id" property="appId"/>
|
||||||
<result column="open_id" property="openId"/>
|
<result column="open_id" property="openId"/>
|
||||||
<result column="user_id" property="userId"/>
|
<result column="user_id" property="userId"/>
|
||||||
|
<result column="user_code" property="userCode"/>
|
||||||
<result column="is_init_account" property="isInitAccount"/>
|
<result column="is_init_account" property="isInitAccount"/>
|
||||||
<result column="gmt_create" property="gmtCreate"/>
|
<result column="gmt_create" property="gmtCreate"/>
|
||||||
<result column="gmt_modified" property="gmtModified"/>
|
<result column="gmt_modified" property="gmtModified"/>
|
||||||
@ -43,7 +44,7 @@
|
|||||||
</update>
|
</update>
|
||||||
|
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<insert id="save" parameterType="map" flushCache="true">
|
<insert id="save" parameterType="map" flushCache="true" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
|
||||||
INSERT INTO wechat_official_account_user(
|
INSERT INTO wechat_official_account_user(
|
||||||
app_id,
|
app_id,
|
||||||
open_id,
|
open_id,
|
||||||
@ -96,6 +97,19 @@
|
|||||||
open_id = #{openId}
|
open_id = #{openId}
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
|
<!-- 修改用户码(邀请码) -->
|
||||||
|
<update id="updateUserCode" parameterType="map" flushCache="true">
|
||||||
|
UPDATE
|
||||||
|
wechat_official_account_user
|
||||||
|
SET
|
||||||
|
user_code = #{userCode}
|
||||||
|
WHERE
|
||||||
|
app_id = #{appId}
|
||||||
|
AND
|
||||||
|
open_id = #{openId}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
|
||||||
<!-- 详情 -->
|
<!-- 详情 -->
|
||||||
<select id="get" parameterType="map" resultMap="officialAccountUserDTO" useCache="true">
|
<select id="get" parameterType="map" resultMap="officialAccountUserDTO" useCache="true">
|
||||||
SELECT
|
SELECT
|
||||||
@ -148,6 +162,7 @@
|
|||||||
app_id,
|
app_id,
|
||||||
open_id,
|
open_id,
|
||||||
user_id,
|
user_id,
|
||||||
|
user_code,
|
||||||
status,
|
status,
|
||||||
is_init_account,
|
is_init_account,
|
||||||
gmt_create,
|
gmt_create,
|
||||||
@ -175,6 +190,7 @@
|
|||||||
app_id,
|
app_id,
|
||||||
open_id,
|
open_id,
|
||||||
user_id,
|
user_id,
|
||||||
|
user_code,
|
||||||
status,
|
status,
|
||||||
is_init_account,
|
is_init_account,
|
||||||
gmt_create,
|
gmt_create,
|
||||||
|
Loading…
Reference in New Issue
Block a user