diff --git a/.gitignore b/.gitignore index a1c2a23..ac52809 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,12 @@ # Compiled class file *.class - +*.iml # Log file *.log - +*.idea # BlueJ files *.ctxt - +*/target # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/ics-admin/pom.xml b/ics-admin/pom.xml index a584df2..1194e3d 100644 --- a/ics-admin/pom.xml +++ b/ics-admin/pom.xml @@ -60,6 +60,13 @@ 3.11.0 + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.4.2 + + diff --git a/ics-admin/src/main/java/com/ics/admin/controller/meeting/WxPayController.java b/ics-admin/src/main/java/com/ics/admin/controller/meeting/WxPayController.java new file mode 100644 index 0000000..cfb3c56 --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/controller/meeting/WxPayController.java @@ -0,0 +1,87 @@ +package com.ics.admin.controller.meeting; + +import com.ics.admin.domain.meeting.CustomerTicket; +import com.ics.admin.pay.wx.WxPayCallbackUtil; +import com.ics.admin.pay.wx.WxPayCommon; +import com.ics.admin.pay.wx.dto.WxChatBasePayDto; +import com.ics.admin.pay.wx.dto.WxChatPayDto; +import com.ics.admin.service.meeting.ICustomerTicketService; +import com.ics.common.core.controller.BaseController; +import com.ics.common.core.domain.R; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 微信支付 + */ +@RestController +@RequestMapping("/meeting/wxPay") +public class WxPayController extends BaseController { + + @Autowired + ICustomerTicketService customerTicketService; + + @Autowired + WxPayCommon wxPayCommon; + + @Autowired + WxPayCallbackUtil wxPayCallbackUtil; + + + /** + * 下载 + */ + @PostMapping("placeOrder") + public R placeOrder(@RequestBody WxChatBasePayDto wxChatBasePayDto) { + String prepayId = wxPayCommon.wxJsApiPay(wxChatBasePayDto); + WxChatPayDto wxChatPayDto = wxPayCommon.wxPayCall(prepayId); + return R.data(wxChatPayDto); + } + + + /** + * 订单支付后回调 + */ + @PostMapping("orderCallBack") + public HashMap orderCallBack(HttpServletRequest request, HttpServletResponse response) { + HashMap returnParam = new HashMap<>(); + try { + Map parseParam = wxPayCallbackUtil.wxChatPayCallback(request, response); + // 交易状态 + // SUCCESS:支付成功 + // REFUND:转入退款 + // NOTPAY:未支付 + // CLOSED:已关闭 + // REVOKED:已撤销(付款码支付) + // USERPAYING:用户支付中(付款码支付) + // PAYERROR:支付失败(其他原因,如银行返回失败) + String trade_state = parseParam.get("trade_state"); + // 商户订单号 + String out_trade_no = parseParam.get("out_trade_no"); + // 微信订单号 + String transaction_id = parseParam.get("transaction_id"); + // + //支付成功 + if (trade_state.equals("SUCCESS")){ + //编写支付成功后逻辑 + + + + } + //响应微信 + returnParam.put("code", "SUCCESS"); + returnParam.put("message", "成功"); + } catch (Exception e) { + e.printStackTrace(); + } + return returnParam; + } + +} diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCallbackUtil.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCallbackUtil.java new file mode 100644 index 0000000..df5c724 --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCallbackUtil.java @@ -0,0 +1,157 @@ +package com.ics.admin.pay.wx; + +import com.alibaba.fastjson.JSONObject; +import com.wechat.pay.contrib.apache.httpclient.util.AesUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 微信支付回调工具类 + */ +@Component +public class WxPayCallbackUtil { + + @Autowired + WxPayConfig wxPayConfig; + + /** + * 获取回调数据 + * @param request + * @param response + * @return + */ + public Map wxChatPayCallback(HttpServletRequest request, HttpServletResponse response) { + + //获取报文 + String body = getRequestBody(request); + + //随机串 + String nonceStr = request.getHeader("Wechatpay-Nonce"); + + //微信传递过来的签名 + String signature = request.getHeader("Wechatpay-Signature"); + + //证书序列号(微信平台) + String serialNo = request.getHeader("Wechatpay-Serial"); + + //时间戳 + String timestamp = request.getHeader("Wechatpay-Timestamp"); + + //构造签名串 应答时间戳\n,应答随机串\n,应答报文主体\n + String signStr = Stream.of(timestamp, nonceStr, body).collect(Collectors.joining("\n", "", "\n")); + + Map map = new HashMap<>(2); + try { + //验证签名是否通过 + boolean result = verifiedSign(serialNo, signStr, signature); + if(result){ + //解密数据 + String plainBody = decryptBody(body); + return convertWechatPayMsgToMap(plainBody); + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + /** + * 转换body为map + * @param plainBody + * @return + */ + public Map convertWechatPayMsgToMap(String plainBody){ + + Map paramsMap = new HashMap<>(2); + + JSONObject jsonObject = JSONObject.parseObject(plainBody); + + //商户订单号 + paramsMap.put("out_trade_no",jsonObject.getString("out_trade_no")); + //交易状态 + paramsMap.put("trade_state",jsonObject.getString("trade_state")); + // 微信订单号 + paramsMap.put("transaction_id",jsonObject.getString("transaction_id")); + + //附加数据 + paramsMap.put("attach",jsonObject.getString("attach")); + if (jsonObject.getJSONObject("attach") != null && !jsonObject.getJSONObject("attach").equals("")){ + paramsMap.put("account_no",jsonObject.getJSONObject("attach").getString("accountNo")); + } + return paramsMap; + + } + + /** + * 解密body的密文 + * + * "resource": { + * "original_type": "transaction", + * "algorithm": "AEAD_AES_256_GCM", + * "ciphertext": "", + * "associated_data": "", + * "nonce": "" + * } + * + * @param body + * @return + */ + public String decryptBody(String body) throws UnsupportedEncodingException, GeneralSecurityException { + AesUtil aesUtil = new AesUtil(wxPayConfig.getKey().getBytes("utf-8")); + JSONObject object = JSONObject.parseObject(body); + JSONObject resource = object.getJSONObject("resource"); + String ciphertext = resource.getString("ciphertext"); + String associatedData = resource.getString("associated_data"); + String nonce = resource.getString("nonce"); + return aesUtil.decryptToString(associatedData.getBytes("utf-8"),nonce.getBytes("utf-8"),ciphertext); + } + + /** + * 验证签名 + * + * @param serialNo 微信平台-证书序列号 + * @param signStr 自己组装的签名串 + * @param signature 微信返回的签名 + * @return + * @throws UnsupportedEncodingException + */ + public boolean verifiedSign(String serialNo, String signStr, String signature) throws UnsupportedEncodingException { + return wxPayConfig.getVerifier().verify(serialNo, signStr.getBytes("utf-8"), signature); + } + + /** + * 读取请求数据流 + * + * @param request + * @return + */ + public String getRequestBody(HttpServletRequest request) { + StringBuffer sb = new StringBuffer(); + try (ServletInputStream inputStream = request.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + ) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + return sb.toString(); + + } + +} diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCommon.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCommon.java new file mode 100644 index 0000000..53abd6c --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayCommon.java @@ -0,0 +1,222 @@ +package com.ics.admin.pay.wx; + +import com.google.gson.Gson; +import com.ics.admin.pay.wx.constant.WxApiConstants; +import com.ics.admin.pay.wx.dto.WxChatBasePayDto; +import com.ics.admin.pay.wx.dto.WxChatPayDto; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.FileInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.security.Signature; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Component +public class WxPayCommon { + + @Autowired + WxPayConfig wxPayConfig; + + + /** + * 封装基础通用请求数据 + * + * @param basePayData 微信支付基础请求数据 + * @return 封装后的map对象 + */ + public Map getBasePayParams(WxChatBasePayDto basePayData) { + Map paramsMap = new HashMap<>(); + paramsMap.put("appid", wxPayConfig.getAppid()); + paramsMap.put("mchid", wxPayConfig.getMchId()); + // 如果商品名称过长则截取 + String title = basePayData.getDescription().length() > 120 ? basePayData.getDescription().substring(0, 120) : basePayData.getDescription(); + paramsMap.put("description", title); + paramsMap.put("out_trade_no", basePayData.getOrderId()); + paramsMap.put("notify_url", wxPayConfig.getNotifyDomain().concat(basePayData.getNotify())); + Map amountMap = new HashMap<>(); + amountMap.put("total", basePayData.getPrice().multiply(new BigDecimal("100")).intValue()); + paramsMap.put("amount", amountMap); + return paramsMap; + } + + /** + * 获取请求对象(Post请求) + * + * @param paramsMap 请求参数 + * @return Post请求对象 + */ + public HttpPost getHttpPost(String url, Map paramsMap) { + // 1.设置请求地址 + HttpPost httpPost = new HttpPost(wxPayConfig.getDomain().concat(url)); + + // 2.设置请求数据 + Gson gson = new Gson(); + String jsonParams = gson.toJson(paramsMap); + + // 3.设置请求信息 + StringEntity entity = new StringEntity(jsonParams, "utf-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + httpPost.setHeader("Accept", "application/json"); + return httpPost; + } + + /** + * 解析响应数据 + * + * @param response 发送请求成功后,返回的数据 + * @return 微信返回的参数 + */ + public HashMap resolverResponse(CloseableHttpResponse response) { + try { + // 1.获取请求码 + int statusCode = response.getStatusLine().getStatusCode(); + // 2.获取返回值 String 格式 + final String bodyAsString = EntityUtils.toString(response.getEntity()); + + Gson gson = new Gson(); + if (statusCode == 200) { + // 3.如果请求成功则解析成Map对象返回 + HashMap resultMap = gson.fromJson(bodyAsString, HashMap.class); + return resultMap; + } else { + if (StringUtils.isNoneBlank(bodyAsString)) { + System.out.println("微信支付请求失败,提示信息:{}" + bodyAsString); + // 4.请求码显示失败,则尝试获取提示信息 + HashMap resultMap = gson.fromJson(bodyAsString, HashMap.class); + throw new RuntimeException(resultMap.get("message")); + } + System.out.println("微信支付请求失败,未查询到原因,提示信息:{}" + response.toString()); + // 其他异常,微信也没有返回数据,这就需要具体排查了 + throw new IOException("request failed"); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e.getMessage()); + } finally { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + /** + * 获取签名 + * + * @param nonceStr 随机数 + * @param appId 微信公众号或者小程序等的appid + * @param prepay_id 预支付交易会话ID + * @param timestamp 时间戳 10位 + * @return String 新签名 + */ + String getSign(String nonceStr, String appId, String prepay_id, long timestamp) { + + //从下往上依次生成 + String message = buildMessage(appId, timestamp, nonceStr, prepay_id); + //签名 + try { + return sign(message.getBytes("utf-8")); + } catch (IOException e) { + throw new RuntimeException("签名异常,请检查参数或商户私钥"); + } + } + + String sign(byte[] message) { + try { + //签名方式 + Signature sign = Signature.getInstance("SHA256withRSA"); + //私钥,通过MyPrivateKey来获取,这是个静态类可以接调用方法 ,需要的是_key.pem文件的绝对路径配上文件名 + sign.initSign(PemUtil.loadPrivateKey(new FileInputStream(wxPayConfig.getPrivateKeyPath()))); + sign.update(message); + return Base64.getEncoder().encodeToString(sign.sign()); + } catch (Exception e) { + throw new RuntimeException("签名异常,请检查参数或商户私钥"); + } + } + + /** + * 按照前端签名文档规范进行排序,\n是换行 + * + * @param nonceStr 随机数 + * @param appId 微信公众号或者小程序等的appid + * @param prepay_id 预支付交易会话ID + * @param timestamp 时间戳 10位 + * @return String 新签名 + */ + String buildMessage(String appId, long timestamp, String nonceStr, String prepay_id) { + return appId + "\n" + + timestamp + "\n" + + nonceStr + "\n" + + prepay_id + "\n"; + } + + + + + /** + * 创建微信支付订单-jsapi方式 + * + * @param basePayData 基础请求信息,商品标题、商家订单id、订单价格 + * @return 微信支付二维码地址 + */ + public String wxJsApiPay(WxChatBasePayDto basePayData) { + // 1.获取请求参数的Map格式 + Map paramsMap = getBasePayParams(basePayData); + // 1.1 添加支付者信息 + Map payerMap = new HashMap(); + payerMap.put("openid", basePayData.getOpenId()); + paramsMap.put("payer", payerMap); + + // 2.获取请求对象 + HttpPost httpPost = getHttpPost(WxApiConstants.JSAPI_PAY, paramsMap); + + // 3.完成签名并执行请求 + CloseableHttpResponse response = null; + try { + response = wxPayConfig.getWxPayClient().execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("微信支付请求失败"); + } + + // 4.解析response对象 + HashMap resultMap = resolverResponse(response); + if (resultMap != null) { + // 【预支付交易会话标识】 预支付交易会话标识。用于后续接口调用中使用,该值有效期为2小时 + return resultMap.get("prepay_id"); + } + return null; + } + + /** + * 微信用户调用微信支付 + */ + public WxChatPayDto wxPayCall(String prepayId) { + WxChatPayDto wxChatPayDto = new WxChatPayDto(); + wxChatPayDto.setAppid(wxPayConfig.getAppid()); + wxChatPayDto.setTimeStamp(String.valueOf(System.currentTimeMillis() / 1000)); + wxChatPayDto.setNonceStr(UUID.randomUUID().toString().replaceAll("-", "")); + wxChatPayDto.setPrepayId("prepay_id=" + prepayId); + wxChatPayDto.setSignType("RSA"); + wxChatPayDto.setPaySign(getSign(wxChatPayDto.getNonceStr(), wxChatPayDto.getAppid(), wxChatPayDto.getPrepayId(), Long.parseLong(wxChatPayDto.getTimeStamp()))); + + return wxChatPayDto; + } + + + +} diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayConfig.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayConfig.java new file mode 100644 index 0000000..1cd54ac --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/WxPayConfig.java @@ -0,0 +1,134 @@ +package com.ics.admin.pay.wx; + +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.Verifier; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; +import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import lombok.Data; +import org.apache.http.impl.client.CloseableHttpClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; +import java.security.PrivateKey; + +@Configuration +@PropertySource("classpath:application.yml") //读取配置文件 +@ConfigurationProperties(prefix = "weixin") //读取wxpay节点 +@Data +/** + * 微信支付静态常量类 + */ +public class WxPayConfig { + + /** + * 商户号 + */ + private String mchId; + + /** + * 商户API证书序列号 + */ + private String mchSerialNo; + + /** + * 商户私钥文件 + */ + private String privateKeyPath; + + /** + * APIv3密钥 + */ + private String key; + + /** + * APPID + */ + private String appid; + + /** + * 微信服务器地址 + */ + private String domain; + + /** + * 接收结果通知地址 + */ + private String notifyDomain; + + + + /** + * 获取商户的私钥文件 + * + * @param filename 证书地址 + * @return 私钥文件 + */ + public PrivateKey getPrivateKey(String filename) { + try { + return PemUtil.loadPrivateKey(new FileInputStream(filename)); + } catch (FileNotFoundException e) { + throw new RuntimeException("私钥文件不存在"); + } + } + + + /** + * 获取签名验证器 + */ + @Bean + public Verifier getVerifier() { + // 获取商户私钥 + final PrivateKey privateKey = getPrivateKey(privateKeyPath); + + // 私钥签名对象 + PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey); + + // 身份认证对象 + WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner); + + // 获取证书管理器实例 + CertificatesManager certificatesManager = CertificatesManager.getInstance(); + + try { + // 向证书管理器增加需要自动更新平台证书的商户信息 + certificatesManager.putMerchant(mchId, wechatPay2Credentials, key.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + return certificatesManager.getVerifier(mchId); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("获取签名验证器失败"); + } + } + + /** + * 获取微信支付的远程请求对象 + * @return Http请求对象 + */ + @Bean + public CloseableHttpClient getWxPayClient() { + + // 获取签名验证器 + Verifier verifier = getVerifier(); + + // 获取商户私钥 + final PrivateKey privateKey = getPrivateKey(privateKeyPath); + + WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, privateKey) + .withValidator(new WechatPay2Validator(verifier)); + + return builder.build(); + } + +} \ No newline at end of file diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxApiConstants.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxApiConstants.java new file mode 100644 index 0000000..476b8ad --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxApiConstants.java @@ -0,0 +1,15 @@ +package com.ics.admin.pay.wx.constant; + + +/** + * 请求地址 + */ +public class WxApiConstants { + + /** + * jsApi下单 + */ + public static final String JSAPI_PAY = "/v3/pay/transactions/jsapi"; + + +} \ No newline at end of file diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxNotifyConstants.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxNotifyConstants.java new file mode 100644 index 0000000..2c30b16 --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/constant/WxNotifyConstants.java @@ -0,0 +1,13 @@ +package com.ics.admin.pay.wx.constant; + +/** + * 微信回调地址 + */ +public class WxNotifyConstants { + + /** + * 订单支付通知 + */ + public static final String CASE_PAY_NOTIFY = "/meeting/wxPay/orderCallBack"; + +} diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatBasePayDto.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatBasePayDto.java new file mode 100644 index 0000000..157ff62 --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatBasePayDto.java @@ -0,0 +1,38 @@ +package com.ics.admin.pay.wx.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class WxChatBasePayDto { + + /** + * 商品描述 + */ + private String description; + + /** + * 商家订单号,对应 out_trade_no (32) + */ + private String orderId; + + /** + * 订单金额 + */ + private BigDecimal price; + + /** + * 回调地址 + */ + private String notify; + + /** + * 支付用户的openid + */ + private String openId; + +} + + + diff --git a/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatPayDto.java b/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatPayDto.java new file mode 100644 index 0000000..1de20cd --- /dev/null +++ b/ics-admin/src/main/java/com/ics/admin/pay/wx/dto/WxChatPayDto.java @@ -0,0 +1,41 @@ +package com.ics.admin.pay.wx.dto; + +import lombok.Data; + +/** + * 前端微信支付所需参数 + */ +@Data +public class WxChatPayDto { + + /** + * 需要支付的小程序id + */ + private String appid; + + /** + * 时间戳(当前的时间) + */ + private String timeStamp; + + /** + * 随机字符串,不长于32位。 + */ + private String nonceStr; + + /** + * 小程序下单接口返回的prepay_id参数值,提交格式如:prepay_id=*** + */ + private String prepayId; + + /** + * 签名类型,默认为RSA,仅支持RSA。 + */ + private String signType; + + /** + * 签名,使用字段appId、timeStamp、nonceStr、package计算得出的签名值 + */ + private String paySign; + +} diff --git a/ics-web/src/main/resources/application-dev.yml b/ics-web/src/main/resources/application-dev.yml index f8bbbb5..e7db5a5 100644 --- a/ics-web/src/main/resources/application-dev.yml +++ b/ics-web/src/main/resources/application-dev.yml @@ -1,7 +1,7 @@ spring: redis: database: 5 - host: 127.0.0.1 + host: 192.168.0.11 port: 6379 # password: hycxli#123 timeout: 6000ms # 连接超时时长(毫秒) @@ -17,9 +17,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://192.168.0.50:3306/zz-meeting?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://222.184.49.22:3306/dbd-meeting?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: boyuekeji2023 + password: boyue1!Z # 从库数据源 slave: #从数据源开关/默认关闭 @@ -124,3 +124,12 @@ mybatis-plus: configuration: default-enum-type-handler: com.ics.common.handlers.MybatisEnumTypeHandler +weixin: + appid: wx5582a07c1fbbcf06 # appid + mch-serial-no: 5899B7D34B161F9E24EFFCD50E95245521CA40AB # 证书序列号 + private-key-path: /Users/wangqichao/cert/dbd/apiclient_key.pem # 证书路径 + mch-id: 1665472343 # 商户号 + key: CHANGYANGKONGGUhenanjianandianzi # APIv3密钥 + domain: https://api.mch.weixin.qq.com # 微信服务器地址 + notify-domain: http://222.184.49.22:9227 # 回调,自己的回调地址 + diff --git a/ics-web/src/main/resources/application.yml b/ics-web/src/main/resources/application.yml index a6de960..88bcbd1 100644 --- a/ics-web/src/main/resources/application.yml +++ b/ics-web/src/main/resources/application.yml @@ -76,7 +76,7 @@ jwtp: ## 拦截路径,默认是/** path: /** ## 排除拦截路径,默认无 - exclude-path: /admin/login/slide, /business/login/slide, /login/slide,/user/check_code,/captcha/check,/captcha/get,/system/sms/send,/user/register/submit,/weixin/login,/meeting/roomItemByRoom/**,/social_user_login/login,/wx/**,/wx/login,/user/check_mobile,/user/send_mobile,/user/search_customer,/user/check_code,/user/register,/password/send_mobile,/password/forgot,/auth/login,/social_user_login/login + exclude-path: /admin/login/slide, //meeting/wxPay/**, /business/login/slide, /login/slide,/user/check_code,/captcha/check,/captcha/get,/system/sms/send,/user/register/submit,/weixin/login,/meeting/roomItemByRoom/**,/social_user_login/login,/wx/**,/wx/login,/user/check_mobile,/user/send_mobile,/user/search_customer,/user/check_code,/user/register,/password/send_mobile,/password/forgot,/auth/login,/social_user_login/login ## 单个用户最大token数,默认-1不限制 max-token: 1 ## url自动对应权限方式,0 简易模式,1 RESTful模式