Commit 5f34f277 authored by shiyu's avatar shiyu

安全识别

parent c0676efd
...@@ -67,6 +67,7 @@ public class QdWxAppletApi { ...@@ -67,6 +67,7 @@ public class QdWxAppletApi {
public String checkMedia(WxCheckMediaRequestDto dto) { public String checkMedia(WxCheckMediaRequestDto dto) {
try {
String accessToken = qdWxLoginManager.getAccessToken(); String accessToken = qdWxLoginManager.getAccessToken();
String url = String.format(MEDIA_CHECK_URL, accessToken); String url = String.format(MEDIA_CHECK_URL, accessToken);
OkHttpUtil okHttpUtil = OkHttpUtil.builder().url(url); OkHttpUtil okHttpUtil = OkHttpUtil.builder().url(url);
...@@ -80,7 +81,36 @@ public class QdWxAppletApi { ...@@ -80,7 +81,36 @@ public class QdWxAppletApi {
okHttpUtil.post(true); okHttpUtil.post(true);
String responseStr = okHttpUtil.async(); String responseStr = okHttpUtil.async();
logger.info("[checkMedia] response :{}", responseStr); logger.info("[checkMedia] response :{}", responseStr);
return responseStr; String traceId = JsonUtils.getValueByPath(responseStr, "trace_id");
return traceId;
} catch (Exception e) {
logger.error("checkMedia error : {}", e);
}
return null;
}
public String checkAudio(WxCheckMediaRequestDto dto) {
try {
String accessToken = qdWxLoginManager.getAccessToken();
String url = String.format(MEDIA_CHECK_URL, accessToken);
OkHttpUtil okHttpUtil = OkHttpUtil.builder().url(url);
Map<String, Object> map = new HashMap<>();
map.put("media_url", dto.getMediaUrl());
map.put("media_type", dto.getMediaType());
map.put("version", 2);
map.put("scene", 4);
map.put("openid", dto.getWxOpenId());
okHttpUtil.addParams(map);
okHttpUtil.post(true);
String responseStr = okHttpUtil.async();
logger.info("[checkAudio] response :{}", responseStr);
String traceId = JsonUtils.getValueByPath(responseStr, "trace_id");
return traceId;
} catch (Exception e) {
logger.error("checkAudio error : {}", e);
}
return null;
} }
......
...@@ -54,6 +54,11 @@ public interface CommConsts { ...@@ -54,6 +54,11 @@ public interface CommConsts {
*/ */
public static final String AUCTION_LOCK_KEY_PRE = "AUCTION:OFFER:"; public static final String AUCTION_LOCK_KEY_PRE = "AUCTION:OFFER:";
/**
* 微信内容安全检测结果缓存
*/
public static final String QIANDAO_CHECK_RESULT_KEY = "qiandao:check:result:key:";
/** /**
* 拍卖保证金额度更新的锁 * 拍卖保证金额度更新的锁
*/ */
......
package com.wwdz.ch.core.consts.qiandao;
public class WxCheckEnum {
/**
* 检测类型
*/
public enum TypeEnum {
SIGN_IN_IMAGE(1, "签到笔记图片"),
SIGN_IN_AUDIO(2, "签到笔记音频"),
USER_AVATAR(3, "用户头像"),
USER_TASK(4, "用户创建的任务"),
;
private int code;
private String des;
TypeEnum(int code, String des) {
this.code = code;
this.des = des;
}
public static String getNameByCode(int code) {
for (SignInTaskEnum.TypeEnum typeEnum : SignInTaskEnum.TypeEnum.values()) {
if (code == typeEnum.getCode()) {
return typeEnum.getDes();
}
}
return null;
}
public int getCode() {
return code;
}
public String getDes() {
return des;
}
}
}
...@@ -7,7 +7,7 @@ import java.util.List; ...@@ -7,7 +7,7 @@ import java.util.List;
public interface QdUserSignInNoteDao { public interface QdUserSignInNoteDao {
boolean insert(QdUserSignInNote qdUserSignInNote); long insert(QdUserSignInNote qdUserSignInNote);
List<QdUserSignInNote> findByPage(QdUserSignInNoteRequestDto dto); List<QdUserSignInNote> findByPage(QdUserSignInNoteRequestDto dto);
......
...@@ -21,4 +21,6 @@ public interface SignInTaskDao { ...@@ -21,4 +21,6 @@ public interface SignInTaskDao {
SignInTask findById(long taskId); SignInTask findById(long taskId);
boolean updateByPrimaryKey(SignInTask signInTask); boolean updateByPrimaryKey(SignInTask signInTask);
boolean delete(long taskId);
} }
package com.wwdz.ch.db.dao.qiandao;
import com.wwdz.ch.db.domain.qiandao.SignInTask;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecord;
public interface WxCheckRecordDao {
boolean insert(WxCheckRecord wxCheckRecord);
WxCheckRecord findByTraceId(String traceId);
boolean update(WxCheckRecord wxCheckRecord);
boolean updateByPrimaryKey(WxCheckRecord wxCheckRecord);
}
...@@ -22,8 +22,9 @@ public class QdUserSignInNoteDaoImpl implements QdUserSignInNoteDao { ...@@ -22,8 +22,9 @@ public class QdUserSignInNoteDaoImpl implements QdUserSignInNoteDao {
QdUserSignInNoteMapper qdUserSignInNoteMapper; QdUserSignInNoteMapper qdUserSignInNoteMapper;
@Override @Override
public boolean insert(QdUserSignInNote qdUserSignInNote) { public long insert(QdUserSignInNote qdUserSignInNote) {
return qdUserSignInNoteMapper.insert(qdUserSignInNote) > 0; qdUserSignInNoteMapper.insert(qdUserSignInNote);
return qdUserSignInNote.getId();
} }
@Override @Override
......
...@@ -73,4 +73,10 @@ public class SignInTaskDaoImpl implements SignInTaskDao { ...@@ -73,4 +73,10 @@ public class SignInTaskDaoImpl implements SignInTaskDao {
public boolean updateByPrimaryKey(SignInTask signInTask) { public boolean updateByPrimaryKey(SignInTask signInTask) {
return signInTaskMapper.updateByPrimaryKeySelective(signInTask) > 0; return signInTaskMapper.updateByPrimaryKeySelective(signInTask) > 0;
} }
@Override
public boolean delete(long taskId) {
return signInTaskMapper.deleteByPrimaryKey(taskId) > 0;
}
} }
package com.wwdz.ch.db.impl.qiandao;
import com.wwdz.ch.db.dao.qiandao.WxCheckRecordDao;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecord;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecordExample;
import com.wwdz.ch.db.mapper.qiandao.WxCheckRecordMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class WxCheckRecordDaoImpl implements WxCheckRecordDao {
@Autowired
WxCheckRecordMapper wxCheckRecordMapper;
@Override
public boolean insert(WxCheckRecord wxCheckRecord) {
return wxCheckRecordMapper.insert(wxCheckRecord) > 0;
}
@Override
public WxCheckRecord findByTraceId(String traceId) {
WxCheckRecordExample example = new WxCheckRecordExample();
WxCheckRecordExample.Criteria criteria = example.createCriteria();
criteria.andTraceIdEqualTo(traceId);
return wxCheckRecordMapper.selectOneByExample(example);
}
@Override
public boolean update(WxCheckRecord wxCheckRecord) {
WxCheckRecordExample example = new WxCheckRecordExample();
WxCheckRecordExample.Criteria criteria = example.createCriteria();
criteria.andTraceIdEqualTo(wxCheckRecord.getTraceId());
return wxCheckRecordMapper.updateByExampleSelective(wxCheckRecord,example) > 0;
}
@Override
public boolean updateByPrimaryKey(WxCheckRecord wxCheckRecord) {
return wxCheckRecordMapper.updateByPrimaryKeySelective(wxCheckRecord) > 0;
}
}
package com.wwdz.ch.db.mapper.qiandao;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecord;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecordExample;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface WxCheckRecordMapper {
long countByExample(WxCheckRecordExample example);
int deleteByExample(WxCheckRecordExample example);
int deleteByPrimaryKey(Long id);
int insert(WxCheckRecord record);
int insertSelective(WxCheckRecord record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table wx_check_record
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
WxCheckRecord selectOneByExample(WxCheckRecordExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table wx_check_record
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
WxCheckRecord selectOneByExampleSelective(@Param("example") WxCheckRecordExample example, @Param("selective") WxCheckRecord.Column ... selective);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table wx_check_record
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
List<WxCheckRecord> selectByExampleSelective(@Param("example") WxCheckRecordExample example, @Param("selective") WxCheckRecord.Column ... selective);
List<WxCheckRecord> selectByExample(WxCheckRecordExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table wx_check_record
*
* @mbg.generated
* @project https://github.com/itfsw/mybatis-generator-plugin
*/
WxCheckRecord selectByPrimaryKeySelective(@Param("id") Long id, @Param("selective") WxCheckRecord.Column ... selective);
WxCheckRecord selectByPrimaryKey(Long id);
int updateByExampleSelective(@Param("record") WxCheckRecord record, @Param("example") WxCheckRecordExample example);
int updateByExample(@Param("record") WxCheckRecord record, @Param("example") WxCheckRecordExample example);
int updateByPrimaryKeySelective(WxCheckRecord record);
int updateByPrimaryKey(WxCheckRecord record);
}
\ No newline at end of file
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
<javaClientGenerator type="XMLMAPPER" targetPackage="com.wwdz.ch.db.mapper.qiandao" <javaClientGenerator type="XMLMAPPER" targetPackage="com.wwdz.ch.db.mapper.qiandao"
targetProject="ch-dao/src/main/java"/> targetProject="ch-dao/src/main/java"/>
<table tableName="sign_in_task" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"> <table tableName="wx_check_record" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
<generatedKey column="id" sqlStatement="Mysql" identity="true" /> <generatedKey column="id" sqlStatement="Mysql" identity="true" />
</table> </table>
......
...@@ -2,13 +2,19 @@ package com.wwdz.ch.wx.api; ...@@ -2,13 +2,19 @@ package com.wwdz.ch.wx.api;
import com.wwdz.ch.core.api.QdOfficialAccountApi; import com.wwdz.ch.core.api.QdOfficialAccountApi;
import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.consts.OfficalAccountEnum; import com.wwdz.ch.core.consts.OfficalAccountEnum;
import com.wwdz.ch.core.consts.qiandao.WxCheckEnum;
import com.wwdz.ch.core.util.RedisUtils;
import com.wwdz.ch.db.dao.qiandao.QdUserDao; import com.wwdz.ch.db.dao.qiandao.QdUserDao;
import com.wwdz.ch.db.domain.qiandao.QdOfficialAccountSubscribeRecord; import com.wwdz.ch.db.dao.qiandao.QdUserSignInNoteDao;
import com.wwdz.ch.db.domain.qiandao.QdUser; import com.wwdz.ch.db.dao.qiandao.SignInTaskDao;
import com.wwdz.ch.db.dao.qiandao.WxCheckRecordDao;
import com.wwdz.ch.db.domain.qiandao.*;
import com.wwdz.ch.wx.api.aes.AesException; import com.wwdz.ch.wx.api.aes.AesException;
import com.wwdz.ch.wx.api.aes.WXBizMsgCrypt; import com.wwdz.ch.wx.api.aes.WXBizMsgCrypt;
import com.wwdz.ch.wx.service.qiandao.QdOfficialAccountSubscribeRecordService; import com.wwdz.ch.wx.service.qiandao.QdOfficialAccountSubscribeRecordService;
import com.xxdxxs.utils.JsonUtils;
import com.xxdxxs.utils.StringUtils; import com.xxdxxs.utils.StringUtils;
import com.xxdxxs.utils.XmlUtils; import com.xxdxxs.utils.XmlUtils;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
...@@ -50,6 +56,17 @@ public class QdAppletCallbackController { ...@@ -50,6 +56,17 @@ public class QdAppletCallbackController {
@Autowired @Autowired
QdUserDao qdUserDao; QdUserDao qdUserDao;
@Autowired
RedisUtils redisUtils;
@Autowired
WxCheckRecordDao wxCheckRecordDao;
@Autowired
QdUserSignInNoteDao qdUserSignInNoteDao;
@Autowired
SignInTaskDao signInTaskDao;
@RequestMapping(value ="/getNotice") @RequestMapping(value ="/getNotice")
public Object getNotice(@RequestParam(required = false, name = "signature") String signature, public Object getNotice(@RequestParam(required = false, name = "signature") String signature,
...@@ -57,10 +74,70 @@ public class QdAppletCallbackController { ...@@ -57,10 +74,70 @@ public class QdAppletCallbackController {
@RequestParam(required = false, name = "nonce") String nonce, @RequestParam(required = false, name = "nonce") String nonce,
@RequestParam(required = false, name = "echostr") String echostr, @RequestParam(required = false, name = "echostr") String echostr,
HttpServletRequest request, HttpServletResponse response){ HttpServletRequest request, HttpServletResponse response){
logger.info("接收小程序推送信息校验 -> appid: {}, signature:{}, timestamp:{}, nonce:{}, echostr : {}", APPID, signature, timestamp, nonce, echostr); logger.info("接收微信内容安全审核异步通知校验 -> appid: {}, signature:{}, timestamp:{}, nonce:{}, echostr : {}", APPID, signature, timestamp, nonce, echostr);
if (StringUtils.hasLength(echostr)) { if (StringUtils.hasLength(echostr)) {
return Long.valueOf(echostr.trim()); return Long.valueOf(echostr.trim());
} }
ByteArrayOutputStream output = null;
InputStream input = null;
try {
output = new ByteArrayOutputStream();
input = request.getInputStream();
byte[] by = new byte[1024];
int length = 0;
while ((length = input.read(by)) != -1) {
output.write(by, 0, length);
}
String noticeStr = new String(output.toByteArray(), "UTF-8");
String result = JsonUtils.getValueByPath(noticeStr, "result/suggest");
String traceId = JsonUtils.getValueByPath(noticeStr, "trace_id");
WxCheckRecord wxCheckRecord = wxCheckRecordDao.findByTraceId(traceId);
int type = wxCheckRecord.getType();
long sourceId = wxCheckRecord.getSourceId();
long userId = wxCheckRecord.getUserId();
if (wxCheckRecord != null) {
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSuggest(result);
wxCheckRecord.setCreateTime(new Date());
wxCheckRecordDao.updateByPrimaryKey(wxCheckRecord);
}
if (!"pass".equals(result)) {
//审核不通过,redis记录并标记
if (WxCheckEnum.TypeEnum.SIGN_IN_IMAGE.getCode() == type || WxCheckEnum.TypeEnum.SIGN_IN_AUDIO.getCode() == type) {
QdUserSignInNote qdUserSignInNote = new QdUserSignInNote();
qdUserSignInNote.setId(sourceId);
qdUserSignInNote.setIsDeleted(true);
qdUserSignInNoteDao.updateByPrimaryKey(qdUserSignInNote);
} else if (WxCheckEnum.TypeEnum.USER_AVATAR.getCode() == type) {
QdUser qdUser = new QdUser();
qdUser.setId(sourceId);
qdUser.setAvatar(CommConsts.QIANDAO_DEFAULT_AVATAR_URL);
qdUserDao.updateById(qdUser);
} else if (WxCheckEnum.TypeEnum.USER_TASK.getCode() == type) {
signInTaskDao.delete(sourceId);
}
String key = CommConsts.QIANDAO_CHECK_RESULT_KEY + userId;
redisUtils.set(key, result);
}
logger.info("微信内容安全审核异步通知原文:{}", noticeStr);
} catch (Exception e) {
logger.error("微信公众号通知回调接口 error : {}", e);
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
if (input != null) {
try {
input.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return "success"; return "success";
} }
......
...@@ -199,4 +199,15 @@ public class QdHomePageServiceImpl implements QdHomePageService { ...@@ -199,4 +199,15 @@ public class QdHomePageServiceImpl implements QdHomePageService {
} }
return Result.failed(); return Result.failed();
} }
@Override
public Result check(QdUserSignInRequestDto dto) {
String key = CommConsts.QIANDAO_CHECK_RESULT_KEY + dto.getUserId();
if (redisUtils.hasKey(key)) {
redisUtils.delete(key);
return Result.failed();
}
return Result.success();
}
} }
...@@ -4,22 +4,22 @@ import com.github.pagehelper.PageInfo; ...@@ -4,22 +4,22 @@ import com.github.pagehelper.PageInfo;
import com.wwdz.ch.core.api.qiandao.QdWxAppletApi; import com.wwdz.ch.core.api.qiandao.QdWxAppletApi;
import com.wwdz.ch.core.consts.CommConsts; import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.consts.qiandao.SignInTaskEnum; import com.wwdz.ch.core.consts.qiandao.SignInTaskEnum;
import com.wwdz.ch.core.consts.qiandao.WxCheckEnum;
import com.wwdz.ch.core.entity.WxCheckMediaRequestDto; import com.wwdz.ch.core.entity.WxCheckMediaRequestDto;
import com.wwdz.ch.core.type.PageSearchResult; import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result; import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dao.qiandao.QdUserDao; import com.wwdz.ch.db.dao.qiandao.*;
import com.wwdz.ch.db.dao.qiandao.QdUserSignInDao;
import com.wwdz.ch.db.dao.qiandao.QdUserSignInTaskDao;
import com.wwdz.ch.db.dao.qiandao.SignInTaskDao;
import com.wwdz.ch.db.domain.qiandao.QdUser; import com.wwdz.ch.db.domain.qiandao.QdUser;
import com.wwdz.ch.db.domain.qiandao.QdUserSignIn; import com.wwdz.ch.db.domain.qiandao.QdUserSignIn;
import com.wwdz.ch.db.domain.qiandao.SignInTask; import com.wwdz.ch.db.domain.qiandao.SignInTask;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecord;
import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInTaskRequestDto; import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInTaskRequestDto;
import com.wwdz.ch.db.dto.request.qiandao.SignInTaskRequestDto; import com.wwdz.ch.db.dto.request.qiandao.SignInTaskRequestDto;
import com.wwdz.ch.wx.entity.vo.qiandao.SignInTaskVo; import com.wwdz.ch.wx.entity.vo.qiandao.SignInTaskVo;
import com.wwdz.ch.wx.service.qiandao.QdSignInTaskService; import com.wwdz.ch.wx.service.qiandao.QdSignInTaskService;
import com.wwdz.ch.wx.service.qiandao.QdUserSignInTaskService; import com.wwdz.ch.wx.service.qiandao.QdUserSignInTaskService;
import com.xxdxxs.utils.EntityMapper; import com.xxdxxs.utils.EntityMapper;
import com.xxdxxs.utils.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -59,6 +59,9 @@ public class QdSignInTaskServiceImpl implements QdSignInTaskService { ...@@ -59,6 +59,9 @@ public class QdSignInTaskServiceImpl implements QdSignInTaskService {
@Autowired @Autowired
QdWxAppletApi qdWxAppletApi; QdWxAppletApi qdWxAppletApi;
@Autowired
WxCheckRecordDao wxCheckRecordDao;
@Override @Override
public Result add(SignInTaskRequestDto dto) { public Result add(SignInTaskRequestDto dto) {
try { try {
...@@ -97,6 +100,24 @@ public class QdSignInTaskServiceImpl implements QdSignInTaskService { ...@@ -97,6 +100,24 @@ public class QdSignInTaskServiceImpl implements QdSignInTaskService {
return Result.failed("创建任务后默认加入失败"); return Result.failed("创建任务后默认加入失败");
} }
} }
if (StringUtils.hasLength(dto.getImage())) {
//微信音频内容安全识别
wxCheckMediaRequestDto.setMediaType(2);
wxCheckMediaRequestDto.setMediaUrl(dto.getImage());
String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
if (StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(taskId);
wxCheckRecord.setUserId(dto.getCreatorId());
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_IMAGE.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
}
logger.info("=========== 微信图片内容安全识别接口调用成功 ===========");
}
return Result.success(); return Result.success();
} catch (Exception e) { } catch (Exception e) {
logger.error("创建签到任务失败 error:{}", e); logger.error("创建签到任务失败 error:{}", e);
......
...@@ -6,6 +6,7 @@ import com.wwdz.ch.core.api.WxAppletApi; ...@@ -6,6 +6,7 @@ import com.wwdz.ch.core.api.WxAppletApi;
import com.wwdz.ch.core.api.qiandao.QdWxAppletApi; import com.wwdz.ch.core.api.qiandao.QdWxAppletApi;
import com.wwdz.ch.core.api.qiandao.QdWxLoginManager; import com.wwdz.ch.core.api.qiandao.QdWxLoginManager;
import com.wwdz.ch.core.consts.CommConsts; import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.consts.qiandao.WxCheckEnum;
import com.wwdz.ch.core.entity.QdUserInfo; import com.wwdz.ch.core.entity.QdUserInfo;
import com.wwdz.ch.core.entity.WxCheckMediaRequestDto; import com.wwdz.ch.core.entity.WxCheckMediaRequestDto;
import com.wwdz.ch.core.notify.AliSmsSender; import com.wwdz.ch.core.notify.AliSmsSender;
...@@ -16,7 +17,9 @@ import com.wwdz.ch.core.type.Result; ...@@ -16,7 +17,9 @@ import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.*; import com.wwdz.ch.core.util.*;
import com.wwdz.ch.core.util.bcrypt.BCryptPasswordEncoder; import com.wwdz.ch.core.util.bcrypt.BCryptPasswordEncoder;
import com.wwdz.ch.db.dao.qiandao.QdUserDao; import com.wwdz.ch.db.dao.qiandao.QdUserDao;
import com.wwdz.ch.db.dao.qiandao.WxCheckRecordDao;
import com.wwdz.ch.db.domain.qiandao.QdUser; import com.wwdz.ch.db.domain.qiandao.QdUser;
import com.wwdz.ch.db.domain.qiandao.WxCheckRecord;
import com.wwdz.ch.db.dto.request.qiandao.QdUserRequestDto; import com.wwdz.ch.db.dto.request.qiandao.QdUserRequestDto;
import com.wwdz.ch.wx.constant.CacheCodeConstants; import com.wwdz.ch.wx.constant.CacheCodeConstants;
import com.wwdz.ch.wx.dao.UserInfo; import com.wwdz.ch.wx.dao.UserInfo;
...@@ -90,6 +93,9 @@ public class QdUserServiceImpl implements QdUserService { ...@@ -90,6 +93,9 @@ public class QdUserServiceImpl implements QdUserService {
@Autowired @Autowired
QdWxAppletApi qdWxAppletApi; QdWxAppletApi qdWxAppletApi;
@Autowired
WxCheckRecordDao wxCheckRecordDao;
@Override @Override
public Result regCaptcha(QdUserRequestDto dto) { public Result regCaptcha(QdUserRequestDto dto) {
try { try {
...@@ -289,13 +295,18 @@ public class QdUserServiceImpl implements QdUserService { ...@@ -289,13 +295,18 @@ public class QdUserServiceImpl implements QdUserService {
wxCheckMediaRequestDto.setMediaType(2); wxCheckMediaRequestDto.setMediaType(2);
wxCheckMediaRequestDto.setMediaUrl(dto.getAvatar()); wxCheckMediaRequestDto.setMediaUrl(dto.getAvatar());
wxCheckMediaRequestDto.setWxOpenId(user.getWxOpenid()); wxCheckMediaRequestDto.setWxOpenId(user.getWxOpenid());
qdWxAppletApi.checkMedia(wxCheckMediaRequestDto); String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
logger.info("=========== 微信图片内容安全识别接口调用成功 ==========="); if (com.xxdxxs.utils.StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(user.getId());
wxCheckRecord.setUserId(user.getId());
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_IMAGE.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
} }
String key = dto.getUserId() + "_updateAvatar"; logger.info("=========== 微信图片内容安全识别接口调用成功 ===========");
if (!redisUtils.hasKey(key)) {
redisUtils.set(key, key, 30);
return Result.failed("头像安全检测有风险,请更换");
} }
user.setAvatar(dto.getAvatar()); user.setAvatar(dto.getAvatar());
qdUserDao.updateById(user); qdUserDao.updateById(user);
......
package com.wwdz.ch.wx.impl.qiandao; package com.wwdz.ch.wx.impl.qiandao;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.wwdz.ch.core.api.qiandao.QdWxAppletApi;
import com.wwdz.ch.core.consts.qiandao.WxCheckEnum;
import com.wwdz.ch.core.entity.WxCheckMediaRequestDto;
import com.wwdz.ch.core.type.PageSearchResult; import com.wwdz.ch.core.type.PageSearchResult;
import com.wwdz.ch.core.type.Result; import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.RedisUtils;
import com.wwdz.ch.db.dao.qiandao.*; import com.wwdz.ch.db.dao.qiandao.*;
import com.wwdz.ch.db.domain.qiandao.QdUser; import com.wwdz.ch.db.domain.qiandao.*;
import com.wwdz.ch.db.domain.qiandao.QdUserSignIn;
import com.wwdz.ch.db.domain.qiandao.QdUserSignInNote;
import com.wwdz.ch.db.domain.qiandao.SignInTask;
import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInNoteRequestDto; import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInNoteRequestDto;
import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInRequestDto; import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInRequestDto;
import com.wwdz.ch.wx.entity.vo.qiandao.QdSignInNoteVo; import com.wwdz.ch.wx.entity.vo.qiandao.QdSignInNoteVo;
...@@ -19,6 +20,7 @@ import org.slf4j.Logger; ...@@ -19,6 +20,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -49,6 +51,15 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService { ...@@ -49,6 +51,15 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService {
@Autowired @Autowired
QdGiveLikeRecordDao qdGiveLikeRecordDao; QdGiveLikeRecordDao qdGiveLikeRecordDao;
@Autowired
QdWxAppletApi qdWxAppletApi;
@Autowired
RedisUtils redisUtils;
@Autowired
WxCheckRecordDao wxCheckRecordDao;
@Override @Override
public Result findSignInNoteList(QdUserSignInNoteRequestDto dto) { public Result findSignInNoteList(QdUserSignInNoteRequestDto dto) {
try { try {
...@@ -173,6 +184,10 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService { ...@@ -173,6 +184,10 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService {
@Override @Override
public Result update(QdUserSignInRequestDto dto) { public Result update(QdUserSignInRequestDto dto) {
try { try {
QdUserSignInNote note = qdUserSignInNoteDao.findByNoteId(dto.getId());
long sourceId = dto.getId();
long userId = note.getUserId();
//保存签到笔记 //保存签到笔记
QdUserSignInNote qdUserSignInNote = new QdUserSignInNote(); QdUserSignInNote qdUserSignInNote = new QdUserSignInNote();
qdUserSignInNote.setId(dto.getId()); qdUserSignInNote.setId(dto.getId());
...@@ -184,6 +199,52 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService { ...@@ -184,6 +199,52 @@ public class QdUserSignInNoteServiceImpl implements QdUserSignInNoteService {
qdUserSignInNote.setUpdateTime(new Date()); qdUserSignInNote.setUpdateTime(new Date());
qdUserSignInNote.setIsPrivate(dto.getIsPrivate()); qdUserSignInNote.setIsPrivate(dto.getIsPrivate());
qdUserSignInNoteDao.updateByPrimaryKey(qdUserSignInNote); qdUserSignInNoteDao.updateByPrimaryKey(qdUserSignInNote);
WxCheckMediaRequestDto wxCheckMediaRequestDto = new WxCheckMediaRequestDto();
QdUser user = qdUserDao.queryById(dto.getUserId());
wxCheckMediaRequestDto.setWxOpenId(user.getWxOpenid());
if (StringUtils.hasLength(dto.getContent())) {
//查询用户openid
wxCheckMediaRequestDto.setWordStr(dto.getContent());
boolean result = qdWxAppletApi.checkWord(wxCheckMediaRequestDto);
logger.info("=========== 微信文字内容安全识别接口调用成功 ===========");
if (!result) {
return Result.failed("发布的文字内容识别有风险,不可发布");
}
}
if (!CollectionUtils.isEmpty(dto.getImages())) {
//微信音频内容安全识别
wxCheckMediaRequestDto.setMediaType(2);
wxCheckMediaRequestDto.setMediaUrl(dto.getImages().get(0));
String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
if (StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(sourceId);
wxCheckRecord.setUserId(userId);
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_IMAGE.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
}
logger.info("=========== 微信图片内容安全识别接口调用成功 ===========");
}
if (!StringUtils.isEmpty(dto.getAudio())) {
wxCheckMediaRequestDto.setMediaType(1);
wxCheckMediaRequestDto.setMediaUrl(dto.getAudio());
String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
if (StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(sourceId);
wxCheckRecord.setUserId(userId);
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_AUDIO.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
}
logger.info("=========== 微信音频内容安全识别接口调用成功 ===========");
}
return Result.success(); return Result.success();
} catch (Exception e) { } catch (Exception e) {
logger.error("修改笔记 error:{}", e); logger.error("修改笔记 error:{}", e);
......
...@@ -7,6 +7,7 @@ import com.wwdz.ch.core.consts.CommConsts; ...@@ -7,6 +7,7 @@ import com.wwdz.ch.core.consts.CommConsts;
import com.wwdz.ch.core.consts.DistributionEnum; import com.wwdz.ch.core.consts.DistributionEnum;
import com.wwdz.ch.core.consts.SigninEnum; import com.wwdz.ch.core.consts.SigninEnum;
import com.wwdz.ch.core.consts.qiandao.SignInTaskEnum; import com.wwdz.ch.core.consts.qiandao.SignInTaskEnum;
import com.wwdz.ch.core.consts.qiandao.WxCheckEnum;
import com.wwdz.ch.core.entity.WxCheckMediaRequestDto; import com.wwdz.ch.core.entity.WxCheckMediaRequestDto;
import com.wwdz.ch.core.type.Result; import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.IdUtils; import com.wwdz.ch.core.util.IdUtils;
...@@ -15,13 +16,11 @@ import com.wwdz.ch.db.dao.distribution.DistributionOrderDao; ...@@ -15,13 +16,11 @@ import com.wwdz.ch.db.dao.distribution.DistributionOrderDao;
import com.wwdz.ch.db.dao.qiandao.*; import com.wwdz.ch.db.dao.qiandao.*;
import com.wwdz.ch.db.domain.User; import com.wwdz.ch.db.domain.User;
import com.wwdz.ch.db.domain.distribution.DistributionOrder; import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.domain.qiandao.QdUser; import com.wwdz.ch.db.domain.qiandao.*;
import com.wwdz.ch.db.domain.qiandao.QdUserSignIn;
import com.wwdz.ch.db.domain.qiandao.QdUserSignInNote;
import com.wwdz.ch.db.domain.qiandao.SignInTask;
import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInRequestDto; import com.wwdz.ch.db.dto.request.qiandao.QdUserSignInRequestDto;
import com.wwdz.ch.wx.service.qiandao.QdUserSignInService; import com.wwdz.ch.wx.service.qiandao.QdUserSignInService;
import com.xxdxxs.utils.DateUtils; import com.xxdxxs.utils.DateUtils;
import com.xxdxxs.utils.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -69,6 +68,9 @@ public class QdUserSignInServiceImpl implements QdUserSignInService { ...@@ -69,6 +68,9 @@ public class QdUserSignInServiceImpl implements QdUserSignInService {
@Autowired @Autowired
RedisUtils redisUtils; RedisUtils redisUtils;
@Autowired
WxCheckRecordDao wxCheckRecordDao;
@Override @Override
public Result check(QdUserSignInRequestDto dto) { public Result check(QdUserSignInRequestDto dto) {
try { try {
...@@ -143,25 +145,15 @@ public class QdUserSignInServiceImpl implements QdUserSignInService { ...@@ -143,25 +145,15 @@ public class QdUserSignInServiceImpl implements QdUserSignInService {
//查询用户openid //查询用户openid
QdUser user = qdUserDao.queryById(dto.getUserId()); QdUser user = qdUserDao.queryById(dto.getUserId());
wxCheckMediaRequestDto.setWxOpenId(user.getWxOpenid()); wxCheckMediaRequestDto.setWxOpenId(user.getWxOpenid());
if (!CollectionUtils.isEmpty(dto.getImages())) {
//微信音频内容安全识别
wxCheckMediaRequestDto.setMediaType(2);
wxCheckMediaRequestDto.setMediaUrl(dto.getImages().get(0));
qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
logger.info("=========== 微信音频内容安全识别接口调用成功 ===========");
String key = dto.getUserId() + "_signIn";
if (!redisUtils.hasKey(key)) {
redisUtils.set(key, key, 30);
return Result.failed("图片安全检测有风险,请更换");
}
}
if (StringUtils.hasLength(dto.getContent())) {
wxCheckMediaRequestDto.setWordStr(dto.getContent()); wxCheckMediaRequestDto.setWordStr(dto.getContent());
boolean result = qdWxAppletApi.checkWord(wxCheckMediaRequestDto); boolean result = qdWxAppletApi.checkWord(wxCheckMediaRequestDto);
logger.info("=========== 微信文字内容安全识别接口调用成功 ==========="); logger.info("=========== 微信文字内容安全识别接口调用成功 ===========");
if (!result) { if (!result) {
return Result.failed("发布的文字内容识别有风险,不可发布"); return Result.failed("发布的文字内容识别有风险,不可发布");
} }
}
//签到记录id //签到记录id
Long recordId = null; Long recordId = null;
//今天尚未签到,则进行记录,先查询昨天的打卡记录,有则再连续打卡天数上+1,没有则算签到第一天 //今天尚未签到,则进行记录,先查询昨天的打卡记录,有则再连续打卡天数上+1,没有则算签到第一天
...@@ -211,7 +203,41 @@ public class QdUserSignInServiceImpl implements QdUserSignInService { ...@@ -211,7 +203,41 @@ public class QdUserSignInServiceImpl implements QdUserSignInService {
qdUserSignInNote.setUpdateTime(now); qdUserSignInNote.setUpdateTime(now);
qdUserSignInNote.setIsPrivate(dto.getIsPrivate()); qdUserSignInNote.setIsPrivate(dto.getIsPrivate());
qdUserSignInNote.setIsDeleted(false); qdUserSignInNote.setIsDeleted(false);
qdUserSignInNoteDao.insert(qdUserSignInNote); long id = qdUserSignInNoteDao.insert(qdUserSignInNote);
if (!CollectionUtils.isEmpty(dto.getImages())) {
//微信音频内容安全识别
wxCheckMediaRequestDto.setMediaType(2);
wxCheckMediaRequestDto.setMediaUrl(dto.getImages().get(0));
String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
if (StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(id);
wxCheckRecord.setUserId(userId);
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_IMAGE.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
}
logger.info("=========== 微信图片内容安全识别接口调用成功 ===========");
}
if (!StringUtils.isEmpty(dto.getAudio())) {
wxCheckMediaRequestDto.setMediaType(1);
wxCheckMediaRequestDto.setMediaUrl(dto.getAudio());
String traceId = qdWxAppletApi.checkMedia(wxCheckMediaRequestDto);
if (StringUtils.hasLength(traceId)) {
//保存该检测任务
WxCheckRecord wxCheckRecord = new WxCheckRecord();
wxCheckRecord.setTraceId(traceId);
wxCheckRecord.setSourceId(id);
wxCheckRecord.setUserId(userId);
wxCheckRecord.setCreateTime(new Date());
wxCheckRecord.setType(WxCheckEnum.TypeEnum.SIGN_IN_AUDIO.getCode());
wxCheckRecordDao.insert(wxCheckRecord);
}
logger.info("=========== 微信音频内容安全识别接口调用成功 ===========");
}
return Result.success(); return Result.success();
} catch (Exception e) { } catch (Exception e) {
logger.error("乾岛签到失败 error:{}", e); logger.error("乾岛签到失败 error:{}", e);
......
...@@ -35,4 +35,11 @@ public interface QdHomePageService { ...@@ -35,4 +35,11 @@ public interface QdHomePageService {
* @return * @return
*/ */
Result getShareInfo(QdUserSignInRequestDto dto); Result getShareInfo(QdUserSignInRequestDto dto);
/**
* 检测是否有内容安全检测不通过的情况给予提示
* @param dto
* @return
*/
Result check(QdUserSignInRequestDto dto);
} }
...@@ -66,4 +66,18 @@ public class QdHomePageController { ...@@ -66,4 +66,18 @@ public class QdHomePageController {
return qdHomePageService.getShareInfo(dto); return qdHomePageService.getShareInfo(dto);
} }
@ApiOperation(value = "检测是否有内容安全检测不通过的情况给予提示")
@PostMapping("/check")
public Result check(@RequestBody QdUserSignInRequestDto dto) {
logger.info("【请求开始】检测是否有内容安全检测不通过的情况给予提示,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("userId", "用户id").must().number()
.end();
if (!validator.isValid()) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return qdHomePageService.check(dto);
}
} }
...@@ -89,12 +89,12 @@ public class WxPayServiceTest { ...@@ -89,12 +89,12 @@ public class WxPayServiceTest {
@Test @Test
public void refund() { public void refund() {
List<String> list = Arrays.asList("DA2412231422109063526"); List<String> list = Arrays.asList("DA2501081948572456638");
list.forEach(orderId ->{ list.forEach(orderId ->{
DistributionOrderRequestDto dto = new DistributionOrderRequestDto(); DistributionOrderRequestDto dto = new DistributionOrderRequestDto();
dto.setDistributionOrderId(orderId); dto.setDistributionOrderId(orderId);
dto.setAmount("10"); dto.setAmount("128");
dto.setRefundPrice("10"); dto.setRefundPrice("128");
Result result = wxPayServiceApi.refund(dto); Result result = wxPayServiceApi.refund(dto);
logger.info("申请微信支付退款:{}", result); logger.info("申请微信支付退款:{}", result);
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment