jiangping
2023-10-07 9a94c295952d513c1703aa8d3fcf54d17da168e5
对账
已添加1个文件
已修改10个文件
252 ■■■■■ 文件已修改
.gitignore 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/task/ScheduleTool.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniConfig.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/pay/WxBillUtil.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/WxBillService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 3 ●●●● 补丁 | 查看 | 原始文档 | 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: