diff --git a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java index 5e1de22..7200854 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java @@ -49,7 +49,7 @@ public class WebMvcConfig implements WebMvcConfigurer { "/static/**", "/upload/**", "/qrcode/**.txt", - "/wx-message/**",//微信消息推送验证 + "/wx/**",//微信消息推送验证 "/webSocketServer/**",//socket通信 "/doc.html" ); diff --git a/nxhs-service/src/main/java/cc/yunxi/config/props/WxHsyProperties.java b/nxhs-service/src/main/java/cc/yunxi/config/props/WxHsyProperties.java index 1cfb686..ca6faf0 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/props/WxHsyProperties.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/props/WxHsyProperties.java @@ -18,5 +18,6 @@ public class WxHsyProperties { private String sendMessageUrl; private String EncodingAESKey; private String token; + private String envVersion; } diff --git a/nxhs-service/src/main/java/cc/yunxi/config/props/WxShProperties.java b/nxhs-service/src/main/java/cc/yunxi/config/props/WxShProperties.java index 5700a92..cb038f9 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/props/WxShProperties.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/props/WxShProperties.java @@ -18,4 +18,5 @@ public class WxShProperties { private String sendMessageUrl; private String EncodingAESKey; private String token; + private String envVersion; } diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java index a300258..5edb8bc 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java @@ -164,6 +164,7 @@ public class DeviceController { fillPoster(pics, respVO); result.setData(respVO); result.setMsg("success"); + result.setCode(200); return result; } @@ -316,6 +317,9 @@ public class DeviceController { respVO.setToken(userDTO.getToken()); respVO.setTimeExpire(userDTO.getTimeExpire()); respVO.setRole(1); + result.setData(respVO); + result.setCode(200); + result.setMsg("登录成功"); return result; } @@ -344,7 +348,7 @@ public class DeviceController { respVO.setStatus(recycler.getStatus()); respVO.setToken(userDTO.getToken()); respVO.setTimeExpire(userDTO.getTimeExpire()); - respVO.setRole(1); + respVO.setRole(2); return CommonResult.success(respVO); } diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/WxController.java b/nxhs-service/src/main/java/cc/yunxi/controller/WxController.java index 81dc7b0..7d3908f 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/WxController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/WxController.java @@ -1,5 +1,8 @@ package cc.yunxi.controller; +import cc.yunxi.common.domain.CommonResult; +import cc.yunxi.domain.vo.file.FileUploadRespVO; +import cc.yunxi.domain.vo.vxmessage.QRCodeVo; import cc.yunxi.service.impl.WxServiceImpl; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -9,7 +12,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; -@Api(tags = "测试接口") +import java.util.ArrayList; +import java.util.List; + +@Api(tags = "微信相关接口") @RestController @RequestMapping("/wx") @RequiredArgsConstructor @@ -18,12 +24,11 @@ public class WxController { private final WxServiceImpl wxService; @ApiOperation("生成设备二维码") - @PostMapping("/generate-device-qr-code") - public String generateDeviceQRCode(@RequestBody String paramAJsonStr) { - JSONObject paramAJsonObj = JSONUtil.parseObj(paramAJsonStr); - String strDevCode = paramAJsonObj.getStr("devCode"); - String strPage = paramAJsonObj.getStr("page"); - wxService.generateDeviceQRCode(strDevCode, strPage); - return strDevCode; + @PostMapping("/generateDeviceQRCode") + public CommonResult> generateDeviceQRCode(@RequestBody QRCodeVo qrCodeVo) { + FileUploadRespVO fileUploadRespVO = wxService.generateDeviceQRCode(qrCodeVo); + ArrayList list = new ArrayList<>(); + list.add(fileUploadRespVO); + return CommonResult.success(list); } } diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/QRCodeVo.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/QRCodeVo.java new file mode 100644 index 0000000..97faf44 --- /dev/null +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/QRCodeVo.java @@ -0,0 +1,19 @@ +package cc.yunxi.domain.vo.vxmessage; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel("生成二维码参数") +public class QRCodeVo { + @ApiModelProperty(value = "设备编号",required = true,example = "DE000021") + @NotBlank(message = "设备编号不能为空") + private String deviceCode; + @ApiModelProperty(value = "跳转页面",example = "pages/selectPeople/selectPeople") + @NotBlank() + private String page="pages/selectPeople/selectPeople"; +} diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IFileService.java b/nxhs-service/src/main/java/cc/yunxi/service/IFileService.java index 3babc2b..7f1eee8 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IFileService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IFileService.java @@ -61,6 +61,14 @@ public interface IFileService extends IService { */ FileUploadRespVO uploadImage(String image64, String filename); + /** + * 上传byte图片 + * + * @param image + * @return FileUploadRespVO + */ + FileUploadRespVO uploadImage(byte[] image, String filename); + /** * 下载文件 */ diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IWxService.java b/nxhs-service/src/main/java/cc/yunxi/service/IWxService.java index 1ecd89e..a786576 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IWxService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IWxService.java @@ -1,7 +1,8 @@ package cc.yunxi.service; +import cc.yunxi.domain.vo.file.FileUploadRespVO; +import cc.yunxi.domain.vo.vxmessage.QRCodeVo; import cn.hutool.http.HttpResponse; -import org.springframework.web.bind.annotation.RequestBody; /** * Wx接口 @@ -11,11 +12,11 @@ public interface IWxService { // 同步方法 void syncTest(); // 生成设备二维码 - void generateDeviceQRCode(String strDevCode, String strPage); + FileUploadRespVO generateDeviceQRCode(QRCodeVo qrCodeVo); // 散户-WxSh||回收员-WxHsy 获取token String getToken(String strWxUserType); // 获取设备微信二维码Res HttpResponse getResDevQrCode(String token, String strDevCode, String strPage); // 设备二维码保存 - void saveDevQrCode(String strDevCode, HttpResponse resDevQrCode); + FileUploadRespVO saveDevQrCode(String strDevCode, HttpResponse resDevQrCode); } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/FileServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/FileServiceImpl.java index c994ad2..5a03a3d 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/FileServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/FileServiceImpl.java @@ -17,6 +17,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.sun.jndi.toolkit.url.Uri; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -188,6 +189,10 @@ public class FileServiceImpl extends ServiceImpl implements IF byte[] image = decodeToBase64(image64); return base64ImageUpload(image, fileName, FileStyleEnum.IMAGE); } + @Override + public FileUploadRespVO uploadImage(byte[] image, String fileName) { + return base64ImageUpload(image, fileName, FileStyleEnum.IMAGE); + } private FileUploadRespVO base64ImageUpload(byte[] content, String fileName, FileStyleEnum fileStyleEnum) { try { diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/WxServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/WxServiceImpl.java index 86161f1..4095ea2 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/WxServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/WxServiceImpl.java @@ -1,14 +1,15 @@ package cc.yunxi.service.impl; +import cc.yunxi.common.exception.BizIllegalException; import cc.yunxi.config.props.WxHsyProperties; import cc.yunxi.config.props.WxShProperties; +import cc.yunxi.domain.vo.file.FileUploadRespVO; import cc.yunxi.domain.vo.vxmessage.AccessToken; -import cc.yunxi.domain.vo.vxmessage.ResultVo; -import cc.yunxi.service.IRecyclerService; +import cc.yunxi.domain.vo.vxmessage.QRCodeVo; import cc.yunxi.service.IWxService; -import cn.hutool.core.img.Img; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.file.FileWriter; +import cc.yunxi.utils.VerifyUtil; +import cc.yunxi.utils.WeChatMessageUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; @@ -21,6 +22,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.HashMap; +import java.util.Map; /** * Wx接口实现类 @@ -29,98 +31,121 @@ import java.util.HashMap; @Slf4j @Validated public class WxServiceImpl implements IWxService { + + private final String GET_QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; + private final String DEFAULT_PAGE = "pages/selectPeople/selectPeople"; @Resource private WxShProperties wxShProperties; @Resource private WxHsyProperties wxHsyProperties; + @Resource + private FileServiceImpl fileService; + @Resource + private WeChatMessageUtil weChatMessageUtil; + @Override public void syncTest() { log.info("等待main执行"); } + // 生成设备二维码 // 设备编码 @Override - public void generateDeviceQRCode(String strDevCode, String strPage){ - log.info("--- generateDeviceQRCode(设备编码): " + strDevCode + " ---"); - String token = this.getToken("WxSh"); - HttpResponse resDevQrCode = getResDevQrCode(token, strDevCode, strPage); - saveDevQrCode(strDevCode, resDevQrCode); + public FileUploadRespVO generateDeviceQRCode(QRCodeVo qrCodeVo) { + log.info("--- generateDeviceQRCode(设备编码): " + qrCodeVo.getDeviceCode() + " ---"); + String token = getToken("client"); + String page = qrCodeVo.getPage(); + if (StrUtil.isBlank(page)) { + qrCodeVo.setPage(DEFAULT_PAGE); + } + HttpResponse resDevQrCode = getResDevQrCode(token, qrCodeVo.getDeviceCode(), qrCodeVo.getPage()); + FileUploadRespVO fileUploadRespVO = saveDevQrCode(qrCodeVo.getDeviceCode(), resDevQrCode); log.info("<--- generateDeviceQRCode "); + return fileUploadRespVO; } + // 散户-WxSh||回收员-WxHsy 获取token // strWxUserType --- WxSh|WxHsy @Override - public String getToken(String strWxUserType) { - log.info("---> getToken(散户-WxSh||回收员-WxHsy 获取token)" + strWxUserType) ; - String result = ""; - String strToken = ""; + public String getToken(String endpointType) { + log.info("---> getToken(散户-WxSh||回收员-WxHsy 获取token)" + endpointType); try { - if ("WxHsy".equals(strWxUserType)) { - HashMap paramMap = new HashMap<>(); - paramMap.put("grant_type", "client_credential"); - paramMap.put("appid", wxHsyProperties.getAppId()); - paramMap.put("secret", wxHsyProperties.getAppSecret()); - result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token",paramMap); - } else if ("WxSh".equals(strWxUserType)) { - HashMap paramMap = new HashMap<>(); - paramMap.put("grant_type", "client_credential"); - paramMap.put("appid", wxShProperties.getAppId()); - paramMap.put("secret", wxShProperties.getAppSecret()); - result = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token",paramMap); + String result = ""; + String token = ""; + Map param = new HashMap<>(); + param.put("grant_type", "client_credential");//固定值 + if ("client".equals(endpointType)) {//预约端 + param.put("appid", wxShProperties.getAppId()); + param.put("secret", wxShProperties.getAppSecret()); + result = HttpUtil.get(wxShProperties.getTokenUrl(), param, 2000); + } else if ("recycler".equals(endpointType)) {//回收端 + param.put("appid", wxHsyProperties.getAppId()); + param.put("secret", wxHsyProperties.getAppSecret()); + result = HttpUtil.get(wxHsyProperties.getTokenUrl(), param, 2000); } else { - throw new RuntimeException("微信用户类型参数错误:选用(散户-WxSh||回收员-WxHsy); 当前:" + strWxUserType); + throw new BizIllegalException("endpointType参数错误"); } - JSONObject resultJsonObj = JSONUtil.parseObj(result); - strToken = resultJsonObj.getStr("access_token"); + JSONObject json = JSONUtil.parseObj(result); + token = json.getStr("access_token"); + log.info("微信Token:" + token); + log.info("<--- getToken"); + return token; } catch (RuntimeException e) { - // log.error("getToken:" + e.toString()); + e.printStackTrace(); + log.error("getToken:" + e.getMessage()); + throw new BizIllegalException("获取微信平台token失败!"); } - log.info("微信Token:" + strToken); - log.info("<--- getToken") ; - return strToken; } + // 获取设备微信二维码Res // wxToken --- 微信token // devCode --- 设备码 @Override - public HttpResponse getResDevQrCode(String wxToken, String devCode, String strPage) { - log.info("---> getResDevQrCode(获取设备微信二维码Res):微信token:" + wxToken + ",设备码:"+ devCode + ",跳转页:" + strPage) ; - HttpResponse res = null; + public HttpResponse getResDevQrCode(String wxToken, String devCode, String page) { + log.info("---> getResDevQrCode(获取设备微信二维码Res):微信token:" + wxToken + ",设备码:" + devCode + ",跳转页:" + page); try { - JSONObject jsonObjA = JSONUtil.createObj() - .put("scene", devCode) - .put("page", strPage) - .put("check_path", false) - .put("env_version", "develop"); - String jsonStrA = jsonObjA.toStringPretty(); - res = HttpRequest.post("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+wxToken).header(Header.USER_AGENT, "yhs") - .body(jsonStrA) - .timeout(20000) - .execute(); - log.info("响应状态:" + res.getStatus()); - log.info("Cache-Control:" + res.header("Cache-Control")); - log.info("Content-disposition:" + res.header("Content-disposition")); - log.info("Content-Length:" + res.header("Content-Length")); - log.info("Content-Type:" + res.header("Content-Type")); + HttpResponse res = null; + Map param = new HashMap<>(); + param.put("scene", devCode); + param.put("page", page); + param.put("check_path", false); + param.put("env_version", wxShProperties.getEnvVersion());//客户端 + res = HttpRequest.post(GET_QR_CODE_URL + wxToken).header(Header.USER_AGENT, "yhs") + .body(JSONUtil.toJsonStr(param)) + .timeout(2000) + .execute(); + return res; +// log.info("响应状态:" + res.getStatus()); +// log.info("Cache-Control:" + res.header("Cache-Control")); +// log.info("Content-disposition:" + res.header("Content-disposition")); +// log.info("Content-Length:" + res.header("Content-Length")); +// log.info("Content-Type:" + res.header("Content-Type")); // log.info("Response Body:" + res.body()); - log.info("<--- getResDevQrCode") ; +// log.info("<--- getResDevQrCode"); } catch (RuntimeException e) { -// log.error("getToken:" + e.toString()); + log.error(":" + e.getMessage()); + e.printStackTrace(); + throw new BizIllegalException("生成设备小程序二维码失败!"); } - return res; } + // 设备二维码保存 // strDevCode --- 设备编码 // resDevQrCode --- 微信二维码Res @Override - public void saveDevQrCode(String strDevCode, HttpResponse resDevQrCode){ - log.info("---> saveDevQrCode(设备二维码保存)") ; - try { - String filePath = System.getProperty("user.dir") + java.io.File.separator +"qrcode"+ java.io.File.separator + "dev" + java.io.File.separator + "dev-" + strDevCode + ".jpg"; - Img.from(resDevQrCode.bodyStream()).write(FileUtil.file(filePath)); - } catch (RuntimeException e) { -// log.error("getToken:" + e.toString()); - } - log.info("<--- saveDevQrCode") ; + public FileUploadRespVO saveDevQrCode(String strDevCode, HttpResponse response) { +// log.info("---> saveDevQrCode(设备二维码保存)"); +// try { +// byte[] bytes = response.bodyBytes(); +// return fileService.uploadImage(bytes, strDevCode); +// String filePath = System.getProperty("user.dir") + java.io.File.separator + "qrcode" + java.io.File.separator + "dev" + java.io.File.separator + "dev-" + strDevCode + ".jpg"; +// Img.from(response.bodyStream()).write(FileUtil.file(filePath)); +// } catch (RuntimeException e) { +//// log.error("getToken:" + e.toString()); +// } +// log.info("<--- saveDevQrCode"); + + byte[] bytes = response.bodyBytes(); + return fileService.uploadImage(bytes, strDevCode + ".jpg"); } } diff --git a/nxhs-service/src/main/resources/application-prod.yml b/nxhs-service/src/main/resources/application-prod.yml index 36cb3ae..e206de2 100644 --- a/nxhs-service/src/main/resources/application-prod.yml +++ b/nxhs-service/src/main/resources/application-prod.yml @@ -22,3 +22,9 @@ logging: file: path: "${user.dir}/logs/${spring.application.name}" name: "${logging.file.path}/log_error.log" +nxhs: + wx: + client: + env_version: "release" + recycler: + env_version: "release" \ No newline at end of file