From aa72a1d1d8c792b322281f5ab01996bc62820b13 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期二, 16 九月 2025 15:31:07 +0800 Subject: [PATCH] 修改bug及数据加密传输 --- DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java | 305 ++++++++++++++++++++++++-------------------------- 1 files changed, 149 insertions(+), 156 deletions(-) diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java index a0e7847..f2ed023 100644 --- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java +++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java @@ -6,10 +6,9 @@ import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.alipay.api.internal.util.file.IOUtils; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; -import com.stylefeng.guns.config.properties.GunsProperties; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity; @@ -22,11 +21,13 @@ import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.model.vo.*; import com.stylefeng.guns.modular.system.service.*; -import com.stylefeng.guns.modular.system.util.ALiSendSms; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.util.WeChatUtil; -import com.stylefeng.guns.modular.system.util.qianyuntong.NCOSSUtil; -import com.stylefeng.guns.modular.system.util.qianyuntong.QianYunTongConfig; +import com.stylefeng.guns.modular.system.util.zhenglian.CallbackUtil; +import com.stylefeng.guns.modular.system.util.zhenglian.TokenUtil; +import com.stylefeng.guns.modular.system.util.zhenglian.model.MessageBody; +import com.stylefeng.guns.modular.system.util.zhenglian.model.TokenRequest; +import com.stylefeng.guns.modular.system.util.zhenglian.model.TradeTerminalInfo; import com.stylefeng.guns.modular.system.warpper.*; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; @@ -37,28 +38,25 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.geo.Point; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.geo.GeoJsonPoint; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.io.ByteArrayInputStream; -import java.io.IOException; +import java.io.File; import java.io.InputStream; -import java.io.OutputStream; import java.math.BigDecimal; -import java.security.SecureRandom; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; - -import static org.bouncycastle.cms.RecipientId.password; /** * 司机控制器 @@ -87,7 +85,7 @@ @Autowired private ICarService carService; - @Autowired + @Resource private RegionMapper regionMapper; @Autowired @@ -104,10 +102,6 @@ @Autowired private IOrderLogisticsService orderLogisticsService; - - @Autowired - private GunsProperties gunsProperties; - @Autowired private ICompanyService companyService; @@ -117,10 +111,30 @@ @Autowired private TDriverPromotionActivityService driverPromotionActivityService; - - + + @Value("${wx.url}") + private String ACCESS_TOKEN_URL; + + @Value("${wx.appletsAppSecret}") + private String memberAppSecret; + + @Value("${wx.appletsAppid}") + private String wxAppId; + @Autowired - private QianYunTongConfig qianYunTongConfig; + private RestTemplate restTemplate; + + @Autowired + private MongoTemplate mongoTemplate; + + @Autowired + private WeChatUtil weChatUtil; + + @Value("${filePath}") + private String filePath; + + @Value("${qyt.admin_url}") + private String adminUrl; /** * 获取短信验证码 @@ -515,9 +529,11 @@ return ResultUtil.tokenErr(); } Driver driver = driverService.selectById(uid); - String areaCode = driver.getAreaCode(); + String areaCode = driver.getPlaceOfEmployment(); TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>() .eq("districtCode", areaCode) + .eq("state", 1) + .eq("remove", 0) .eq("status", 2) .last("LIMIT 1")); if(tDriverPromotionActivity!=null){ @@ -532,13 +548,11 @@ @ApiOperation(value = "个人的小程序码(分享码)/链接", tags = {"司机端-首页"}, notes = "") - @GetMapping("/api/driver/person-code") + @GetMapping("/api/driver/personCode") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), }) - public ResultUtil<HashMap<String, String>> createQRcode(HttpServletRequest request) { - InputStream inputStream = null; - OutputStream outputStream = null; + public ResultUtil<HashMap<String, Object>> personCode(HttpServletRequest request) { try { Integer uid = driverService.getUserIdFormRedis(request); if (null == uid) { @@ -546,40 +560,31 @@ } Driver driver = driverService.selectById(uid); String accessToken=null; + Object img = redisTemplate.opsForValue().get("DRIVER_WX_IMG" + uid); // 获取调用凭证accessToken - if(ToolUtil.isEmpty(driver.getShareImg())|| ToolUtil.isEmpty(driver.getShareImg())){ + if(ToolUtil.isEmpty(driver.getShareLink())|| ToolUtil.isEmpty(img)){ accessToken = getAccessToken(); } - String img=driver.getShareImg(); int index=0; - - if(ToolUtil.isEmpty(driver.getShareImg())) { - index=1; + String urlLink = driver.getShareLink(); + if(ToolUtil.isEmpty(img) || ToolUtil.isEmpty(urlLink)) { RestTemplate rest = new RestTemplate(); - String imgUrl = ""; - String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken; +// String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken; + String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken; Map<String, Object> param = new HashMap<>(); - param.put("path", "pages/home/home?driverId=" + uid); + param.put("page", "pages/home/home"); param.put("width", 430); //二维码尺寸 - MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); - HttpEntity requestEntity = new HttpEntity(param, headers); - ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]); - byte[] result = entity.getBody(); - inputStream = new ByteArrayInputStream(result); + param.put("scene", "driverId=" + uid); + param.put("env_version", "trial"); //正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。 + HttpRequest post = HttpUtil.createPost(url); + post.body(JSON.toJSONString(param)); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); - // 最后上传生成的文件名 - String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg"; - // oss中的文件夹名 - String objectName = sdf.format(new Date()) + "/" + finalFileName; - String key = "imgs/management/" + objectName; - String object = NCOSSUtil.putObject(qianYunTongConfig.getBucketName(), key, inputStream); - System.out.println(object); - driver.setShareImg(object); - img= object; + byte[] result = post.execute().bodyBytes(); + // base64 + img = Base64.getEncoder().encodeToString(result); + redisTemplate.opsForValue().set("DRIVER_WX_IMG" + uid, img,30, TimeUnit.DAYS); } - String urlLink = driver.getShareLink(); if(ToolUtil.isEmpty(urlLink)) { index=1; String url1 = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + accessToken; @@ -601,57 +606,18 @@ driverService.updateById(driver); } - HashMap<String, String> stringStringHashMap = new HashMap<>(); + HashMap<String, Object> stringStringHashMap = new HashMap<>(); stringStringHashMap.put("url_link",urlLink); stringStringHashMap.put("img",img); - - -// inputStream = new ByteArrayInputStream(result); -// -// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); -// // 最后上传生成的文件名 -// String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg"; -// // oss中的文件夹名 -// String objectName = sdf.format(new Date()) + "/" + finalFileName; -// // 上传oss -//// ossUtil.uploadFile2OSS(inputStream, objectName); -//// //获取文件的URl地址 -//// imgUrl = ossUtil.getImgUrl(objectName); -// log.info("imgUrl: "+imgUrl); return ResultUtil.success(stringStringHashMap); } catch (Exception e) { log.error("调用小程序生成微信永久小程序码URL接口异常", e); - }finally { - if(inputStream != null){ - try { - inputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(outputStream != null){ - try { - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } } return ResultUtil.error("获取二维码失败"); } - @Value("${wx.url}") - private String ACCESS_TOKEN_URL; - - @Value("${wx.appletsAppSecret}") - private String memberAppSecret; - - @Value("${wx.appletsAppid}") - private String wxAppId; - - @Autowired - private RestTemplate restTemplate; + public String getAccessToken() { @@ -775,6 +741,18 @@ @PostMapping("/base/savePosition") public String savePosition(OrderPosition orderPosition){ try { + //将最新定位存储mongodb中 + GeoJsonPoint point = new GeoJsonPoint(new Point(Double.parseDouble(orderPosition.getLon()), + Double.parseDouble(orderPosition.getLat()))); + DriverPosition position = mongoTemplate.findOne(Query.query(Criteria.where("driverId") + .is(orderPosition.getDriverId())), DriverPosition.class); + if(null == position){ + position = new DriverPosition(); + } + position.setDriverId(orderPosition.getDriverId()); + position.setPoint(point); + mongoTemplate.save(position); + //处理业务上的功能 orderPositionService.saveData(orderPosition); return JSON.toJSONString(ResultUtil.success()); }catch (Exception e){ @@ -1010,17 +988,18 @@ */ @ResponseBody @PostMapping("/api/driver/queryPhone") - @ApiOperation(value = "获取客服电话", tags = {"司机端-个人中心"}, notes = "车队=franchisee,分公司=branch,平台=platform") + @ApiOperation(value = "获取客服电话(黔云通)", tags = {"司机端-个人中心"}, notes = "车队=franchisee,分公司=branch,平台=platform") @ApiImplicitParams({ + @ApiImplicitParam(value = "当前行政区划代码", name = "code", required = true, dataType = "String"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) - public ResultUtil queryPhone(HttpServletRequest request){ + public ResultUtil queryPhone(String code, HttpServletRequest request){ try { Integer uid = driverService.getUserIdFormRedis(request); if(null == uid){ return ResultUtil.tokenErr(); } - Map<String, Object> map = driverService.queryPhone(uid); + Map<String, Object> map = driverService.queryPhone(uid, code); return ResultUtil.success(map); }catch (Exception e){ e.printStackTrace(); @@ -1619,9 +1598,10 @@ @ApiOperation(value = "通过区code获取服务商", tags = {"司机端-注册"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(value = "区code", name = "areaCode", required = true, dataType = "String"), + @ApiImplicitParam(value = "name", name = "name", required = false, dataType = "String"), }) - public ResultUtil<List<CompanyVo>> getCompany(String areaCode){ + public ResultUtil<List<CompanyVo>> getCompany(String areaCode,String name){ try { ArrayList<CompanyVo> companyVos = new ArrayList<>(); @@ -1629,7 +1609,12 @@ if(companyCities.isEmpty()){ return ResultUtil.success(companyVos); } - List<Company> companies = companyService.selectList(new EntityWrapper<Company>().ne("type", 1).ne("flag", 3).in("id", companyCities.stream().map(CompanyCity::getCompanyId).collect(Collectors.toList()))); + Wrapper<Company> in = new EntityWrapper<Company>().eq("type", 2).ne("flag", 3).in("id", companyCities.stream().map(CompanyCity::getCompanyId).collect(Collectors.toList())); + + if(ToolUtil.isNotEmpty( name)){ + in.like("name", name); + } + List<Company> companies = companyService.selectList(in); for (Company company : companies) { CompanyVo companyVo = new CompanyVo(company.getId(), company.getName()); companyVos.add(companyVo); @@ -1764,8 +1749,7 @@ } } - @Autowired - private WeChatUtil weChatUtil; + @ResponseBody @PostMapping("/api/driver/getDriverCode") @@ -1785,17 +1769,19 @@ if (fileName == null || "".equals(fileName)) { String appletPath = "pages/home/scanPage/scanPage"; //HttpURLConnection httpURLConnection = weChatUtil.getwxacodeunlimit(appletPath, "d=" + driverId + "&k=" + 0, "release",driverId); - InputStream inputStream = weChatUtil.getwxacodeunlimit(appletPath, "driverId=" + driverId, "release"); + InputStream inputStream = weChatUtil.getwxacodeunlimit(appletPath, "driverId=" + driverId, "trial"); if (inputStream != null) { - // 上传文件目录 - fileName = UUID.randomUUID().toString() + ".png"; - String fileSavePath = gunsProperties.getFileUploadPath() + "img\\"; - FileUtil.writeFromStream(inputStream, fileName); - String pictureName = gunsProperties.getPictureServerAddress() + "img/" + fileName; -// fileName = OssUploadUtil.ossUploadByStream(driverId, inputStream); - System.out.println(pictureName); - driver.setQrCode(pictureName); + File file = FileUtil.writeFromStream(inputStream, new File(filePath + "/" + UUID.randomUUID().toString() + ".png")); + HttpRequest post = HttpUtil.createPost(adminUrl + "/upload/image"); + post.form("file", file); + HttpResponse execute = post.execute(); + int status = execute.getStatus(); + if(200 != status){ + throw new RuntimeException("上传图片异常"); + } + driver.setQrCode(execute.body()); driverService.updateById(driver); + fileName = driver.getQrCode(); } } return ResultUtil.success(fileName); @@ -1829,13 +1815,13 @@ driver.setAuthState(3); driverService.updateById(driver); //开始验证当前账号是否在别处登录 - String value = (String) redisTemplate.opsForValue().get("DRIVER_" + driverId); + String value = (String) redisTemplate.opsForValue().get("dache:DRIVER_" + driverId); if (ToolUtil.isNotEmpty(value)) {//将另外设备上的强迫下线 //开始清除redis中无效的数据 - String key = (String) redisTemplate.opsForValue().get("DRIVER_" + driver.getPhone()); + String key = (String) redisTemplate.opsForValue().get("dache:DRIVER_" + driver.getPhone()); redisTemplate.delete(key);//删除个人信息数据 - redisTemplate.delete("DRIVER_" + driver.getPhone());//删除后台冻结相关缓存 - redisTemplate.delete("DRIVER_" + driverId);//清除存储的token + redisTemplate.delete("dache:DRIVER_" + driver.getPhone());//删除后台冻结相关缓存 + redisTemplate.delete("dache:DRIVER_" + driverId);//清除存储的token } return ResultUtil.success(); } catch (Exception e) { @@ -1844,52 +1830,59 @@ } } - @ResponseBody - @GetMapping("/base/driver/getDriverInfo") - public void getDriverInfo(String lsu, String ssologinid, String ticket, HttpSession session) { + @PostMapping("/api/driver/getZLToken") + @ApiOperation(value = "获取证联token(黔云通)", tags = {"司机端-首页"}, notes = "") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), + @ApiImplicitParam(value = "当前设备IP地址", name = "ip", required = true, dataType = "String"), + @ApiImplicitParam(value = "当前设备mac地址", name = "mac", required = true, dataType = "String"), + @ApiImplicitParam(value = "01 证联收银台支付\n" + + "\t 04 HOME 页\n" + + "\t 06 申请免密签约\n" + + "\t 07 商户收银台支付\n" + + "\t 08 开户(绑卡)\n" + + "\t 09 开通支付账户\n" + + "\t 10 打开付款码", name = "type", required = true, dataType = "String"), + }) + public ResultUtil<String> getZLToken(String ip, String mac, String type, HttpServletRequest request){ try { - String onconParam = edu.yale.its.tp.cas.client.Util.getOnconParam(session); - onconParam = new String(Base64.getDecoder().decode(onconParam), "UTF-8"); - System.err.println("lsu: " + lsu + ",ticket: " + ticket + ",ssologinid: " + ssologinid); - } catch (Exception e) { + Integer driverId = driverService.getUserIdFormRedis(request); + if (null == driverId) { + return ResultUtil.tokenErr(); + } + Driver driver = driverService.selectById(driverId); + TokenRequest tokenRequest = new TokenRequest(); + tokenRequest.setAppUserId(driver.getEmpId().toString()); + tokenRequest.setUserName(driver.getName()); + tokenRequest.setCertNo(driver.getIdCard()); + tokenRequest.setPhone(driver.getPhone()); + TradeTerminalInfo tradeTerminalInfo = new TradeTerminalInfo(); + tradeTerminalInfo.setIp(ip); + tradeTerminalInfo.setTerminal("1"); + tradeTerminalInfo.setMac(mac); + tokenRequest.setTradeTerminalInfo(tradeTerminalInfo); + tokenRequest.setType(type); + String token = TokenUtil.getToken(tokenRequest); + return ResultUtil.success(token); + }catch (Exception e){ e.printStackTrace(); + return ResultUtil.runErr(); } } - - -// @ResponseBody -// @RequestMapping(value = "/base/driver/uploadImg", method = RequestMethod.POST) -// @ApiOperation(value = "上传图片", tags = {"司机端-注册"}, notes = "") -// public ResultUtil uploadImg(MultipartFile file) { -// try { -// String bucketName = "grjy_test"; -// Bucket grjyTest = NCOSSUtil.getBucketInfo(bucketName); -// if (null == grjyTest) { -// //创建桶 -// Boolean bucket = NCOSSUtil.createBucket(bucketName); -// if (!bucket) { -// return ResultUtil.error("创建存储桶失败"); -// } -// //设置桶策略 -// String policyText = "{\"Version\":\"2025-06-23\",\"Statement\":[{\"Sid\":\"Stmt20250623\",\"Action\":[\"GetObject\"]" + -// ",\"Effect\":\"Allow\",\"Resource\":[\"" + bucketName + "\"/*],\"Principal\":{*}}]}"; -// Boolean bucketPolicy = NCOSSUtil.setBucketPolicy(bucketName, policyText); -// if (!bucketPolicy) { -// return ResultUtil.error("设置桶策略失败"); -// } -// } -// //上传对象 -// String key = "image/driver/" + UUID.randomUUID().toString() + ".png"; -// String object = NCOSSUtil.putObject(bucketName, key, file.getInputStream()); -// if (null == object) { -// return ResultUtil.error("上传图片失败"); -// } -// -// return ResultUtil.success("http://" + QianYunTongProperties.endPoint + "/" + key); -// } catch (Exception e) { -// e.printStackTrace(); -// return ResultUtil.runErr(); -// } -// } + + + /** + * 证联通知回调 + * @param messageBody + * @param request + * @return + */ + @ResponseBody + @PostMapping("/base/driver/zlCallback") + public void zlCallback(@RequestBody MessageBody messageBody, HttpServletRequest request){ + String callback = CallbackUtil.callback(messageBody); + System.err.println("证联通知回调:" + callback); + log.info("证联通知回调:" + callback); + } } -- Gitblit v1.7.1