server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -1,16 +1,23 @@ package com.doumee.task; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.exception.BusinessException; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.HttpsUtil; import com.doumee.core.wx.WxPayProperties; import com.doumee.dao.business.model.Goodsorder; import com.doumee.dao.system.model.SystemDictData; import com.doumee.service.business.GoodsorderService; import com.doumee.service.business.MemberRidesService; import com.doumee.service.business.SitesService; import com.doumee.service.business.WxBillService; import com.doumee.service.system.SystemDictDataService; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -19,6 +26,7 @@ import java.util.Date; import java.util.List; import java.util.Objects; /** * 定时任务 @@ -33,6 +41,9 @@ @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private SystemDictDataService systemDictDataService; @Autowired private WxBillService wxBillService; @@ -91,4 +102,30 @@ log.info("=====================结束 站点车辆满架率预警======================="); } @Autowired private WxPayProperties wxPayProperties; /** * 更新微信 ACCESS_TOKEN */ @Scheduled(fixedDelay = 1000L * 60L * 90L) public void updAccessToken(){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); ThreadContext.bind(manager); String appId = wxPayProperties.getAppId(); String appSecret = wxPayProperties.getAppSecret(); //生成微信token String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appId+"&secret="+appSecret; String response = HttpsUtil.doGet(url,null); JSONObject json = JSONObject.parseObject(response); SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.ACCESS_TOKEN); if(!Objects.isNull(systemDictData)){ systemDictData.setCode(json.getString("access_token")); systemDictData.setUpdateTime(new Date()); systemDictDataService.updateById(systemDictData); } } } server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -47,6 +47,8 @@ systemDictDataService.updateById(systemDictData); } @Override public SystemDictData queryByCode(String dicCode, String label){ SystemDict queryDto = new SystemDict(); server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -27,6 +27,7 @@ public static final String DINGDING ="DINGDING" ; public static final String MINI_PROGRAMME ="MINI_PROGRAMME" ; public static final String FREE_RENT_TIME ="FREE_RENT_TIME" ; public static final String ACCESS_TOKEN ="ACCESS_TOKEN" ; public static final String IMG_DIR = "IMG_DIR"; public static final String FILE_DIR ="FILE_DIR" ; public static final String PRIVATE_KEY = "PRIVATE_KEY"; server/services/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -1,15 +1,25 @@ package com.doumee.core.utils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import javax.net.ssl.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; public class HttpsUtil { @@ -80,6 +90,48 @@ return null; } /** * 发送get请求 * @param url 请求URL * @param param 请求参数 key:value url携带参数 或者无参可不填 * @return */ public static String doGet(String url, Map<String, String> param) { // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); String resultString = ""; CloseableHttpResponse response = null; try { // 创建uri URIBuilder builder = new URIBuilder(url); if (param != null) { for (String key : param.keySet()) { builder.addParameter(key, param.get(key)); } } URI uri = builder.build(); // 创建http GET请求 HttpGet httpGet = new HttpGet(uri); // 执行请求 response = httpclient.execute(httpGet); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (response != null) { response.close(); } httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } public static void main(String[] args) { //局部信任所有证书和主机 server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -1,5 +1,6 @@ package com.doumee.core.wx; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; @@ -7,22 +8,31 @@ import com.doumee.core.utils.ID; import com.doumee.dao.business.RefundMapper; import com.doumee.dao.business.TransactionsMapper; import com.doumee.dao.business.model.Locks; import com.doumee.dao.business.model.Refund; import com.doumee.dao.business.model.Transactions; import com.doumee.dao.business.web.request.RefundDTO; import com.doumee.dao.system.model.SystemDictData; import com.doumee.service.business.RefundService; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.exception.WxPayException; import lombok.extern.slf4j.Slf4j; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.math.BigDecimal; import java.util.Date; import java.util.*; /** * 微信小程序-公共方法 @@ -36,6 +46,9 @@ @Autowired private TransactionsMapper transactionsMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @@ -111,4 +124,56 @@ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"退款发生异常请联系管理员"); } /** * 生成小程序码 * https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html * @return */ public void generateWXMiniCode(Locks locks){ SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.ACCESS_TOKEN); if(Objects.isNull(systemDictData)){ return; } //生成图片上传OSS Map<String,Object> body = new HashMap<>(); // 场景码,与前端约定,最终是需要前端解析 body.put("scene", locks.getSiteId() + "/" +locks.getCode() ); // 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。 body.put("env_version", "release"); // 透明,根据你的场景自行设置body参数 body.put("is_hyaline", false); // body.put("page","pages/index/index"); OkHttpClient client = new OkHttpClient().newBuilder().build(); okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json"); okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body)); Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+systemDictData.getCode()).method("POST", requestBody).build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { InputStream inputStream = new ByteArrayInputStream(response.body().bytes()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, len); } locks.setInfo("data:mediatype;base64," + Base64.getEncoder().encodeToString(baos.toByteArray())); // FileOutputStream out = new FileOutputStream("d:\\test.png"); // byte[] buffer = new byte[8192]; // int bytesRead = 0; // while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { // out.write(buffer, 0, bytesRead); // } // out.flush(); // inputStream.close(); // out.close(); } } catch (Exception e) { e.printStackTrace(); } } } server/web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -5,6 +5,8 @@ import com.doumee.core.annotation.LoginRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; import com.doumee.core.wx.WxMiniUtilService; import com.doumee.dao.business.model.Locks; import com.doumee.dao.business.web.request.RegisterRequest; import com.doumee.dao.business.web.request.WxPhoneRequest; import com.doumee.dao.business.web.response.AccountResponse; @@ -34,6 +36,9 @@ @Autowired private MemberService memberService; @Autowired private WxMiniUtilService wxMiniUtilService; // @ApiOperation(value = "用户注册", notes = "小程序端") // @PostMapping("/userRegister") @@ -96,6 +101,16 @@ @ApiOperation(value = "测试生成二维码", notes = "小程序端") @GetMapping("/generateWXMiniCode") public ApiResponse<Locks> generateWXMiniCode() { Locks locks = new Locks(); locks.setCode(12); locks.setSiteId("1005"); wxMiniUtilService.generateWXMiniCode(locks); return ApiResponse.success("操作成功",locks); } }