生成二维码并上传

master
guochaojie 4 months ago
parent 3ca81d0b8e
commit 93afcce2cf

@ -49,7 +49,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
"/static/**",
"/upload/**",
"/qrcode/**.txt",
"/wx-message/**",//微信消息推送验证
"/wx/**",//微信消息推送验证
"/webSocketServer/**",//socket通信
"/doc.html"
);

@ -18,5 +18,6 @@ public class WxHsyProperties {
private String sendMessageUrl;
private String EncodingAESKey;
private String token;
private String envVersion;
}

@ -18,4 +18,5 @@ public class WxShProperties {
private String sendMessageUrl;
private String EncodingAESKey;
private String token;
private String envVersion;
}

@ -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);
}

@ -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<List<FileUploadRespVO>> generateDeviceQRCode(@RequestBody QRCodeVo qrCodeVo) {
FileUploadRespVO fileUploadRespVO = wxService.generateDeviceQRCode(qrCodeVo);
ArrayList<FileUploadRespVO> list = new ArrayList<>();
list.add(fileUploadRespVO);
return CommonResult.success(list);
}
}

@ -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";
}

@ -61,6 +61,14 @@ public interface IFileService extends IService<File> {
*/
FileUploadRespVO uploadImage(String image64, String filename);
/**
* byte
*
* @param image
* @return FileUploadRespVO
*/
FileUploadRespVO uploadImage(byte[] image, String filename);
/**
*
*/

@ -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);
}

@ -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<FileMapper, File> 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 {

@ -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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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");
}
}

@ -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"
Loading…
Cancel
Save