diff --git a/signin/src/main/java/com/ccsens/signin/service/ProjectService.java b/signin/src/main/java/com/ccsens/signin/service/ProjectService.java index 98b1d54b..15b3306f 100644 --- a/signin/src/main/java/com/ccsens/signin/service/ProjectService.java +++ b/signin/src/main/java/com/ccsens/signin/service/ProjectService.java @@ -267,7 +267,7 @@ public class ProjectService implements IProjectService{ //查找项目 SysProjectList projectList = projectDao.selectByProjectId(param.getProjectId()); if(ObjectUtil.isNotNull(projectList)){ - projectList.setRecStatus((byte) 2); + projectList.setRecStatus((byte)2); projectListMapper.updateByPrimaryKeySelective(projectList); //TODO 删除成员项目关联表 projectDao.delUserProjectByProjectId(param.getProjectId()); diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/api/DebugController.java b/wechatutil/src/main/java/com/ccsens/wechatutil/api/DebugController.java index fcb99ada..9672c3c4 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/api/DebugController.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/api/DebugController.java @@ -5,6 +5,9 @@ import com.ccsens.util.JsonResponse; import com.ccsens.util.PropUtil; import com.ccsens.util.WebConstant; import com.ccsens.util.wx.WxXcxUtil; +import com.ccsens.wechatutil.bean.dto.WechatCode; +import com.ccsens.wechatutil.wxmini.MiniCodeUtil; +import com.ccsens.wechatutil.wxofficial.OfficialAccountMessageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -40,11 +43,26 @@ public class DebugController { //生成二维码 String fileName = "/gameQrCode/" + DateUtil.today() + "/" + System.currentTimeMillis() + ".png"; String path = WebConstant.UPLOAD_PATH_BASE + fileName; - WxXcxUtil.getWxCode(WebConstant.QRCODE_GAME, "id=1&type=SQ", null, path, "SQ"); + + WechatCode.WechatCodeB wechatCodeB = new WechatCode.WechatCodeB(); + wechatCodeB.setPage(WebConstant.QRCODE_GAME); + wechatCodeB.setScene("id=1&type=SQ"); + MiniCodeUtil.getWxCodeB(wechatCodeB, path); // WxXcxUtil.getWxCodeC(WebConstant.QRCODE_GAME+"?id=" + gameRecord.getId() + "&type=" + gameType.getCode(), path, gameType.getCode()); // gameRecord.setQrCodeUrl(PropUtil.qrCode + fileName); log.info("调用微信生成二维码"); return JsonResponse.newInstance().ok("测试"); } + + @ApiOperation(value = "/测试公众号消息",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value="message",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"}) + public JsonResponse debugWxMessage(HttpServletRequest request) throws Exception { + OfficialAccountMessageUtil.officialMessage(); + log.info("发送公众号消息"); + return JsonResponse.newInstance().ok("测试"); + } + } diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/bean/dto/WxTemplateMessage.java b/wechatutil/src/main/java/com/ccsens/wechatutil/bean/dto/WxTemplateMessage.java index 0735cc6e..886f656b 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/bean/dto/WxTemplateMessage.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/bean/dto/WxTemplateMessage.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotNull; +import java.util.Map; /** * @description: @@ -27,7 +28,7 @@ public class WxTemplateMessage { @ApiModelProperty("小程序") private MiniProgram miniprogram; @ApiModelProperty("模板数据") - private TemplateData data ; + private Map data ; @ApiModel("跳转小程序") @Data @@ -43,15 +44,15 @@ public class WxTemplateMessage { } } - @Data - @ApiModel("模板数据") - public static class TemplateData{ - private TemplateSettings first; - private TemplateSettings keyword1; - private TemplateSettings keyword2; - private TemplateSettings keyword3; - private TemplateSettings remark; - } +// @Data +// @ApiModel("模板数据") +// public static class TemplateData{ +// private TemplateSettings first; +// private TemplateSettings keyword1; +// private TemplateSettings keyword2; +// private TemplateSettings keyword3; +// private TemplateSettings remark; +// } @Getter @Setter @ApiModel("模板参数配置") diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/util/WxConstant.java b/wechatutil/src/main/java/com/ccsens/wechatutil/util/WxConstant.java index 604e51f6..3c4acb87 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/util/WxConstant.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/util/WxConstant.java @@ -25,8 +25,9 @@ public class WxConstant { /*** 获取小程序码C */ public static final String URL_GET_WX_CODE_C = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=%1$s"; /*** 小程序获取accessToken */ - public static final String URL_GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credentia&appid=%1$s&secret=%2$s"; - + public static final String URL_GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%1$s&secret=%2$s"; + /*** 公众号发送订阅消息 */ + public static final String MESSAGE_TEMPLATE_SEND = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%1$s"; /*** 小程序发送订阅消息 */ public static final String URL_SEND_SUBSCRIBE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%1$s"; diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxcommon/WxCommonUtil.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxcommon/WxCommonUtil.java index a53b35dd..897f7dfd 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/wxcommon/WxCommonUtil.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxcommon/WxCommonUtil.java @@ -10,6 +10,7 @@ import com.ccsens.util.exception.BaseException; import com.ccsens.wechatutil.util.WxCodeError; import com.ccsens.wechatutil.util.WxConstant; import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -18,12 +19,11 @@ import java.io.IOException; * @author 逗 */ @Slf4j +@Component public class WxCommonUtil { - @Resource private RedisUtil redisUtil; - private static WxCommonUtil util; @PostConstruct @@ -32,6 +32,7 @@ public class WxCommonUtil { } + /** * 小程序获取Access_token */ diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxh5/H5SigninUtil.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxh5/H5SigninUtil.java new file mode 100644 index 00000000..76b26c2d --- /dev/null +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxh5/H5SigninUtil.java @@ -0,0 +1,105 @@ +package com.ccsens.wechatutil.wxh5; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.ccsens.util.DateUtil; +import com.ccsens.util.JacksonUtil; +import com.ccsens.util.exception.BaseException; +import com.ccsens.wechatutil.bean.po.WxOauth2AccessToken; +import com.ccsens.wechatutil.bean.po.WxOauth2UserInfo; +import com.ccsens.wechatutil.util.WxCodeError; +import com.ccsens.wechatutil.util.WxConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * @author 逗 + */ +@Slf4j +@Component +public class H5SigninUtil { + + private static String appIdH5; + private static String secretH5; + + @Value("${h5.appId:}") + public void setAppIdOfficial(String appIdOfficial) { + H5SigninUtil.appIdH5 = appIdOfficial; + } + @Value("${h5.secret:}") + public void setApplication(String secretOfficial) { + H5SigninUtil.secretH5 = secretOfficial; + } + + public static WxOauth2UserInfo signinByH5(String code) { + return signinByH5(code, appIdH5, secretH5); + } + + public static WxOauth2UserInfo signinByH5(String code, String appId, String secret) { + //获取accessToken + WxOauth2AccessToken wxOauth2AccessToken = getOauth2AccessToken(code, appId, secret); + //获取用户信息 + return getOauth2UserInfo(wxOauth2AccessToken.getAccessToken(), wxOauth2AccessToken.getOpenId()); + } + + /** + * 获取网页授权凭证 + * @param code OAuth2授权码 + * @return WxOauth2AccessToken + */ + private static WxOauth2AccessToken getOauth2AccessToken(String code, String appId, String secret) { + WxOauth2AccessToken wxOauth2AccessToken; + //拼接访问路径 + String url = String.format(WxConstant.URL_GET_OAUTH2_ACCESS_TOKEN, appId, secret, code); + //调用微信接口 + String response = HttpRequest.get(url).execute().body(); + log.info("url: {}\nresponse: {}", url, response); + try { + if (StrUtil.isEmpty(response) || null == (wxOauth2AccessToken = JacksonUtil.jsonToBean(response, WxOauth2AccessToken.class))) { + throw new BaseException(WxCodeError.WX_HTTP_ERROR); + } + } catch (IOException e) { + throw new BaseException(e.getMessage()); + } + if (null != wxOauth2AccessToken.getErrcode()) { + throw new BaseException(wxOauth2AccessToken.getErrcode(), wxOauth2AccessToken.getErrmsg()); + } + if (StrUtil.isEmpty(wxOauth2AccessToken.getAccessToken())) { + throw new BaseException(WxCodeError.ACCESS_TOKEN_ERROR); + } + wxOauth2AccessToken.setCreatedAt(DateUtil.currentSeconds()); + return wxOauth2AccessToken; + } + + /** + * 通过网页授权accessToken获取用户信息 + * @param accessToken 网页授权接口调用凭证 + * @param openId 用户标识 + * @return SNSUserInfo + */ + private static WxOauth2UserInfo getOauth2UserInfo(String accessToken, String openId) { + WxOauth2UserInfo wxOauth2UserInfo; + //拼接访问路径 + String url = String.format(WxConstant.URL_GET_OAUTH2_USER_INFO, accessToken, openId); + //调用微信接口 + String response = HttpRequest.get(url).execute().body(); + log.info("url: {}\nresponse: {}", url, response); + try { + if (StrUtil.isEmpty(response) || null == (wxOauth2UserInfo = JacksonUtil.jsonToBean(response, WxOauth2UserInfo.class))) { + throw new BaseException(WxCodeError.WX_HTTP_ERROR); + } + } catch (IOException e) { + throw new BaseException(e.getMessage()); + } + if (null != wxOauth2UserInfo.getErrcode()) { + throw new BaseException(wxOauth2UserInfo.getErrcode(), wxOauth2UserInfo.getErrmsg()); + } + if (StrUtil.isEmpty(wxOauth2UserInfo.getOpenId())) { + throw new BaseException(WxCodeError.OPENID_ERROR); + } + return wxOauth2UserInfo; + } +} diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCode.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCodeUtil.java similarity index 93% rename from wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCode.java rename to wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCodeUtil.java index 0f07aa0a..d2b30601 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCode.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniCodeUtil.java @@ -10,6 +10,7 @@ import com.ccsens.wechatutil.util.WxConstant; import com.ccsens.wechatutil.wxcommon.WxCommonUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.io.*; @@ -17,13 +18,20 @@ import java.io.*; * @author 逗 */ @Slf4j -public class MiniCode { +@Component +public class MiniCodeUtil { - @Value("${mini.appId:}") private static String miniAppId; - @Value("${mini.secret:}") private static String miniSecret; + @Value("${mini.appId:}") + public void setMiniAppId(String miniAppId) { + MiniCodeUtil.miniAppId = miniAppId; + } + @Value("${mini.secret:}") + public void setMiniSecret(String miniSecret) { + MiniCodeUtil.miniSecret = miniSecret; + } /** * 获取小程序码--方案A,可接受 path 参数较长,生成个数受限 * 接口 A 加上接口 C,总共生成的码数量限制为 100,000,请谨慎调用。 diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessage.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessageUtil.java similarity index 89% rename from wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessage.java rename to wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessageUtil.java index 2879e00d..cd071c52 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessage.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniMessageUtil.java @@ -6,6 +6,7 @@ import com.ccsens.wechatutil.util.WxConstant; import com.ccsens.wechatutil.wxcommon.WxCommonUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.util.List; @@ -13,13 +14,21 @@ import java.util.List; * @author 逗 */ @Slf4j -public class MiniMessage { +@Component +public class MiniMessageUtil { - @Value("${mini.appId:}") private static String miniAppId; - @Value("${mini.secret:}") private static String miniSecret; + @Value("${mini.appId:}") + public void setMiniAppId(String miniAppId) { + MiniMessageUtil.miniAppId = miniAppId; + } + @Value("${mini.secret:}") + public void setMiniSecret(String miniSecret) { + MiniMessageUtil.miniSecret = miniSecret; + } + /** * 发送微信订阅消息 (使用默认appId) * diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniSigninUtil.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniSigninUtil.java index e58e443a..f744c1f1 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniSigninUtil.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxmini/MiniSigninUtil.java @@ -12,8 +12,10 @@ import com.ccsens.wechatutil.bean.po.WxBaseEntity; import com.ccsens.wechatutil.util.WxCodeError; import com.ccsens.wechatutil.util.WxConstant; import com.ccsens.wechatutil.wxcommon.WxCommonUtil; +import com.ccsens.wechatutil.wxofficial.OfficialAccountSigninUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.io.*; import java.util.List; @@ -22,13 +24,22 @@ import java.util.List; * @author 逗 */ @Slf4j +@Component public class MiniSigninUtil { - @Value("${mini.appId:}") private static String miniAppId; - @Value("${mini.secret:}") private static String miniSecret; + @Value("${mini.appId:}") + public void setMiniAppId(String miniAppId) { + MiniSigninUtil.miniAppId = miniAppId; + } + @Value("${mini.secret:}") + public void setMiniSecret(String miniSecret) { + MiniSigninUtil.miniSecret = miniSecret; + } + + /** * 小程序登录 * -- 从配置文件中获取默认appId diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountMessageUtil.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountMessageUtil.java new file mode 100644 index 00000000..00a2983b --- /dev/null +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountMessageUtil.java @@ -0,0 +1,122 @@ +package com.ccsens.wechatutil.wxofficial; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ccsens.cloudutil.bean.tall.vo.UserVo; +import com.ccsens.util.*; +import com.ccsens.util.annotation.OperateType; +import com.ccsens.util.bean.message.common.InMessage; +import com.ccsens.util.bean.message.common.MessageConstant; +import com.ccsens.util.config.RabbitMQConfig; +import com.ccsens.util.exception.BaseException; +import com.ccsens.util.wx.WxGzhUtil; +import com.ccsens.wechatutil.bean.dto.WxTemplateMessage; +import com.ccsens.wechatutil.bean.po.WxBaseEntity; +import com.ccsens.wechatutil.bean.po.WxOauth2UserInfo; +import com.ccsens.wechatutil.util.WxCodeError; +import com.ccsens.wechatutil.util.WxConstant; +import com.ccsens.wechatutil.wxcommon.WxCommonUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author 逗 + */ +@Slf4j +@Component +public class OfficialAccountMessageUtil { + + + private static String appIdOfficial; + private static String secretOfficial; + + @Value("${official.appId:}") + public void setAppIdOfficial(String appIdOfficial) { + OfficialAccountMessageUtil.appIdOfficial = appIdOfficial; + } + @Value("${official.secret:}") + public void setApplication(String secretOfficial) { + OfficialAccountMessageUtil.secretOfficial = secretOfficial; + } + +// public static void officialMessage() { +// WxTemplateMessage message = new WxTemplateMessage(); +// +// String url = String.format(WechatUtil.PROJECT_URL, 123); +//// WxTemplateMessage.MiniProgram miniProgram = new WxTemplateMessage.MiniProgram(WechatUtil.appid,url); +// +//// message.setMiniprogram(miniProgram); +// +// +// message.setTemplate_id(WxGzhUtil.Template.TASK_FINISH.templateId); +//// WxTemplateMessage.TemplateData data = new WxTemplateMessage.TemplateData(); +//// data.setFirst(new WxTemplateMessage.TemplateSettings("测试项目")); +//// data.setKeyword1(new WxTemplateMessage.TemplateSettings("测试任务")); +//// data.setKeyword2(new WxTemplateMessage.TemplateSettings(DateUtil.now())); +// +// Map data = new HashMap<>(); +// data.put("zzz", new WxTemplateMessage.TemplateSettings("测试fzz")); +// data.put("first", new WxTemplateMessage.TemplateSettings("测试first")); +// data.put("keyword1", new WxTemplateMessage.TemplateSettings("测试keyword1")); +// data.put("keyword2", new WxTemplateMessage.TemplateSettings("测试keyword2")); +// data.put("remark", new WxTemplateMessage.TemplateSettings("测试remark")); +// +// message.setData(data); +// +// List openIdList = new ArrayList<>(); +// openIdList.add("oALvgw-_70_fXptB97xJpYDhMJRU"); +// +// officialMessage(message,openIdList); +// } + + /** + * 公众号发送订阅消息(使用默认openId) + * @param templateMessage 消息 + * @param openIdList 推送的用户 + */ + public static void officialMessage(WxTemplateMessage templateMessage, List openIdList) { + officialMessage(templateMessage,openIdList,appIdOfficial, secretOfficial); + } + + /** + * 公众号发送订阅消息(传入openId) + * @param templateMessage 消息 + * @param openIdList 推送的用户 + */ + public static void officialMessage(WxTemplateMessage templateMessage, List openIdList,String appId, String secret) { + //判断是否有openId + if (CollectionUtil.isNotEmpty(openIdList)) { + openIdList.forEach(openid -> { + //拼接访问路径 + String url = String.format(WxConstant.MESSAGE_TEMPLATE_SEND, WxCommonUtil.getAccessToken(appId, secret)); + //调用微信接口 + String response = RestTemplateUtil.postBody(url, templateMessage); + log.info("url: {}\nresponse: {}", url, response); + WxBaseEntity wxBaseEntity; + try { + if (StrUtil.isEmpty(response) || null == (wxBaseEntity = JacksonUtil.jsonToBean(response, WxBaseEntity.class))) { + throw new BaseException(WxCodeError.WX_HTTP_ERROR); + } + } catch (IOException e) { + throw new BaseException(e.getMessage()); + } + if (null != wxBaseEntity.getErrcode()) { + throw new BaseException(wxBaseEntity.getErrcode(), wxBaseEntity.getErrmsg()); + } + }); + } + } +} diff --git a/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountSigninUtil.java b/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountSigninUtil.java index 55d3c834..24ab86a5 100644 --- a/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountSigninUtil.java +++ b/wechatutil/src/main/java/com/ccsens/wechatutil/wxofficial/OfficialAccountSigninUtil.java @@ -11,6 +11,7 @@ import com.ccsens.wechatutil.util.WxCodeError; import com.ccsens.wechatutil.util.WxConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import java.io.IOException; @@ -18,15 +19,23 @@ import java.io.IOException; * @author 逗 */ @Slf4j +@Component public class OfficialAccountSigninUtil { - @Value("${h5.appId:}") - private static String appIdH5; - @Value("${h5.secret:}") - private static String secretH5; + private static String appIdOfficial; + private static String secretOfficial; + + @Value("${official.appId:}") + public void setAppIdOfficial(String appIdOfficial) { + OfficialAccountSigninUtil.appIdOfficial = appIdOfficial; + } + @Value("${official.secret:}") + public void setApplication(String secretOfficial) { + OfficialAccountSigninUtil.secretOfficial = secretOfficial; + } public static WxOauth2UserInfo signinByH5(String code) { - return signinByH5(code, appIdH5, secretH5); + return signinByH5(code, appIdOfficial, secretOfficial); } public static WxOauth2UserInfo signinByH5(String code, String appId, String secret) { diff --git a/wechatutil/src/main/resources/application-dev.yml b/wechatutil/src/main/resources/application-dev.yml index 86373b0e..47ce3b7e 100644 --- a/wechatutil/src/main/resources/application-dev.yml +++ b/wechatutil/src/main/resources/application-dev.yml @@ -64,4 +64,7 @@ mini: secret: d75a5a7538ff9c72f781738850817081 h5: appId: 1 - secret: 1 \ No newline at end of file + secret: 1 +official: + appId: wx7af1bf1e14facf82 + secret: a6613fae11b497639c0224b820aaf6d9