*/ | */ | ||||
public static String airportURL; | public static String airportURL; | ||||
/** | |||||
* 小程序url | |||||
*/ | |||||
public static String wechatURL; | |||||
/** | |||||
* 小程序 appId | |||||
*/ | |||||
public static String appId; | |||||
/** | |||||
* 小程序 appSecret | |||||
*/ | |||||
public static String appSecret; | |||||
/** | |||||
* 主题id | |||||
*/ | |||||
public static String templateId; | |||||
/** | /** | ||||
* 图片域名赋值 | * 图片域名赋值 | ||||
* | * | ||||
airportURL = url; | airportURL = url; | ||||
} | } | ||||
/** | |||||
* 小程序url | |||||
* | |||||
* @param url | |||||
*/ | |||||
@Value("${tuoheng.wechat-url}") | |||||
public void wechatURL(String url) { | |||||
wechatURL = url; | |||||
} | |||||
/** | |||||
* 小程序 appId赋值 | |||||
* | |||||
* @param id 小程序 appId | |||||
*/ | |||||
@Value("${wx.appId}") | |||||
public void setAppId(String id) { | |||||
appId = id; | |||||
} | |||||
/** | |||||
* 小程序 appSecret赋值 | |||||
* | |||||
* @param secret 小程序 appSecret | |||||
*/ | |||||
@Value("${wx.appSecret}") | |||||
public void setAppSecret(String secret) { | |||||
appSecret = secret; | |||||
} | |||||
/** | |||||
* 小程序 templateId赋值 | |||||
* | |||||
* @param tempId | |||||
*/ | |||||
@Value("${wx.templateId}") | |||||
public void setTemplateId(String tempId) { | |||||
templateId = tempId; | |||||
} | |||||
} | } |
-- 2024-12-03 14:30 | |||||
-- v1.3.6 | |||||
use tuoheng_freeway; | |||||
-- 用户授权表 | |||||
create table th_user_authorize | |||||
( | |||||
id varchar(36) not null comment 'ID' primary key, | |||||
user_id varchar(36) null comment '用户id', | |||||
open_id varchar(150) default '' not null comment '授权openid', | |||||
access_token varchar(500) default '' null comment 'accesstoken值', | |||||
create_user varchar(36) default '0' null comment '添加人', | |||||
union_id varchar(150) null comment '唯一标识', | |||||
create_time datetime null comment '创建时间', | |||||
update_user varchar(36) default '0' null comment '更新人', | |||||
update_time datetime null comment '更新时间', | |||||
mark tinyint unsigned default '1' not null comment '有效标识' | |||||
) | |||||
comment '用户授权表'; | |||||
-- 用户表 | |||||
alter table tuoheng_freeway.th_user add authorize tinyint(1) default 1 not null comment '授权标识:1未授权 2授权' after status; | |||||
alter table tuoheng_freeway.th_user add subscribe_times tinyint(1) default 1 not null comment '订阅次数 1:订阅一次 2非一次订阅' after authorize; |
package com.tuoheng.miniprogram.controller; | |||||
import com.tuoheng.common.core.utils.JsonResult; | |||||
import com.tuoheng.miniprogram.entity.wx.WxMessageRequest; | |||||
import com.tuoheng.miniprogram.service.IWxService; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.web.bind.annotation.*; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/23 | |||||
*/ | |||||
@RestController | |||||
@Slf4j | |||||
@RequestMapping("/weiXin") | |||||
public class WxController { | |||||
@Autowired | |||||
private IWxService iWxService; | |||||
//根据code获取openId | |||||
@GetMapping("/getOpenId/{code}") | |||||
public JsonResult getOpenId(@PathVariable("code") String code) { | |||||
log.info("进入获取openId接口"); | |||||
return iWxService.openid(code); | |||||
} | |||||
@PostMapping("/send/message") | |||||
public JsonResult sendMessage(@RequestBody WxMessageRequest wxMessageRequest) { | |||||
log.info("进入发送消息接口,WxMessageRequest={}", wxMessageRequest); | |||||
return iWxService.sendMessage(wxMessageRequest); | |||||
} | |||||
} |
package com.tuoheng.miniprogram.dao; | |||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||||
import com.tuoheng.miniprogram.entity.UserAuthorize; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/26 | |||||
*/ | |||||
public interface UserAuthorizeMapper extends BaseMapper<UserAuthorize> { | |||||
} |
* 数据权限:1:查看所有部门数据;2:查看本部门及子部门;3:查看本部门数据; | * 数据权限:1:查看所有部门数据;2:查看本部门及子部门;3:查看本部门数据; | ||||
*/ | */ | ||||
private Integer dataPermission; | private Integer dataPermission; | ||||
/** | |||||
* 微信授权标识 1:未授权 2授权 | |||||
*/ | |||||
private Integer authorize; | |||||
/** | |||||
* 订阅次数 1:订阅一次 2非一次订阅 | |||||
*/ | |||||
private Integer subscribeTimes; | |||||
} | } |
package com.tuoheng.miniprogram.entity; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import com.tuoheng.common.core.common.BaseEntity; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import lombok.experimental.Accessors; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2022/11/16 | |||||
*/ | |||||
@Data | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@Accessors(chain = true) | |||||
@TableName("th_user_authorize") | |||||
public class UserAuthorize extends BaseEntity { | |||||
private static final long serialVersionUID = 1L; | |||||
/** | |||||
* 用户id | |||||
*/ | |||||
private String userId; | |||||
/** | |||||
* 用户的openId | |||||
*/ | |||||
private String openId; | |||||
/** | |||||
* 唯一标识 | |||||
*/ | |||||
private String unionId; | |||||
/** | |||||
* accessToken值(先不存) | |||||
*/ | |||||
private String accessToken; | |||||
} |
package com.tuoheng.miniprogram.entity.dto; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/23 | |||||
*/ | |||||
@Data | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
public class TemplateMinDto { | |||||
/** | |||||
* 填充信息 | |||||
*/ | |||||
private String value; | |||||
} |
package com.tuoheng.miniprogram.entity.wx; | |||||
import lombok.Data; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/26 | |||||
*/ | |||||
@Data | |||||
public class WxMessageRequest { | |||||
/** | |||||
* 任务id | |||||
*/ | |||||
private String inspectionId; | |||||
/** | |||||
* 部门id | |||||
*/ | |||||
private String deptId; | |||||
/** | |||||
* 问题id | |||||
*/ | |||||
private String questionId; | |||||
/** | |||||
* 租户id | |||||
*/ | |||||
private String tenantId; | |||||
/** | |||||
* 上报时间 | |||||
*/ | |||||
private String createTime; | |||||
/** | |||||
*问题标题 | |||||
*/ | |||||
private String questionName; | |||||
/** | |||||
* 问题描述 | |||||
*/ | |||||
private String questionDesc; | |||||
} |
package com.tuoheng.miniprogram.enums; | |||||
import lombok.Getter; | |||||
/** | |||||
* 任务状态枚举 | |||||
*/ | |||||
public enum AuthorizeStatusEnum { | |||||
//1未授权 2授权 | |||||
AUTHORIZE_DOWN(1,"未授权"), | |||||
AUTHORIZE_ON(2,"授权"); | |||||
AuthorizeStatusEnum(int code, String description){ | |||||
this.code = code; | |||||
this.description = description; | |||||
} | |||||
@Getter | |||||
private int code; | |||||
@Getter | |||||
private String description; | |||||
} |
package com.tuoheng.miniprogram.enums; | |||||
import lombok.Getter; | |||||
/** | |||||
* 任务状态枚举 | |||||
*/ | |||||
public enum SubscribeTimesEnum { | |||||
//1未授权 2授权 | |||||
SUBSCRIBE_TIMES_ONE(1,"订阅一次"), | |||||
SUBSCRIBE_TIMES_NO_ONE(2,"非一次订阅"); | |||||
SubscribeTimesEnum(int code, String description){ | |||||
this.code = code; | |||||
this.description = description; | |||||
} | |||||
@Getter | |||||
private int code; | |||||
@Getter | |||||
private String description; | |||||
} |
package com.tuoheng.miniprogram.enums; | |||||
public enum UserAuthorizeEnum { | |||||
UNAUTHORIZED(10001, "用户未授权"), | |||||
OPEN_ID_IS_NULL(10002, "openId为空"); | |||||
/** | |||||
* 标识码 | |||||
*/ | |||||
private Integer code; | |||||
/** | |||||
* 描述 | |||||
*/ | |||||
private String msg; | |||||
UserAuthorizeEnum(Integer code, String msg) { | |||||
this.code = code; | |||||
this.msg = msg; | |||||
} | |||||
public Integer getCode() { | |||||
return code; | |||||
} | |||||
public void setCode(Integer code) { | |||||
this.code = code; | |||||
} | |||||
public String getMsg() { | |||||
return msg; | |||||
} | |||||
public void setMsg(String msg) { | |||||
this.msg = msg; | |||||
} | |||||
} |
package com.tuoheng.miniprogram.enums; | |||||
/** | |||||
* 获取子部门列表返回码 | |||||
* 模块代码:20(部门管理) | |||||
* 接口代码:06 (获取子部门列表) | |||||
* | |||||
* @author wanjing | |||||
* @team tuoheng | |||||
* @date 2022-11-22 | |||||
*/ | |||||
public enum WeiXinRequestEnum { | |||||
INSPECTION_ID_IS_NULL(120010, "任务id为空"), | |||||
DEPT_ID_IS_NULL(120011, "问题id为空"), | |||||
TENANT_ID_NOT_EXIST(120012, "租户id为空"), | |||||
CREATE_TIME_IS_NULL(120013, "上报时间为空"), | |||||
INSPECTION_NAME_NOT_EXIST(120014, "问题标题不存在"), | |||||
QUESTION_DESC_NOT_EXIST(120015, "问题标题不存在"); | |||||
/** | |||||
* 错误码 | |||||
*/ | |||||
private int code; | |||||
/** | |||||
* 错误信息 | |||||
*/ | |||||
private String msg; | |||||
WeiXinRequestEnum(int code, String msg){ | |||||
this.code = code; | |||||
this.msg = msg; | |||||
} | |||||
public int getCode() { | |||||
return code; | |||||
} | |||||
public void setCode(int code) { | |||||
this.code = code; | |||||
} | |||||
public String getMsg() { | |||||
return msg; | |||||
} | |||||
public void setMsg(String msg) { | |||||
this.msg = msg; | |||||
} | |||||
} |
package com.tuoheng.miniprogram.param; | |||||
import com.tuoheng.miniprogram.entity.dto.TemplateMinDto; | |||||
import lombok.Data; | |||||
import java.util.Map; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/23 | |||||
*/ | |||||
@Data | |||||
public class WxSendMessageParam { | |||||
/** | |||||
* 接收者openId | |||||
*/ | |||||
private String touser; | |||||
/** | |||||
* 订阅模板id | |||||
*/ | |||||
private String template_id; | |||||
/** | |||||
* 点击模板卡片跳转页面 | |||||
*/ | |||||
private String page; | |||||
/** | |||||
* 跳转小程序类型 developer为开发版;trial为体验版;formal为正式版;默认为正式版 | |||||
*/ | |||||
//private String miniprogram_state; | |||||
/** | |||||
* 填充信息 | |||||
*/ | |||||
private Map<String, TemplateMinDto> data; | |||||
} |
package com.tuoheng.miniprogram.service; | |||||
import com.tuoheng.common.core.utils.JsonResult; | |||||
import com.tuoheng.miniprogram.entity.wx.WxMessageRequest; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/23 | |||||
*/ | |||||
public interface IWxService { | |||||
/** | |||||
* 根据code获取openId | |||||
* @param code | |||||
* @return | |||||
*/ | |||||
JsonResult openid(String code); | |||||
/** | |||||
* 发送消息 | |||||
* @param wxMessageRequest | |||||
* @return | |||||
*/ | |||||
JsonResult sendMessage(WxMessageRequest wxMessageRequest); | |||||
} |
package com.tuoheng.miniprogram.service.impl; | |||||
import cn.hutool.core.collection.CollectionUtil; | |||||
import cn.hutool.core.util.ObjectUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.tuoheng.common.core.config.common.CommonConfig; | |||||
import com.tuoheng.common.core.utils.DateUtils; | |||||
import com.tuoheng.common.core.utils.JsonResult; | |||||
import com.tuoheng.common.core.utils.StringUtils; | |||||
import com.tuoheng.miniprogram.dao.UserAuthorizeMapper; | |||||
import com.tuoheng.miniprogram.dao.UserMapper; | |||||
import com.tuoheng.miniprogram.entity.User; | |||||
import com.tuoheng.miniprogram.entity.UserAuthorize; | |||||
import com.tuoheng.miniprogram.entity.dto.TemplateMinDto; | |||||
import com.tuoheng.miniprogram.entity.wx.WxMessageRequest; | |||||
import com.tuoheng.miniprogram.enums.*; | |||||
import com.tuoheng.miniprogram.param.WxSendMessageParam; | |||||
import com.tuoheng.miniprogram.service.IWxService; | |||||
import com.tuoheng.miniprogram.utils.CurrentUserUtil; | |||||
import com.tuoheng.miniprogram.utils.GetOpenIdUtil; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.stereotype.Service; | |||||
import org.springframework.web.client.RestClientException; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Author ChengWang | |||||
* @Date 2023/6/23 | |||||
*/ | |||||
@Service | |||||
@Slf4j | |||||
public class WxServiceImpl implements IWxService { | |||||
@Autowired | |||||
private UserAuthorizeMapper userAuthorizeMapper; | |||||
@Autowired | |||||
private UserMapper userMapper; | |||||
private static String accessToken; | |||||
private static long expiresTime; | |||||
/** | |||||
* 根据code获取openId | |||||
* | |||||
* @param code | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public JsonResult openid(String code) { | |||||
String userId = CurrentUserUtil.getUserId(); | |||||
String openidResult = GetOpenIdUtil.getopenid(code, CommonConfig.appId, CommonConfig.appSecret); | |||||
if (null != JSONObject.parseObject(openidResult).getInteger("errcode") || | |||||
StringUtils.isNotEmpty(JSONObject.parseObject(openidResult).getString("errmsg"))) { | |||||
return JsonResult.error(JSONObject.parseObject(openidResult).getInteger("errcode").intValue(), | |||||
JSONObject.parseObject(openidResult).getString("errmsg")); | |||||
} | |||||
String openid = JSONObject.parseObject(openidResult).getString("openid"); | |||||
if (StringUtils.isEmpty(openid)) { | |||||
log.error("获取openid失败:", openidResult); | |||||
return JsonResult.error("获取openid失败"); | |||||
} | |||||
//根据当前登录用户id查询授权表是否存在一条授权数据 | |||||
UserAuthorize beforeUserAuthorize = userAuthorizeMapper.selectOne(Wrappers.<UserAuthorize>lambdaQuery() | |||||
.eq(UserAuthorize::getUserId, userId) | |||||
.eq(UserAuthorize::getMark, MarkEnum.VALID.getCode())); | |||||
if (ObjectUtil.isNull(beforeUserAuthorize)) { | |||||
UserAuthorize userAuthorize = new UserAuthorize(); | |||||
if (StringUtils.isNotEmpty(openid)) { | |||||
//查询出来openId数据入库 | |||||
userAuthorize.setOpenId(openid); | |||||
} | |||||
userAuthorize.setUserId(userId); | |||||
userAuthorize.setCreateTime(DateUtils.now()); | |||||
if (StringUtils.isNotEmpty(userId)) { | |||||
userAuthorize.setCreateUser(userId); | |||||
} | |||||
int result = userAuthorizeMapper.insert(userAuthorize); | |||||
if (result <= 0) { | |||||
return JsonResult.error("授权数据入库失败"); | |||||
} | |||||
} | |||||
//关联登录用户,已经做过授权 修改授权标识 | |||||
User user = CurrentUserUtil.getUserInfo(); | |||||
if (ObjectUtil.isEmpty(user)) { | |||||
return JsonResult.error(UserCodeEnum.USER_IS_NULL.getCode(), UserCodeEnum.USER_IS_NULL.getMsg()); | |||||
} | |||||
user.setAuthorize(AuthorizeStatusEnum.AUTHORIZE_ON.getCode()); | |||||
user.setUpdateTime(DateUtils.now()); | |||||
user.setUpdateUser(userId); | |||||
int count = userMapper.updateById(user); | |||||
if (count <= 0) { | |||||
return JsonResult.error("用户授权标识更新失败"); | |||||
} | |||||
return JsonResult.success(); | |||||
} | |||||
/** | |||||
* 获取access_code值 | |||||
* | |||||
* @return | |||||
*/ | |||||
public String getAccessToken() { | |||||
//判断accessToken是否已经过期,如果国企需要重新获取 | |||||
if (accessToken == null || expiresTime < System.currentTimeMillis()) { | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
Map<String, String> params = new HashMap<>(2); | |||||
params.put("APPID", CommonConfig.appId); | |||||
params.put("APPSECRET", CommonConfig.appSecret); | |||||
ResponseEntity<String> responseEntity = restTemplate.getForEntity("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params); | |||||
String body = responseEntity.getBody(); | |||||
JSONObject object = JSON.parseObject(body); | |||||
Integer errcode = object.getInteger("errcode"); | |||||
if (errcode != null && errcode != 0) { | |||||
String errmsg = object.getString("errmsg"); | |||||
log.info("请求accessToken失败,返回码:" + errcode + "错误信息:" + errmsg); | |||||
throw new RuntimeException("请求获取accessToken失败"); | |||||
} | |||||
//缓存accessToken | |||||
accessToken = object.getString("access_token"); | |||||
log.info("获取的accessToken的值:" + accessToken); | |||||
//设置accessToken的失效时间 | |||||
Long expires_in = object.getLong("expires_in"); | |||||
//失效时间 = 当前时间+有效期(提前一分钟,也可以不提前) | |||||
expiresTime = System.currentTimeMillis() + (expires_in - 60) * 1000; | |||||
} | |||||
return accessToken; | |||||
} | |||||
/** | |||||
* 发送消息 | |||||
* | |||||
* @param wxMessageRequest | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public JsonResult sendMessage(WxMessageRequest wxMessageRequest) { | |||||
wxMessageRequest.setQuestionDesc("发现疑似问题待处理,请及时查看。"); | |||||
JsonResult result = this.check(wxMessageRequest); | |||||
if (result.getCode() != 0) { | |||||
//正常返回,信息提示 | |||||
return JsonResult.success(result.getCode(), result.getMsg()); | |||||
} | |||||
List<User> userList = (List<User>) result.getData(); | |||||
boolean isSend = false; | |||||
//对用户进行遍历推送消息 | |||||
for (User user : userList) { | |||||
String userId = user.getId(); | |||||
if (user.getAuthorize() == AuthorizeStatusEnum.AUTHORIZE_DOWN.getCode()) { | |||||
//本次结束,进入下次循环 | |||||
continue; | |||||
} | |||||
if (user.getAuthorize() == AuthorizeStatusEnum.AUTHORIZE_ON.getCode() | |||||
&& user.getSubscribeTimes() == SubscribeTimesEnum.SUBSCRIBE_TIMES_NO_ONE.getCode()) { | |||||
continue; | |||||
} | |||||
//获取当前登录openId | |||||
UserAuthorize userAuthorize = userAuthorizeMapper.selectOne(Wrappers.<UserAuthorize>lambdaQuery() | |||||
.eq(UserAuthorize::getUserId, userId) | |||||
.eq(UserAuthorize::getMark, MarkEnum.VALID.getCode())); | |||||
//授权数据校验 | |||||
JsonResult jsonResult = this.getUserAuthorize(userAuthorize); | |||||
if (jsonResult.getCode() != 0) { | |||||
continue; | |||||
} | |||||
String openId = userAuthorize.getOpenId(); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
//发送消息订阅 | |||||
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken(); | |||||
WxSendMessageParam param = new WxSendMessageParam(); | |||||
param.setPage("/package_question/pages/taskList/taskList"); | |||||
//param.setMiniprogram_state("formal"); | |||||
param.setTouser(openId); | |||||
param.setTemplate_id(CommonConfig.templateId); | |||||
Map<String, TemplateMinDto> data = new HashMap<>(3); | |||||
//消息模板{{time12.DATA}} {{thing4.DATA}} {{thing13.DATA}} 时间格式一定是这样的2022-01-13 02:31:36 | |||||
ResponseEntity<String> responseEntity = null; | |||||
try { | |||||
data.put("time12", new TemplateMinDto(wxMessageRequest.getCreateTime())); | |||||
data.put("thing4", new TemplateMinDto(wxMessageRequest.getQuestionName())); | |||||
data.put("thing13", new TemplateMinDto(wxMessageRequest.getQuestionDesc())); | |||||
param.setData(data); | |||||
responseEntity = restTemplate.postForEntity(url, param, String.class); | |||||
String messageBody = responseEntity.getBody(); | |||||
Integer errcode = JSONObject.parseObject(messageBody).getInteger("errcode").intValue(); | |||||
if (errcode != null && errcode == 0) { | |||||
//修改用户订阅次数 | |||||
user.setSubscribeTimes(SubscribeTimesEnum.SUBSCRIBE_TIMES_NO_ONE.getCode()); | |||||
int count = userMapper.updateById(user); | |||||
if (count <= 0) { | |||||
throw new RuntimeException("更新用户订阅次数失败"); | |||||
} | |||||
} else if (errcode != null && errcode != 0) { | |||||
String errmsg = JSONObject.parseObject(messageBody).getString("errmsg"); | |||||
log.info("请求accessToken失败,返回码:" + errcode.intValue() + "错误信息:" + errmsg); | |||||
//return JsonResult.error(errcode.intValue(),errmsg); | |||||
} | |||||
JSONObject jsonObject = JSON.parseObject(messageBody); | |||||
if (Objects.nonNull(jsonObject)) { | |||||
log.info("openId:" + openId + "发送消息返回内容:" + jsonObject.toJSONString()); | |||||
} | |||||
isSend = true; | |||||
} catch (RestClientException e) { | |||||
log.info("openId:" + openId + "发送消息异常报错:" + e); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
return JsonResult.success(isSend); | |||||
} | |||||
/** | |||||
* 校验权限数据 | |||||
* | |||||
* @param userAuthorize | |||||
* @return | |||||
*/ | |||||
private JsonResult getUserAuthorize(UserAuthorize userAuthorize) { | |||||
if (ObjectUtil.isNull(userAuthorize)) { | |||||
return JsonResult.error(UserAuthorizeEnum.UNAUTHORIZED.getCode(), UserAuthorizeEnum.UNAUTHORIZED.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(userAuthorize.getOpenId())) { | |||||
return JsonResult.error(UserAuthorizeEnum.OPEN_ID_IS_NULL.getCode(), UserAuthorizeEnum.OPEN_ID_IS_NULL.getMsg()); | |||||
} | |||||
return JsonResult.success(); | |||||
} | |||||
private JsonResult check(WxMessageRequest wxMessageRequest) { | |||||
//传参校验 | |||||
if (StringUtils.isEmpty(wxMessageRequest.getTenantId())) { | |||||
return JsonResult.error(WeiXinRequestEnum.TENANT_ID_NOT_EXIST.getCode(), WeiXinRequestEnum.TENANT_ID_NOT_EXIST.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(wxMessageRequest.getInspectionId())) { | |||||
return JsonResult.error(WeiXinRequestEnum.INSPECTION_ID_IS_NULL.getCode(), WeiXinRequestEnum.INSPECTION_ID_IS_NULL.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(wxMessageRequest.getDeptId())) { | |||||
return JsonResult.error(WeiXinRequestEnum.DEPT_ID_IS_NULL.getCode(), WeiXinRequestEnum.DEPT_ID_IS_NULL.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(wxMessageRequest.getCreateTime())) { | |||||
return JsonResult.error(WeiXinRequestEnum.CREATE_TIME_IS_NULL.getCode(), WeiXinRequestEnum.CREATE_TIME_IS_NULL.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(wxMessageRequest.getQuestionName())) { | |||||
return JsonResult.error(WeiXinRequestEnum.INSPECTION_NAME_NOT_EXIST.getCode(), WeiXinRequestEnum.INSPECTION_NAME_NOT_EXIST.getMsg()); | |||||
} | |||||
if (StringUtils.isEmpty(wxMessageRequest.getQuestionDesc())) { | |||||
return JsonResult.error(WeiXinRequestEnum.QUESTION_DESC_NOT_EXIST.getCode(), WeiXinRequestEnum.QUESTION_DESC_NOT_EXIST.getMsg()); | |||||
} | |||||
//根据租户id查询用户列表 | |||||
List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery() | |||||
.eq(User::getMark, MarkEnum.VALID.getCode()) | |||||
.eq(User::getDeptId, wxMessageRequest.getDeptId()) | |||||
.eq(User::getStatus, 1)); | |||||
if (CollectionUtil.isEmpty(users) || users.size() == 0) { | |||||
return JsonResult.error("此部门下没有用户"); | |||||
} | |||||
return JsonResult.success(users); | |||||
} | |||||
} |
package com.tuoheng.miniprogram.utils; | |||||
import java.io.BufferedReader; | |||||
import java.io.InputStreamReader; | |||||
import java.net.URL; | |||||
import java.net.URLConnection; | |||||
/** | |||||
* 微信登陆工具类 | |||||
*/ | |||||
public class GetOpenIdUtil { | |||||
public static String getopenid(String code, String appid, String secret) { | |||||
BufferedReader in = null; | |||||
//appid和secret是开发者分别是小程序ID和小程序密钥,开发者通过微信公众平台-》设置-》开发设置就可以直接获取, | |||||
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" | |||||
+ appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code"; | |||||
try { | |||||
URL weChatUrl = new URL(url); | |||||
// 打开和URL之间的连接 | |||||
URLConnection connection = weChatUrl.openConnection(); | |||||
// 设置通用的请求属性 | |||||
connection.setConnectTimeout(5000); | |||||
connection.setReadTimeout(5000); | |||||
// 建立实际的连接 | |||||
connection.connect(); | |||||
// 定义 BufferedReader输入流来读取URL的响应 | |||||
in = new BufferedReader(new InputStreamReader(connection.getInputStream())); | |||||
StringBuffer sb = new StringBuffer(); | |||||
String line; | |||||
while ((line = in.readLine()) != null) { | |||||
sb.append(line); | |||||
} | |||||
return sb.toString(); | |||||
} catch (Exception e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
// 使用finally块来关闭输入流 | |||||
finally { | |||||
try { | |||||
if (in != null) { | |||||
in.close(); | |||||
} | |||||
} catch (Exception e2) { | |||||
e2.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||
} |
pilot-url: http://192.168.11.11:7011/pilot/web/ | pilot-url: http://192.168.11.11:7011/pilot/web/ | ||||
#airport配置地址 | #airport配置地址 | ||||
airport-url: http://192.168.11.22:9060 | airport-url: http://192.168.11.22:9060 | ||||
#小程序配置地址 | |||||
wechat-url: http://192.168.11.11:9119 | |||||
# 文件配置 | # 文件配置 | ||||
uploads: | uploads: | ||||
#上传的服务器上的映射文件夹 | #上传的服务器上的映射文件夹 | ||||
staticAccessPath: /** | staticAccessPath: /** | ||||
#静态资源实际存储路径 | #静态资源实际存储路径 | ||||
uploadFolder: /data/java/tuoheng_freeway/uploads/ | uploadFolder: /data/java/tuoheng_freeway/uploads/ | ||||
#小程序 | |||||
wx: | |||||
appId: wxfa4ec86caec22034 | |||||
appSecret: dd8411aaa8fcfb251518d5021adb059d | |||||
templateId: tOewJK9MXIbfXovwCb72KLpCdBp1spL6pQ2F3LTQkSI | |||||
xxl: | xxl: | ||||
enable: true | enable: true | ||||
job: | job: |
pilot-url: http://192.168.11.11:7011/pilot/web/ | pilot-url: http://192.168.11.11:7011/pilot/web/ | ||||
#airport配置地址 | #airport配置地址 | ||||
airport-url: http://192.168.11.22:9060 | airport-url: http://192.168.11.22:9060 | ||||
#小程序配置地址 | |||||
wechat-url: http://192.168.11.11:9119 | |||||
# 文件配置 | # 文件配置 | ||||
uploads: | uploads: | ||||
#上传的服务器上的映射文件夹 | #上传的服务器上的映射文件夹 | ||||
staticAccessPath: /** | staticAccessPath: /** | ||||
#静态资源实际存储路径 | #静态资源实际存储路径 | ||||
uploadFolder: /data/java/tuoheng_freeway/uploads/ | uploadFolder: /data/java/tuoheng_freeway/uploads/ | ||||
#小程序 | |||||
wx: | |||||
appId: wxfa4ec86caec22034 | |||||
appSecret: dd8411aaa8fcfb251518d5021adb059d | |||||
templateId: tOewJK9MXIbfXovwCb72KLpCdBp1spL6pQ2F3LTQkSI | |||||
xxl: | xxl: | ||||
enable: true | enable: true | ||||
job: | job: |
pilot-url: http://192.168.11.11:7011/pilot/web/ | pilot-url: http://192.168.11.11:7011/pilot/web/ | ||||
#airport配置地址 | #airport配置地址 | ||||
airport-url: https://airport.t-aaron.com/airport/admin | airport-url: https://airport.t-aaron.com/airport/admin | ||||
#小程序配置地址 | |||||
wechat-url: https://freeway-miniprogram.t-aaron.com | |||||
# 文件配置 | # 文件配置 | ||||
uploads: | uploads: | ||||
#上传的服务器上的映射文件夹 | #上传的服务器上的映射文件夹 | ||||
staticAccessPath: /** | staticAccessPath: /** | ||||
#静态资源实际存储路径 | #静态资源实际存储路径 | ||||
uploadFolder: /data/java/tuoheng_freeway/uploads/ | uploadFolder: /data/java/tuoheng_freeway/uploads/ | ||||
#小程序 | |||||
wx: | |||||
appId: wxfa4ec86caec22034 | |||||
appSecret: dd8411aaa8fcfb251518d5021adb059d | |||||
templateId: tOewJK9MXIbfXovwCb72KLpCdBp1spL6pQ2F3LTQkSI | |||||
## 配置feign熔断 | ## 配置feign熔断 | ||||
#feign: | #feign: | ||||
# circuitbreaker: | # circuitbreaker: |
pilot-url: http://192.168.11.11:7011/pilot/web/ | pilot-url: http://192.168.11.11:7011/pilot/web/ | ||||
#airport配置地址 | #airport配置地址 | ||||
airport-url: https://airport-test.t-aaron.com/airport/admin | airport-url: https://airport-test.t-aaron.com/airport/admin | ||||
#小程序配置地址 | |||||
wechat-url: https://freeway-miniprogram-test.t-aaron.com | |||||
# 文件配置 | # 文件配置 | ||||
uploads: | uploads: | ||||
#上传的服务器上的映射文件夹 | #上传的服务器上的映射文件夹 | ||||
staticAccessPath: /** | staticAccessPath: /** | ||||
#静态资源实际存储路径 | #静态资源实际存储路径 | ||||
uploadFolder: /data/java/tuoheng_freeway/uploads/ | uploadFolder: /data/java/tuoheng_freeway/uploads/ | ||||
xxl: | |||||
enable: true | |||||
job: | |||||
admin: | |||||
addresses: http://172.15.1.11:8110/xxl-job-admin | |||||
accessToken: tuoheng | |||||
executor: | |||||
appname: xxl-job-executor-freeway-miniprogram | |||||
address: | |||||
ip: | |||||
# 多个后台,端口号不能相同 | |||||
port: 9991 | |||||
logpath: /data/java/logs/xxl-job/jobhandler | |||||
logretentiondays: 15 | |||||
#小程序 | |||||
wx: | |||||
appId: wxfa4ec86caec22034 | |||||
appSecret: dd8411aaa8fcfb251518d5021adb059d | |||||
templateId: tOewJK9MXIbfXovwCb72KLpCdBp1spL6pQ2F3LTQkSI | |||||
## 配置feign熔断 | ## 配置feign熔断 | ||||
#feign: | #feign: | ||||
# circuitbreaker: | # circuitbreaker: |
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!DOCTYPE mapper | |||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | |||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="com.tuoheng.miniprogram.dao.UserAuthorizeMapper"> | |||||
</mapper> |
package com.tuoheng.miniprogram.utils; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
public class GetOpenIdUtilTest { | |||||
public static void main(String[] args) { | |||||
System.out.println("start"); | |||||
String openidJson = GetOpenIdUtil.getopenid("061pTj0w3j6DaZ23141w3X12aP0pTj04", "wxd0f247d7272ca1b7", "541002e33cd4b011d4c13954ed34efdb"); | |||||
System.out.println("openid:" + openidJson); | |||||
JSONObject jsonObject = JSONObject.parseObject(openidJson); | |||||
String openid = jsonObject.getString("openid"); | |||||
System.out.println("openid:" + openid); | |||||
System.out.println("end"); | |||||
} | |||||
} |