.gitignore | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
.idea/misc.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/platform/src/main/java/com/doumee/task/ScheduleTool.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/core/constants/Constants.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/core/wx/WxMiniConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/core/wx/pay/WxBillUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/service/business/WxBillService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
server/services/src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.gitignore
@@ -1,12 +1,25 @@ coderd.json target/ *.iml log/ #idea .idea *.iws *.iml *.ipr .mvn mvnw mvnw.cmd # Compiled class file *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ # Log file *.log log/ logs .DS_Store tmp # Package Files # *.jar *.war *.ear # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* .idea/misc.xml
@@ -1,5 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="MavenProjectsManager"> <option name="originalFiles"> <list> <option value="$PROJECT_DIR$/server/pom.xml" /> </list> </option> </component> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" /> <component name="SuppressionsComponent"> <option name="suppComments" value="[]" /> </component> server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -2,6 +2,7 @@ import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.service.business.WxBillService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; @@ -21,13 +22,23 @@ @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private WxBillService wxBillService; /** * @throws Exception */ @Scheduled(cron = "0 0 02 * * ? ") @Scheduled(cron = "0 0 11 * * ? ") public void syncStudent() throws Exception { wxBillService.getWxBill(); } /** * @throws Exception */ @Scheduled(fixedDelay = 1000*60) public void getYesterdayBill() throws Exception { wxBillService.getWxBill(); } } server/pom.xml
@@ -281,6 +281,12 @@ <artifactId>weixin-java-pay</artifactId> <version>${weixin-java-pay.version}</version> </dependency> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.11</version> </dependency> </dependencies> <build> server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -25,6 +25,8 @@ public static final String SYSTEM ="SYSTEM" ; public static final String IMG_DIR = "IMG_DIR"; public static final String FILE_DIR ="FILE_DIR" ; public static final String PRIVATE_KEY = "PRIVATE_KEY"; public static final String MINI_PROGRAMME ="MINI_PROGRAMME" ; public static String REDIS_DEBUG_STR="test_"; /** server/services/src/main/java/com/doumee/core/wx/WxMiniConfig.java
@@ -4,7 +4,10 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import com.doumee.config.mybatis.SpringUtils; import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -19,10 +22,10 @@ /********微信å°ç¨åºæå¡**********/ public static WxMaService wxMaService; /********微信å°ç¨åºæ¯ä»**********/ public static WxPayService wxPayService; /********微信APPæ¯ä»**********/ public static WxPayService wxAppPayService; public static WxPayService wxPayService; @Autowired private WxPayProperties wxPayProperties; @@ -34,7 +37,7 @@ @PostConstruct void init() { this.load_WxMaService(); // this.load_wxPayService(); this.load_wxPayService(); // this.load_wxAppPayService(); } /** @@ -55,19 +58,19 @@ /** * åå§å微信å°ç¨åºæ¯ä» */ // public void load_wxPayService() { // WxPayConfig payConfig = new WxPayConfig(); // payConfig.setTradeType(WxPayConstants.TradeType.JSAPI); // payConfig.setSignType(WxPayConstants.SignType.MD5); // payConfig.setAppId(StringUtils.trimToNull(wxPayProperties.getAppId())); // payConfig.setMchId(StringUtils.trimToNull(wxPayProperties.getMchId())); // payConfig.setMchKey(StringUtils.trimToNull(wxPayProperties.getMchKey())); // payConfig.setKeyPath(StringUtils.trimToNull(wxPayProperties.getKeyPath())); // payConfig.setNotifyUrl(StringUtils.trimToNull(wxPayProperties.getNotifyUrl())); // WxPayService wxPayService = new WxPayServiceImpl(); // wxPayService.setConfig(payConfig); // this.wxPayService = wxPayService; // } public void load_wxPayService() { WxPayConfig payConfig = new WxPayConfig(); payConfig.setTradeType(WxPayConstants.TradeType.JSAPI); payConfig.setSignType(WxPayConstants.SignType.MD5); payConfig.setAppId(StringUtils.trimToNull(wxPayProperties.getAppId())); payConfig.setMchId(StringUtils.trimToNull(wxPayProperties.getMchId())); payConfig.setMchKey(StringUtils.trimToNull(wxPayProperties.getMchKey())); payConfig.setKeyPath(StringUtils.trimToNull(wxPayProperties.getKeyPath())); payConfig.setNotifyUrl(StringUtils.trimToNull(wxPayProperties.getNotifyUrl())); WxPayService wxPayService = new WxPayServiceImpl(); wxPayService.setConfig(payConfig); this.wxPayService = wxPayService; } server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -1,17 +1,28 @@ package com.doumee.core.wx; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.utils.ID; import com.doumee.dao.business.ActionLogMapper; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayDownloadBillRequest; import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest; import com.github.binarywang.wxpay.bean.result.WxPayBillResult; import com.github.binarywang.wxpay.bean.result.WxPayRefundResult; import com.github.binarywang.wxpay.exception.WxPayException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.yaml.snakeyaml.scanner.Constant; import java.math.BigDecimal; import java.security.KeyFactory; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; /** * 微信å°ç¨åº-å ¬å ±æ¹æ³ @@ -20,6 +31,9 @@ @Slf4j public class WxMiniUtilService { @Autowired private SystemDictDataBiz systemDictDataBiz; /** * 订åå¾®ä¿¡éæ¬¾ @@ -50,4 +64,6 @@ } throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鿬¾åçå¼å¸¸è¯·è系管çå"); } } server/services/src/main/java/com/doumee/core/wx/pay/WxBillUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,115 @@ package com.doumee.core.wx.pay; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import com.alibaba.fastjson.JSONObject; import com.github.binarywang.wxpay.config.WxPayConfig; import okhttp3.HttpUrl; import java.io.UnsupportedEncodingException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; // Authorization: <schema> <token> // GET - getToken("GET", httpurl, "") // POST - getToken("POST", httpurl, json) public class WxBillUtil { public static void getBill(){ // å建微信æ¯ä»API对象 WxPayConfig config = new WxPayConfig(); // WxPay wxpay = new WxMaServiceImpl(); // wxpay.setWxMaConfig(config); // 设置对账ååæ° Map<String, String> data = new HashMap<>(); data.put("bill_date", "20231001"); // è®¾ç½®å¯¹è´¦æ¥æ data.put("bill_type", "ALL"); // 设置对账åç±»åï¼å¯éå¼ï¼ALLãSUCCESSãREFUNDãRECHARGE_REFUND // è°ç¨ä¸è½½å¯¹è´¦åæ¥å£ // Map<String, String> result = wxpay.downloadBill(data); // è§£æå¯¹è´¦åæ°æ® // String billData = result.get("data"); } public static void main(String[] args) { try { System.out.println( getToken("POST", httpurl, JSONObject.toJSONString(new JSONObject()))); } catch (Exception e) { throw new RuntimeException(e); } } static String url ="https://api.mch.weixin.qq.com/v3/certificates"; static String schema = "WECHATPAY2-SHA256-RSA2048"; static String yourMerchantId = "1229817002"; static String yourCertificateSerialNo = "3FE90C2F3D40A56E1C51926F31B8A8D22426CCE0"; static String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDav+JQjIMy3o/J" + "pwxQpHezUO9McwUD79KgfDcbmKC44anE3MdxIzxpxE6yUkvLZSUpFKyQqnPkJ5rs" + "l4hqTOXVZCxy7JFGP+NzpQbwxponzBPzOAHEpcbz1LE5fMoKHvUBKnZNr09AY7Cc" + "MMYaaSNKFS52j9q5QW/8oyq1SyQqcAyAE8wOZof1qPDdvxAevEKtXdPnrHkV1YFp" + "tofiOLiixax+f+OK29xswUXyC6CNiIM1BhRhAv62re/MKPk1uGxqMxz4FmO4tDBQ" + "il32ZvW2c9V5ZPdaRO7syZNMiSY8cYPckU9Qou57sc/pmOFNHem29dPaoIkso8LU" + "XW2DP05ZAgMBAAECggEAQV7wggPLvWr3a1rJelv8DZFVQfJpgEiuGBmm2k9dUILX" + "miYkT/Iovq7UmcOwNONQHJu6Ci12HqubR7LtKF88m+2ovttleqnjDg82KMQhE12Q" + "ZLHLDXpBH2LjZ3ucYTPpIeUPn52RQHvKLpMA0Km0yxHTZckNoykkD0qvm6gN8cQm" + "q90O+ZPIjBkgnkZQy/rvyJmgrrMCC+hUKj9hf7rUy0Z3QlpFoAUrGQR43cyNJQJB" + "/mo1YMvjLv7i+MZhQMc5isYdynaLW9DJxmJST3PmQnT13ePMjiu4qakBXm3E1GrB" + "ZrlR53ib8bT5uNZNGhOfSGXwn3RcLnNxKJbbleFpNQKBgQD8fVY3JUxM8RuR78e/" + "cTk4GqM8exAUuqaaHgE7gk++zpyFCXzV5wPo1+uEwqh8hZWN+FZ5I/une+Enhnd5" + "V+iUw1CfEd6JTTucgpR3Z4MpXyogcHOArzWI5yO2bCR/J9PEn973BJaji/DUmMmb" + "ffiNtQfarEVmZUfz7Br1uzcBjwKBgQDdynWZvRTsB6eEWOO7x5D6cwaY1OkILdI2" + "57FuvMo2YuiCii4s8RjjR3V8jr/eaAfHx5QEB8Xks3xUTwjhWX+ox0rzHU8b96HB" + "0CENgBPQBbvQk/XIyDSTRQjdKI7Ab7BZiWOihKp2VDG3JtMXHSHqvr2VWdgdV/Uc" + "2cAX2uTtlwKBgFGx6DR9n/uBQ+9rSxE5fE8X51tJYkGixwc00CdGGbFePqyZDkhT" + "sCMlwfG53jQ0MNi30prttp5Rad+VFZEwjXOc4rglWwDH+ZLBeXJNDtZTEVlfqS+p" + "AURjrV14DjMKWu3S4JzCYk9WlzziltD16HdJbNonRWlFOgvFiE+cHMcnAoGBAIGx" + "aVFMOxbGZxPCMvFUgpeheaMXJWmN+dX3aE8cAJcLAXGMQfIvzeDhoXcDtnjklmAh" + "eZFdxj+1ISffy46TGk5ks5Q0eFUfWiyOezV8xpknMSuHyfrt76iKfuNsWwV2ikXh" + "TCz1rQRiuWujPV7Pv0yY2x2hmvmVvJRxVJ3ed23jAoGBAN4BliytMmsVURkoPJT0" + "fprT38uqEhfSn/KL1cGYFy0aSiX7A2P7Yk0KDvcObXVJcYwEqBcfX3NDIJtPj9pO" + "D3pVlzEUgrBcxCLRxcGqdqoZ9OdEoVgZ6tjX2D5HzD3AoCfB6OCEJzgHLNobCGmh" + "kQiTeZj+KI3CtYbie0SS1Dou"; static HttpUrl httpurl = HttpUrl.parse(url); static String getToken(String method, HttpUrl url, String body) throws Exception { String nonceStr = "1234542324"; long timestamp = System.currentTimeMillis() / 1000; String message = buildMessage(method, url, timestamp, nonceStr, body); String signature = sign(message.getBytes("utf-8")); return "mchid=\"" + yourMerchantId + "\"," + "nonce_str=\"" + nonceStr + "\"," + "timestamp=\"" + timestamp + "\"," + "serial_no=\"" + yourCertificateSerialNo + "\"," + "signature=\"" + signature + "\""; } static String sign(byte[] message) throws Exception { Signature sign = Signature.getInstance("SHA256withRSA"); KeyFactory kf = KeyFactory.getInstance("RSA"); sign.initSign(kf.generatePrivate( new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)))); sign.update(message); return Base64.getEncoder().encodeToString(sign.sign()); } static String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) { String canonicalUrl = url.encodedPath(); if (url.encodedQuery() != null) { canonicalUrl += "?" + url.encodedQuery(); } return method + "" + canonicalUrl + "" + timestamp + "" + nonceStr + "" + body + ""; } } server/services/src/main/java/com/doumee/service/business/WxBillService.java
@@ -94,4 +94,5 @@ * @return long */ long count(WxBill wxBill); void getWxBill(); } server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
@@ -1,8 +1,12 @@ package com.doumee.service.business.impl; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.core.wx.WxMiniConfig; import com.doumee.dao.business.WxBillMapper; import com.doumee.dao.business.model.WxBill; import com.doumee.service.business.WxBillService; @@ -10,10 +14,15 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.binarywang.wxpay.bean.request.WxPayDownloadBillRequest; import com.github.binarywang.wxpay.bean.result.WxPayBillInfo; import com.github.binarywang.wxpay.bean.result.WxPayBillResult; import com.github.binarywang.wxpay.exception.WxPayException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; /** @@ -26,7 +35,6 @@ @Autowired private WxBillMapper wxBillMapper; @Override public String create(WxBill wxBill) { wxBillMapper.insert(wxBill); @@ -140,4 +148,23 @@ QueryWrapper<WxBill> wrapper = new QueryWrapper<>(wxBill); return wxBillMapper.selectCount(wrapper); } @Override public void getWxBill() { try { // è·å交æè´¦åæ°æ® WxPayDownloadBillRequest request = new WxPayDownloadBillRequest(); String billDate = DateUtil.beforeDateToStr(1); request.setBillDate(billDate); request.setBillType("ALL"); WxPayBillResult response = WxMiniConfig.wxPayService.downloadBill(request); if(response !=null){ List<WxPayBillInfo> detailList = response.getBillInfoList(); }else{ throw new BusinessException(ResponseStatus.SERVER_ERROR); } } catch (WxPayException e) { e.printStackTrace(); } } } server/services/src/main/resources/application-dev.yml
@@ -40,6 +40,7 @@ # ç¦ç¨swaggeræ¶çéå®åå°å redirect-uri: / ########################微信æ¯ä»ç¸å ³é ç½®######################## wx: pay: @@ -48,7 +49,7 @@ mchId: 1229817002 mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM notifyUrl: https://dmtest.ahapp.net/martempo_interface/web/api/wxPayNotify keyPath: /usr/local/apiclient_cert.p12 keyPath: D:/work/svn/cert/apiclient_cert.p12 tencent: map: