gongzuming
2024-10-14 58a8acceb63d52377da4b837e859f2e03d2bce1b
Merge remote-tracking branch 'origin/master-v3' into master-v2
已修改15个文件
已添加3个文件
944 ■■■■ 文件已修改
src/main/java/com/mzl/flower/config/SybPaymentProperties.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/pay/SybConstants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/pay/SybPayService.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/schedule/ScheduleService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/OrderSalesService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/OrderService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/service/payment/UserPaymentSybService.java 600 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/payment/OrderController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/payment/PaymentCallBackSybResource.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/web/payment/SalesController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-local.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-test.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mzl/flower/config/SybPaymentProperties.java
对比新文件
@@ -0,0 +1,13 @@
package com.mzl.flower.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "syb")
public class SybPaymentProperties {
    private String callBackUrl;
}
src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java
@@ -14,8 +14,10 @@
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
@Slf4j
public class HttpConnectionUtil {
    private HttpURLConnection conn;
    private String connectUrl;
@@ -81,7 +83,7 @@
                .append('=')
                .append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        System.out.println("参数:"+outBuf.toString());
        log.info("参数:"+outBuf.toString());
        return postParams(outBuf.toString(),readreturn);
    }
    
src/main/java/com/mzl/flower/pay/SybConstants.java
@@ -24,7 +24,7 @@
    public static final String SYB_MD5_APPKEY = "666888";
    public static final String SYB_APIURL = "https://vsp.allinpay.com/apiweb";//生产环境
    public static final String SYB_RSACUSPRIKEY = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDcvMSSSSyjeIFXpoc/aFScXgp1o9qbAO6fIGPRGFtwexSO4g3oP7sse8lL80bUNtj5Q7ysAEjVKW0fDpe/iJ0/jtqJ2CEL5aXDr6Fu7YR7zMLhbCDa531t64Iw4l0ADg3c+5jDSY3ck2rp5pX3RxYLpBb5VB2P005nMNJpG5oRuIRTMa0og07/cFMjhV3Q10eN6pBMnZ4jlXRjUUcftZhMCVUS9zAH16bcnbf6X6HJpBghuPEeIXKEwb+p8usvm4ZVcPh7Ha5dEdHeUGP7bCY9360plVfv20bZvucwlR4GuP6lDmMgqLF11jrEeGa+Fu+2e8wD0LnIfZjeenKLvlqFAgMBAAECggEAA2zmfAKor6y6DRsndCNxVK/c57BwPwGHsm51PhRrrtYqHoGBh74dcHZHTGdtDPQA7/VOIzkp6CzpZZb7YdyD3C2iVItHEAEzTlMWZTtIWAd4arkb1WnMN311Gr8YhFyzeF9rInSsv+SFvzV11E2FGQ8l0B6vCsFTsSQ/z6O/A1FbT3IaW5LTcsd6oysQr7ShT5yuCtuBuBypXI/7lmFoOn4O0/o5WFtqXr1295rpjv10WTycqZyfKh8W7CW7AKwT3SfuEodLBhmVHtu9TD+RNJRhu6ekv58vrnFAaRI7YUh/Kg3SfkvE0+Csp9meDGJJB6pbRwF8jdvTVd2kuWeM4QKBgQD+Ax/rxLRIGhc22cdw11c7anK7JkMU6J/K7i/zFJ6FJTixaz+zWOAxwyDPYSkyVeA555CSKAsXAtWd9vJHjFjgA4avPeF96C5WSZu26K+6pAz9VfyRYXw/2pZ060M+iBIinlTKu/B9SiYoiB5Y86Me9xFag4FrQvcghmV4zzhuyQKBgQDedvtm2hI7Gfna7fBOcr/69eiwxEvKhZ/1K0oRv9O2Sr0tFfUT0kSNejC1/CtRhaJN0TM4ZET7ajJZxfgK/lzyB3Utr60Sp5Vk0KaKVrwN7H3HOjQ8zE+YlbQwPRphgTM0/y0/wgq8sTmg1FKHHrHi4k7EusS4KEsD4AQ2pAl/3QKBgQCiIJBxRb3j/3MtuVcI+QlejRTpywQqBkhnmBvWxSRgy18iLtgbuvBuEqOQee13iURy8RBfmVtqto5uIr6FWFkpslZ258JTQKzCuny/BEmVkTwRPp7UlCpf/z7lJXxoHyWkHvbz530aGwe7+xWTpP5Kt1vGMAWc1sMxaVa/A1R7sQKBgQCkBZXWf3JxoPVXNZe4P2LM5gJqUlCPQXZujTxPWd/+x5wzYb0QoDdrGGxRwVsvABhqx5O8QDGcLPBywEPh1ykwSc9bn+s7ldPQQQaJeOmuWm9iNMfPC9Sj67yu1F5fBaN7r6jtGWRRO1oB+onelgMSBUmOQyZHoW2trb1tjAR1AQKBgQCJ7wwrATqy+4/1kcm1zWrwjI39Db27lyLb1TR5jPdmdOHmCMMoLrsB4fkpZhnlXIA7uIzkZX5+rNMAkGrV84ZWZ0Q5QXCCMtFypFlZPxh9q8Jb1aB1Abn3UTKgJfUalDo4H8Q+h1COlNPU/6YuWPl8gU489NI/rkopt25j0GhFqQ==";
    public static final String SYB_RSATLPUBKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3LzEkkkso3iBV6aHP2hUnF4KdaPamwDunyBj0RhbcHsUjuIN6D+7LHvJS/NG1DbY+UO8rABI1SltHw6Xv4idP47aidghC+Wlw6+hbu2Ee8zC4Wwg2ud9beuCMOJdAA4N3PuYw0mN3JNq6eaV90cWC6QW+VQdj9NOZzDSaRuaEbiEUzGtKINO/3BTI4Vd0NdHjeqQTJ2eI5V0Y1FHH7WYTAlVEvcwB9em3J23+l+hyaQYIbjxHiFyhMG/qfLrL5uGVXD4ex2uXRHR3lBj+2wmPd+tKZVX79tG2b7nMJUeBrj+pQ5jIKixddY6xHhmvhbvtnvMA9C5yH2Y3npyi75ahQIDAQAB";
    public static final String SYB_RSATLPUBKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCm9OV6zH5DYH/ZnAVYHscEELdCNfNTHGuBv1nYYEY9FrOzE0/4kLl9f7Y9dkWHlc2ocDwbrFSm0Vqz0q2rJPxXUYBCQl5yW3jzuKSXif7q1yOwkFVtJXvuhf5WRy+1X5FOFoMvS7538No0RpnLzmNi3ktmiqmhpcY/1pmt20FHQQIDAQAB";
src/main/java/com/mzl/flower/pay/SybPayService.java
@@ -1,9 +1,14 @@
package com.mzl.flower.pay;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.net.URLEncoder;
import java.util.Map;
import java.util.TreeMap;
@Slf4j
public class SybPayService {
@@ -27,27 +32,27 @@
        TreeMap<String,String> params = new TreeMap<String,String>();
        if(!SybUtil.isEmpty(SybConstants.SYB_ORGID))
            params.put("orgid", SybConstants.SYB_ORGID);
            params.put("cusid", SybConstants.SYB_CUSID);
            params.put("appid", SybConstants.SYB_APPID);
            params.put("version", "12");
            params.put("trxamt", String.valueOf(trxamt));
            params.put("reqsn", reqsn);
            params.put("unireqsn", unireqsn);
            params.put("notify_url", notifyUrl);
            params.put("body", body);
            params.put("remark", remark);
            params.put("paytype", "W06");
            params.put("randomstr", SybUtil.getValidatecode(8));
            params.put("signtype", SybConstants.SIGN_TYPE);
            String appkey = "";
            if(SybConstants.SIGN_TYPE.equals("RSA"))
                appkey = SybConstants.SYB_RSACUSPRIKEY;
            else if(SybConstants.SIGN_TYPE.equals("SM2"))
                appkey = SybConstants.SYB_SM2PPRIVATEKEY;
            else
                appkey = SybConstants.SYB_MD5_APPKEY;
            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
            return params;
        params.put("cusid", SybConstants.SYB_CUSID);
        params.put("appid", SybConstants.SYB_APPID);
        params.put("version", "12");
        params.put("trxamt", String.valueOf(trxamt));
        params.put("reqsn", reqsn);
        params.put("unireqsn", unireqsn);
        params.put("notify_url", notifyUrl);
        params.put("body", body);
        params.put("remark", remark);
        params.put("paytype", "W06");
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", SybConstants.SIGN_TYPE);
        String appkey = "";
        if(SybConstants.SIGN_TYPE.equals("RSA"))
            appkey = SybConstants.SYB_RSACUSPRIKEY;
        else if(SybConstants.SIGN_TYPE.equals("SM2"))
            appkey = SybConstants.SYB_SM2PPRIVATEKEY;
        else
            appkey = SybConstants.SYB_MD5_APPKEY;
        params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
        return params;
    }
@@ -66,27 +71,31 @@
        TreeMap<String,String> params = new TreeMap<String,String>();
        if(!SybUtil.isEmpty(SybConstants.SYB_ORGID))
            params.put("orgid", SybConstants.SYB_ORGID);
            params.put("cusid", SybConstants.SYB_CUSID);
            params.put("appid", SybConstants.SYB_APPID);
            params.put("version", "11");
            params.put("trxamt", String.valueOf(trxamt));
            params.put("reqsn", reqsn);
        params.put("cusid", SybConstants.SYB_CUSID);
        params.put("appid", SybConstants.SYB_APPID);
        params.put("version", "11");
        params.put("trxamt", String.valueOf(trxamt));
        params.put("reqsn", reqsn);
        if (StringUtils.isNotBlank(oldtrxid))  {
            params.put("oldtrxid", oldtrxid);
        }
        if(StringUtils.isNotBlank(oldreqsn)){
            params.put("oldreqsn", oldreqsn);
            params.put("randomstr", SybUtil.getValidatecode(8));
            params.put("signtype", SybConstants.SIGN_TYPE);
            String appkey = "";
            if(SybConstants.SIGN_TYPE.equals("RSA"))
                appkey = SybConstants.SYB_RSACUSPRIKEY;
            else if(SybConstants.SIGN_TYPE.equals("SM2"))
                appkey = SybConstants.SYB_SM2PPRIVATEKEY;
            else
                appkey = SybConstants.SYB_MD5_APPKEY;
            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
            byte[] bys = http.postParams(params, true);
            String result = new String(bys,"UTF-8");
            Map<String,String> map = handleResult(result);
            return map;
        }
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", SybConstants.SIGN_TYPE);
        String appkey = "";
        if(SybConstants.SIGN_TYPE.equals("RSA"))
            appkey = SybConstants.SYB_RSACUSPRIKEY;
        else if(SybConstants.SIGN_TYPE.equals("SM2"))
            appkey = SybConstants.SYB_SM2PPRIVATEKEY;
        else
            appkey = SybConstants.SYB_MD5_APPKEY;
        params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
        byte[] bys = http.postParams(params, true);
        String result = new String(bys,"UTF-8");
        Map<String,String> map = handleResult(result);
        return map;
    }
    /**
@@ -104,27 +113,31 @@
        TreeMap<String,String> params = new TreeMap<String,String>();
        if(!SybUtil.isEmpty(SybConstants.SYB_ORGID))
            params.put("orgid", SybConstants.SYB_ORGID);
            params.put("cusid", SybConstants.SYB_CUSID);
            params.put("appid", SybConstants.SYB_APPID);
            params.put("version", "11");
            params.put("trxamt", String.valueOf(trxamt));
            params.put("reqsn", reqsn);
        params.put("cusid", SybConstants.SYB_CUSID);
        params.put("appid", SybConstants.SYB_APPID);
        params.put("version", "11");
        params.put("trxamt", String.valueOf(trxamt));
        params.put("reqsn", reqsn);
        if(StringUtils.isNotBlank(oldreqsn)){
            params.put("oldreqsn", oldreqsn);
        }
        if (StringUtils.isNotBlank(oldtrxid))  {
            params.put("oldtrxid", oldtrxid);
            params.put("randomstr", SybUtil.getValidatecode(8));
            params.put("signtype", SybConstants.SIGN_TYPE);
            String appkey = "";
            if(SybConstants.SIGN_TYPE.equals("RSA"))
                appkey = SybConstants.SYB_RSACUSPRIKEY;
            else if(SybConstants.SIGN_TYPE.equals("SM2"))
                appkey = SybConstants.SYB_SM2PPRIVATEKEY;
            else
                appkey = SybConstants.SYB_MD5_APPKEY;
            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
            byte[] bys = http.postParams(params, true);
            String result = new String(bys,"UTF-8");
            Map<String,String> map = handleResult(result);
            return map;
        }
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", SybConstants.SIGN_TYPE);
        String appkey = "";
        if(SybConstants.SIGN_TYPE.equals("RSA"))
            appkey = SybConstants.SYB_RSACUSPRIKEY;
        else if(SybConstants.SIGN_TYPE.equals("SM2"))
            appkey = SybConstants.SYB_SM2PPRIVATEKEY;
        else
            appkey = SybConstants.SYB_MD5_APPKEY;
        params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
        byte[] bys = http.postParams(params, true);
        String result = new String(bys,"UTF-8");
        Map<String,String> map = handleResult(result);
        return map;
    }
    /**
@@ -140,25 +153,29 @@
        TreeMap<String,String> params = new TreeMap<String,String>();
        if(!SybUtil.isEmpty(SybConstants.SYB_ORGID))
            params.put("orgid", SybConstants.SYB_ORGID);
            params.put("cusid", SybConstants.SYB_CUSID);
            params.put("appid", SybConstants.SYB_APPID);
            params.put("version", "12");
        params.put("cusid", SybConstants.SYB_CUSID);
        params.put("appid", SybConstants.SYB_APPID);
        params.put("version", "12");
        if(StringUtils.isNotBlank(oldreqsn)){
            params.put("oldreqsn", oldreqsn);
        }
        if (StringUtils.isNotBlank(oldtrxid))  {
            params.put("oldtrxid", oldtrxid);
            params.put("randomstr", SybUtil.getValidatecode(8));
            params.put("signtype", SybConstants.SIGN_TYPE);
            String appkey = "";
            if(SybConstants.SIGN_TYPE.equals("RSA"))
                appkey = SybConstants.SYB_RSACUSPRIKEY;
            else if(SybConstants.SIGN_TYPE.equals("SM2"))
                appkey = SybConstants.SYB_SM2PPRIVATEKEY;
            else
                appkey = SybConstants.SYB_MD5_APPKEY;
            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
            byte[] bys = http.postParams(params, true);
            String result = new String(bys,"UTF-8");
            Map<String,String> map = handleResult(result);
            return map;
        }
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", SybConstants.SIGN_TYPE);
        String appkey = "";
        if(SybConstants.SIGN_TYPE.equals("RSA"))
            appkey = SybConstants.SYB_RSACUSPRIKEY;
        else if(SybConstants.SIGN_TYPE.equals("SM2"))
            appkey = SybConstants.SYB_SM2PPRIVATEKEY;
        else
            appkey = SybConstants.SYB_MD5_APPKEY;
        params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
        byte[] bys = http.postParams(params, true);
        String result = new String(bys,"UTF-8");
        Map<String,String> map = handleResult(result);
        return map;
    }
    
    public Map<String,String> query(String reqsn,String trxid) throws Exception{
@@ -171,7 +188,9 @@
        params.put("appid", SybConstants.SYB_APPID);
        params.put("version", "11");
        params.put("reqsn", reqsn);
        params.put("trxid", trxid);
        if(StringUtils.isNotBlank(trxid)){
            params.put("trxid", trxid);
        }
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", SybConstants.SIGN_TYPE);
        String appkey = "";
@@ -190,7 +209,7 @@
    
    
    public static Map<String,String> handleResult(String result) throws Exception{
        System.out.println("ret:"+result);
        log.info("通联支付返回结果:"+result);
        Map map = SybUtil.json2Obj(result, Map.class);
        if(map == null){
            throw new Exception("返回数据错误");
src/main/java/com/mzl/flower/schedule/ScheduleService.java
@@ -46,6 +46,9 @@
    private UserPaymentV3Service paymentV3Service;
    @Autowired
    private UserPaymentSybService paymentSybService;
    @Autowired
    private OrderService orderService;
    @Autowired
@@ -114,10 +117,11 @@
                try {
                    LocalDateTime createdTime = o.getCreateTime().plusMinutes(5);
                    if (createdTime.isBefore(LocalDateTime.now())) {
                        boolean f = paymentV3Service.checkOrderStatus(o.getId());
                        /*boolean f = paymentV3Service.checkOrderStatus(o.getId());
                        if(!f){
                            paymentV3Service.cancelOrder(o.getId());
                        }
                        }*/
                        paymentSybService.cancelOrder(o.getId());
                    }
                } catch (Exception e) {
                    log.error(e.getMessage(), e);
src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java
@@ -50,7 +50,7 @@
    private OrderItemMapper orderItemMapper;
    @Autowired
    private UserPaymentV3Service paymentV3Service;
    private UserPaymentSybService paymentSybService;
    @Autowired
    private SequenceNo sequenceNo;
@@ -329,7 +329,7 @@
        return rr;
    }
    public OrderItem doAudit(OrderItemSalesAuditDTO dto, String status){
    public OrderItem doAudit(OrderItemSalesAuditDTO dto, String status) throws Exception {
        OrderItemSales sl = orderItemSalesMapper.selectById(dto.getId());
        if(sl == null){
            throw new ValidationException("售后单不存在");
@@ -447,7 +447,7 @@
        if(Constants.ORDER_SALES_STATUS.AGREED.name().equals(sl.getStatus())){
            if(totalFeeWithPacking.doubleValue() > 0) {
                String refundId = paymentV3Service.refundOrderSub(o, totalFeeWithPacking);
                String refundId = paymentSybService.refundOrderSub(o, totalFeeWithPacking);
                sl.setRefundId(refundId);
            }
        }
src/main/java/com/mzl/flower/service/payment/OrderSalesService.java
@@ -55,7 +55,7 @@
    private UserWechatMapper wechatMapper;
    @Autowired
    private UserPaymentV3Service paymentV3Service;
    private UserPaymentSybService paymentSybService;
    @Autowired
    private OrderRefundMapper orderRefundMapper;
@@ -192,7 +192,7 @@
        salesItemMapper.updateById(item);
    }
    public void doAudit(OrderSalesAuditDTO dto){
    public void doAudit(OrderSalesAuditDTO dto) throws Exception {
        OrderSales s = salesMapper.selectById(dto.getId());
        s.setAuditRemarks(dto.getAuditRemarks());
        s.setAuditStatus(dto.getAuditStatus());
@@ -214,7 +214,7 @@
        if(Constants.SALES_AUDIT_STATUS.AGREE.name().equals(s.getAuditStatus())){
            if(totalAmount.doubleValue() > 0) {
                Order o = orderMapper.selectById(s.getOrderId());
                String transferId = paymentV3Service.refundOrderSub(o, totalAmount);
                String transferId = paymentSybService.refundOrderSub(o, totalAmount);
                s.setTransferId(transferId);
                /*if(totalAmount.doubleValue() > o.getTotalAmount().doubleValue()){
src/main/java/com/mzl/flower/service/payment/OrderService.java
@@ -44,6 +44,7 @@
import com.mzl.flower.mapper.supplier.StationMapper;
import com.mzl.flower.mapper.system.UserWechatMapper;
import com.mzl.flower.mapper.warehouse.WarehouseLocationMapper;
import com.mzl.flower.pay.SybPayService;
import com.mzl.flower.service.BaseService;
import com.mzl.flower.service.comment.FlowerCommentService;
import com.mzl.flower.service.coupon.CouponRecordService;
@@ -99,6 +100,9 @@
    @Autowired
    private UserPaymentV3Service paymentV3Service;
    @Autowired
    private UserPaymentSybService paymentSybService;
    @Autowired
    private SequenceNo sequenceNo;
@@ -453,7 +457,7 @@
        }
    }
    public Map commitOrder(OrderCommitDTO dto, PreOrderDTO p, Map<Long, PriceDTO> priceMap) {
    public Map commitOrder(OrderCommitDTO dto, PreOrderDTO p, Map<Long, PriceDTO> priceMap) throws Exception {
        String userId = SecurityUtils.getUserId();
        p.getFlowers().forEach(flower -> {
            // 限购数量 鲜花数量校验
@@ -465,6 +469,7 @@
            }
        });
        /* 替换支付修改
        WxMaJscode2SessionResult session = null;
        try {
            session = weChatService.getWxMaSessionInfo(dto.getWxcode());
@@ -475,6 +480,7 @@
        if (StringUtils.isBlank(openId)) {
            throw new ValidationException("微信登录失败");
        }
        */
        Address address = addressMapper.selectById(dto.getAddressId());
        List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address
@@ -528,7 +534,7 @@
        }
        totalAmount = totalAmount.add(p.getPacking()).add(transportFee);
        if(totalAmount.doubleValue() <= 0){//假如总价小于等于0,则支付0.01元
            totalAmount = new BigDecimal(0.01);
            totalAmount = new BigDecimal("0.01");
        }
        order.setTotalAmount(totalAmount);
@@ -605,7 +611,7 @@
        }
        order.setOrderNo(getOrderNo());
        order.setPayOpenid(openId);
        //order.setPayOpenid(openId);替换支付修改
        orderMapper.insert(order);
        //处理积分商品兑换券
@@ -620,9 +626,7 @@
            }
        }
        Map map = paymentV3Service.wxPrepay(order);
        map.put("_testV2OrderId", order.getId());
        return map;
        return paymentSybService.prepay(order);
    }
    private void usePointGoods(String orderId, List<Long> goodsRecordIdList){
@@ -775,6 +779,7 @@
        if(orders == null || orders.size() == 0){
            return;
        }
        /*
        for (Order o : orders) {
            //set status_backend = 'RECEIVE', status = 'RECEIVE'
            o.setStatusBackend("RECEIVE");
@@ -791,7 +796,8 @@
            orderMapper.updateById(o);
        }
        //orderMapper.setPartnerOrderReceive();
        */
        orderMapper.setPartnerOrderReceive();
    }
    /**
@@ -812,6 +818,7 @@
        o.setStatusBackend(Constants.ORDER_STATUS_BACKEND.RECEIVE.name());
        o.update(SecurityUtils.getUserId());
        /*
        //发送微信发货请求
        JSONObject jsonObject = sendWxDeliveryGood(o);
        if (jsonObject != null && (int) jsonObject.get("errcode") == 0) {
@@ -821,7 +828,7 @@
            o.setWxDeliveryGood(false);
            o.setWxDeliveryMsg(GsonUtil.toJson(jsonObject));
        }
        */
        orderMapper.updateById(o);
    }
@@ -1235,6 +1242,7 @@
        customerPointService.consumptionPoint(totalAmount, o.getOrderNo(), o.getCreateBy());
    }
    /*
    public JSONObject sendWxDeliveryGood(Order o) {
        JSONObject json = new JSONObject();
        List<OrderItem> items = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
@@ -1273,6 +1281,7 @@
            return json;
        }
    }
    */
    public Order confirmOrderReceive(String id) {
        Order o = orderMapper.selectById(id);
@@ -1427,7 +1436,7 @@
        return dto;
    }
    public void processAbnormalOrder(String id) {
    public void processAbnormalOrder(String id) throws Exception {
        Order o = orderMapper.selectById(id);
        String transferId = o.getTransferId();
        if (StringUtils.isNotEmpty(transferId)) {
@@ -1466,13 +1475,13 @@
        transferId = "NoNeedRefund";
        if (deductAmount.doubleValue() > 0) {
            transferId = paymentV3Service.refundOrderSub(o, deductAmount);
            transferId = paymentSybService.refundOrderSub(o, deductAmount);
        }
        o.setTransferId(transferId);
        orderMapper.updateById(o);
    }
    public void processLevelDown(OrderReduceDTO dto) {
    public void processLevelDown(OrderReduceDTO dto) throws Exception {
        Order o = orderMapper.selectById(dto.getId());
        String transferId = o.getTransferId();
        if (StringUtils.isNotEmpty(transferId)) {
@@ -1487,7 +1496,7 @@
        }
        BigDecimal amount = dto.getAmount();
        transferId = paymentV3Service.refundOrderSub(o, amount);
        transferId = paymentSybService.refundOrderSub(o, amount);
        o.setTransferId(transferId);
        o.setTransferTime(LocalDateTime.now());
        o.update(SecurityUtils.getUserId());
src/main/java/com/mzl/flower/service/payment/UserPaymentSybService.java
对比新文件
@@ -0,0 +1,600 @@
package com.mzl.flower.service.payment;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mzl.flower.config.SybPaymentProperties;
import com.mzl.flower.config.exception.ValidationException;
import com.mzl.flower.config.security.SecurityUtils;
import com.mzl.flower.constant.Constants;
import com.mzl.flower.dto.request.payment.UserPaymentDTO;
import com.mzl.flower.entity.flower.Flower;
import com.mzl.flower.entity.payment.*;
import com.mzl.flower.mapper.flower.FlowerMapper;
import com.mzl.flower.mapper.payment.*;
import com.mzl.flower.pay.SybConstants;
import com.mzl.flower.pay.SybPayService;
import com.mzl.flower.pay.SybUtil;
import com.mzl.flower.service.BaseService;
import com.mzl.flower.service.coupon.CouponRecordService;
import com.mzl.flower.service.flower.FlowerService;
import com.mzl.flower.service.point.PointGoodsService;
import com.mzl.flower.utils.UUIDGenerator;
import io.micrometer.core.instrument.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
@Service
@Transactional
@Slf4j
public class UserPaymentSybService extends BaseService {
    @Autowired
    private UserPaymentMapper userPaymentMapper;
    @Autowired
    private RedisLockService lockService;
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Autowired
    private FlowerMapper flowerMapper;
    @Autowired
    private FlowerService flowerService;
    @Autowired
    private DeliveryOrderService deliveryOrderService;
    @Autowired
    private OrderRefundMapper orderRefundMapper;
    @Autowired
    private OrderPointGoodsMapper orderPointGoodsMapper;
    @Autowired
    private PointGoodsService pointGoodsService;
    @Autowired
    private CouponRecordService couponRecordService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private SybPaymentProperties sybPaymentProperties;
    /**
     * 通联支付
     *
     * @param order
     * @return
     */
    public Map prepay(Order order) throws Exception {
        String userId = SecurityUtils.getUserId();
        UserPayment up = prepareUserPayment(userId, order);
        log.info("UserPayment: " + toJSONString(up));
        SybPayService service = new SybPayService();
        long trxamt = prepareAmount(up.getPaymentAmount());
        String reqsn = order.getId();
        String unireqsn = "";
        String body = "通联支付";
        String remark = "通联支付";
        String notifyUrl = sybPaymentProperties.getCallBackUrl() + "/flower/api/ua/notify/syb/paid";
        // 调用接口
        Map map = service.createOrder(trxamt, reqsn, unireqsn, body, remark, notifyUrl);
        up.setPrepayResponse(toJSONString(map));
        userPaymentMapper.insert(up);
        return map;
    }
    private Integer prepareAmount(BigDecimal amount){
         return amount.multiply(new BigDecimal(100)).intValue();
    }
    private UserPayment prepareUserPayment(String userId, Order order){
        UserPayment up = new UserPayment();
        up.setId(UUIDGenerator.getUUID());
        up.setUserId(userId);
        up.setOrderId(order.getId());
        up.setPaymentAmount(order.getTotalAmount());
        up.setPaymentTime(LocalDateTime.now());
        up.create(userId);
        return up;
    }
    /**
     * 动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容由于收银宝加字段而引起的签名异常
     * @param request
     * @return
     */
    private TreeMap<String, String> getParams(HttpServletRequest request){
        TreeMap<String, String> map = new TreeMap<>();
        Map reqMap = request.getParameterMap();
        for(Object key:reqMap.keySet()){
            String value = ((String[])reqMap.get(key))[0];
            System.out.println(key+";"+value);
            map.put(key.toString(),value);
        }
        return map;
    }
    public String handlePayCallback(HttpServletRequest request) {
        try {
            request.setCharacterEncoding("UTF-8");//通知传输的编码为GBK
            TreeMap<String,String> params = getParams(request);//动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容
            String appkey = "";
            if("RSA".equals(params.get("signtype")))
                appkey = SybConstants.SYB_RSATLPUBKEY;
            else if("SM2".equals(params.get("signtype")))
                appkey = SybConstants.SYB_SM2TLPUBKEY;
            else
                appkey = SybConstants.SYB_MD5_APPKEY;
            boolean isSign = SybUtil.validSign(params, appkey, params.get("signtype"));// 接受到推送通知,首先验签
            log.info("验签结果:" + isSign);
            //验签完毕进行业务处理
            if(isSign){
                String originalXml = toJSONString(params);
                log.info("transaction: " + originalXml);
                String outTradeNo = params.get("cusorderid");//统一下单对应的reqsn订单号
                String transactionId = params.get("trxid");//通联收银宝交易流水号
                String orderId = outTradeNo;
                Integer trxamt = Integer.parseInt(params.get("trxamt"));//交易金额 单位:分
                log.info("======trxamt: " + trxamt);
                String trxstatus = params.get("trxstatus");//支付状态
                String status = Constants.PAYMENT_STATUS.FAILED.name();
                //交易状态详见交易返回码说明
                /*0000:交易成功
                错误码为空: 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(例如30秒)查询交易
                1001:交易不存在
                2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易
                3开头的错误码代表交易失败
                3888-流水号重复
                3889-交易控制失败,具体原因看errmsg
                3099-渠道商户错误
                3014-交易金额小于应收手续费
                3031-校验实名信息失败
                3088-交易未支付(在查询时间区间内未成功支付,如已影响资金24小时内会做差错退款处理)
                3089-撤销异常,如已影响资金24小时内会做差错退款处理
                3045-其他错误,具体原因看errmsg
                3999-其他错误,具体原因看errmsg
                其他3开头的错误码代表交易失败,具体原因请读取errmsg
                */
                if ("0000".equals(trxstatus)){
                    status = Constants.PAYMENT_STATUS.SUCCESS.name();
                }
                UserPaymentDTO dto = new UserPaymentDTO();
                dto.setOrderId(orderId);
                dto.setTransactionId(transactionId);
                dto.setOutTradeNo(outTradeNo);
                dto.setOriginalXml(originalXml);
                dto.setPaymentAmountCallback(trxamt + "");
                dto.setStatus(status);
                saveCallbackInfo(dto, Constants.ORDER_STATUS_BACKEND.PAYMENT.name());
            }
        } catch (Exception e) {
            log.error("解析付款通知出错:{}", e.getMessage(), e);
        }
        return "success";
    }
    public void saveCallbackInfo(UserPaymentDTO dto, String orderStatus){
        String orderId = dto.getOrderId();
        boolean lock = lockService.getObjectLock(RedisLockService.LOCK_KEY_PAYMENT_NOTIFY_, orderId);
        if(!lock){
            return;
        }
        try {
            UserPayment up = userPaymentMapper.selectOne(
                    new QueryWrapper<UserPayment>().eq("order_id", orderId));
            BeanUtils.copyProperties(dto, up);
            up.setPaymentTimeCallback(LocalDateTime.now());
            userPaymentMapper.updateById(up);
            Order order = orderMapper.selectById(orderId);
            if(Constants.ORDER_STATUS_BACKEND.PAYMENT.name().equals(orderStatus)) {
                order.setPaymentTrId(dto.getTransactionId());
                if (up.getPaymentAmountCallback() != null) {
                    order.setPaymentAmount(new BigDecimal(up.getPaymentAmountCallback()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));//转换成单位元
                } else {
                    order.setPaymentAmount(order.getTotalAmount());
                }
                order.setPaymentTime(up.getPaymentTimeCallback());
                order.setStatus(Constants.ORDER_STATUS.SEND.name());
            } else if (Constants.ORDER_STATUS_BACKEND.CANCEL.name().equals(orderStatus)){
                order.setStatus(Constants.ORDER_STATUS.CANCEL.name());
            }
            order.setStatusBackend(orderStatus);
            orderMapper.updateById(order);
            if(Constants.ORDER_STATUS_BACKEND.PAYMENT.name().equals(orderStatus)) {
                postPayment(order);
            } else if (Constants.ORDER_STATUS_BACKEND.CANCEL.name().equals(orderStatus)){
                releasePrepayLock(order);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            lockService.releaseObjectLock(RedisLockService.LOCK_KEY_PAYMENT_NOTIFY_, orderId);
        }
    }
    private void postPayment(Order order){
        log.info("回调后处理订单信息:" + toJSONString(order));
        //创建配送单
        deliveryOrderService.createDeliveryOrder(order);
        flowerService.updateFlowerSales(order);
    }
    public boolean checkOrderStatusPayAgain(String outTradeNo) throws Exception {
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", outTradeNo));
        String s = up.getStatus();
        if(StringUtils.isNotEmpty(s)){
            return true;
        }
        SybPayService service = new SybPayService();
        Map<String,String> params = service.query(outTradeNo, up.getTransactionId());
        String originalXml = toJSONString(params);//回调请求内容
        log.info("message: " + originalXml);
        String transactionId = params.get("trxid");//通联收银宝交易流水号
        String orderId = outTradeNo;
        String trxcode = params.get("trxcode");
        /* 交易类型
        VSP501:微信支付
        VSP502:微信支付撤销
        VSP503:微信支付退款
        */
        String trxstatus = params.get("trxstatus");//支付状态
        if("VSP501".equals(trxcode)){
            if("0000".equals(trxstatus)) {
                String status = Constants.PAYMENT_STATUS.SUCCESS.name();
                UserPaymentDTO dto = new UserPaymentDTO();
                dto.setOrderId(orderId);
                dto.setTransactionId(transactionId);
                dto.setOutTradeNo(outTradeNo);
                dto.setOriginalXml(originalXml);
                String trxamtStr = params.get("trxamt");//交易金额 单位:分
                log.info("======trxamt: " + trxamtStr);
                dto.setPaymentAmountCallback(trxamtStr);
                dto.setStatus(status);
                String orderStatus = Constants.ORDER_STATUS_BACKEND.PAYMENT.name();
                saveCallbackInfo(dto, orderStatus);
                return true;
            }
        }
        return !("1001".equals(trxstatus) || StringUtils.isEmpty(trxstatus)
                || "2008".equals(trxstatus)
                || "2000".equals(trxstatus));
    }
    public boolean checkOrderStatusRefund(String outTradeNo) throws Exception {
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", outTradeNo));
        String s = up.getStatus();
        if(StringUtils.isEmpty(s)){
            return true;
        }
        SybPayService service = new SybPayService();
        Map<String,String> params = service.query(outTradeNo, up.getTransactionId());
        String originalXml = toJSONString(params);//回调请求内容
        log.info("message: " + originalXml);
        String trxcode = params.get("trxcode");
        /* 交易类型
        VSP501:微信支付
        VSP502:微信支付撤销
        VSP503:微信支付退款
        */
        if ("VSP502".equals(trxcode) || "VSP503".equals(trxcode)){
            String trxid = params.get("trxid");
            updateOrderRefund(outTradeNo, trxid);
            return true;
        }
        return false;
    }
    public void cancelOrder(String orderId) throws Exception {
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", orderId));
        if(StringUtils.isNotEmpty(up.getStatus())){
            throw new ValidationException("订单不可取消");
        }
        SybPayService service = new SybPayService();
        Map<String,String> params = service.query(orderId, up.getTransactionId());
        String retcode = params.get("retcode");
        if(!"SUCCESS".equals(retcode)){
            throw new ValidationException("查询订单交易状态失败: " + params.get("retmsg"));
        }
        String trxstatus = params.get("trxstatus");//支付状态
        if("1001".equals(trxstatus) || "3088".equals(trxstatus)){
            //3088-交易未支付(在查询时间区间内未成功支付,如已影响资金24小时内会做差错退款处理)
            //1001:交易不存在
            //直接取消
        } else if (StringUtils.isEmpty(trxstatus)
                || "2008".equals(trxstatus)
                || "2000".equals(trxstatus)) {
            String trxid = params.get("trxid");
            //2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易
            Map<String,String> map = service.close(trxid, orderId);
            log.info("======关闭订单结果" + toJSONString(map));
            retcode = map.get("retcode");
            if(!"SUCCESS".equals(retcode)){
                throw new ValidationException("调用通联关闭订单失败: " + map.get("retmsg"));
            }
            trxstatus = map.get("trxstatus");
            if(!"0000".equals(trxstatus)){
                throw new ValidationException("取消订单失败: " + map.get("errmsg"));
            }
        } else {
            throw new ValidationException("订单不可取消");
        }
        Order order = orderMapper.selectById(orderId);
        order.setStatus(Constants.ORDER_STATUS.CANCEL.name());
        order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.CANCEL.name());
        order.setCancelTime(LocalDateTime.now());
        order.update(SecurityUtils.getUserId());
        orderMapper.updateById(order);
        up.setStatus(Constants.PAYMENT_STATUS.CLOSED.name());
        up.update(SecurityUtils.getUserId());
        userPaymentMapper.updateById(up);
        releasePrepayLock(order);
    }
    private void releasePrepayLock(Order order){
        log.info("恢复库存 积分商品兑换券 优惠券: " + order);
        revertFlowerStock(order.getId());
        //恢复积分商品兑换券
        revertPointGoodsRecord(order.getId());
        //恢复优惠券
        String memberCouponId = order.getMemberCouponId();
        if(StringUtils.isNotEmpty(memberCouponId)) {
            couponRecordService.cancelCouponUsage(order.getId());
        }
    }
    private void revertPointGoodsRecord(String orderId){
        List<OrderPointGoods> ls = orderPointGoodsMapper.selectList(new QueryWrapper<OrderPointGoods>()
                .eq("order_id", orderId));
        if(ls != null && ls.size() > 0){
            for(OrderPointGoods pg : ls){
                pointGoodsService.revertExchangeGoods(pg.getGoodsRecordId());
            }
        }
    }
    public Map payAgain(String orderId){
        // 获取订单里面的商品是否有限购的,如果有则判断是否已经超过限购数量
        List<OrderItem> orderItemList = orderItemMapper.selectList(new QueryWrapper<OrderItem>()
                .eq("order_id", orderId));
        orderItemList.forEach(orderItem -> {
            // 限购数量 鲜花数量校验
            Integer completeNumToday=orderService.getFlowerCompleteNumToday(orderItem.getCreateBy(),orderItem.getFlowerId());
            Integer tmp=completeNumToday+orderItem.getNum();
            Flower flower=flowerMapper.selectById(orderItem.getFlowerId());
            if(null!=flower.getLimited() && tmp.compareTo(flower.getLimited())>0){
                throw new ValidationException("商品:'"+flower.getName()+"' 昨天17:00到今天17:00 超过限售数量:"+flower.getLimited()+"!");
            }
        });
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", orderId));
        if(StringUtils.isNotEmpty(up.getStatus())){
            throw new ValidationException("订单不可再支付");
        }
        return parseObject(up.getPrepayResponse(), TreeMap.class);
    }
    public synchronized void revertFlowerStock(String orderId){
        List<OrderItem> ls = orderItemMapper.selectList(new QueryWrapper<OrderItem>()
                .eq("order_id", orderId));
        for(OrderItem c : ls){
            flowerMapper.addFlowerStock(c.getFlowerId(), c.getNum());
        }
    }
    public void refundOrderCustomer(String orderId) throws Exception {
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", orderId));
        if(up.getPaymentAmount() == null){
            throw new ValidationException("订单不可退款");
        }
        long trxamt = prepareAmount(up.getPaymentAmount());
        String reqsn = orderId;
        String oldtrxid = up.getTransactionId();
        String oldreqsn = orderId;
        SybPayService service = new SybPayService();
        Map<String,String> map = service.cancel(trxamt, reqsn, oldtrxid, oldreqsn);
        String retcode = map.get("retcode");
        if(!"SUCCESS".equals(retcode)){
            throw new ValidationException("调用通联撤销接口失败: " + map.get("retmsg"));
        }
        //这个不是订单状态,是通用的,如果是支付查询,代表就是订单状态,如果是退款代表的是退款状态
        String trxstatus = map.get("trxstatus");
        if(!"0000".equals(trxstatus)){
            log.error("通联撤销交易失败:" + map.get("errmsg"));
            throw new ValidationException("订单退款交易失败:" + map.get("errmsg"));
        }
        updateOrderRefund(orderId, oldtrxid);
    }
    /**
     * 退款
     *
     * @param orderId
     */
    public void refundOrder(String orderId) throws Exception {
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", orderId));
        if(up.getPaymentAmount() == null){
            throw new ValidationException("订单不可退款");
        }
        long trxamt = prepareAmount(up.getPaymentAmount());
        String reqsn = orderId;
        String oldtrxid = up.getTransactionId();
        String oldreqsn = orderId;
        SybPayService service = new SybPayService();
        Map<String,String> map = service.refund(trxamt, reqsn, oldtrxid, oldreqsn);
        String retcode = map.get("retcode");
        if(!"SUCCESS".equals(retcode)){
            throw new ValidationException("调用通联退款失败: " + map.get("retmsg"));
        }
        //这个不是订单状态,是通用的,如果是支付查询,代表就是订单状态,如果是退款代表的是退款状态
        String trxstatus = map.get("trxstatus");
        if(!"0000".equals(trxstatus)){
            throw new ValidationException("订单退款交易失败:" + map.get("errmsg"));
        }
        updateOrderRefund(orderId, oldtrxid);
    }
    private void updateOrderRefund(String orderId, String refundNo){
        Order o = orderMapper.selectById(orderId);
        if(Constants.ORDER_STATUS.REFUND.name().equals(o.getStatus())){
            return;
        }
        o.setRefundAmount(o.getPaymentAmount());
        o.setRefundNo(refundNo);
        o.setRefundTime(LocalDateTime.now());
        o.setStatus(Constants.ORDER_STATUS.REFUND.name());
        o.setStatusBackend(Constants.ORDER_STATUS_BACKEND.REFUND.name());
        o.update("sys");
        orderMapper.updateById(o);
        deliveryOrderService.refundDelete(orderId);
        releasePrepayLock(o);
    }
    public String refundOrderSub(Order o, BigDecimal refundAmount) throws Exception {
        if(o.getPaymentTime() == null || o.getPaymentAmount() == null){
            throw new ValidationException("未支付订单不可退款");
        }
        if(o.getRefundTime() != null){
            throw new ValidationException("已全额退款订单不可退款");
        }
        if (refundAmount == null || refundAmount.doubleValue() == 0) {
            throw new ValidationException("退款金额不能为空");
        }
        List<OrderRefund> reLs = orderRefundMapper.selectList(new QueryWrapper<OrderRefund>()
                .eq("order_id", o.getId()));
        BigDecimal rra = new BigDecimal(0);
        if(reLs != null && reLs.size() > 0){
            for(OrderRefund r : reLs){
                rra = rra.add(r.getRefundAmount());
            }
        }
        long total = (long)prepareAmount(o.getPaymentAmount());
        long refund = (long)prepareAmount(refundAmount);
        long rraa = (long)prepareAmount(rra);
        if(rraa + refund > total){
            throw new ValidationException("退款金额不能大于订单金额");
        }
        OrderRefund re = new OrderRefund();
        re.setId(UUIDGenerator.getUUID());
        re.setOrderId(o.getId());
        re.setOrderAmount(o.getPaymentAmount());
        re.setRefundAmount(refundAmount);
        UserPayment up = userPaymentMapper.selectOne(
                new QueryWrapper<UserPayment>().eq("order_id", o.getId()));
        long trxamt = refund;
        String reqsn = o.getId();
        String oldtrxid = up.getTransactionId();
        String oldreqsn = null;
        SybPayService service = new SybPayService();
        Map<String,String> map = service.refund(trxamt, reqsn, oldtrxid, oldreqsn);
        String retcode = map.get("retcode");
        if(!"SUCCESS".equals(retcode)){
            throw new ValidationException("调用通联退款失败: " + map.get("retmsg"));
        }
        //这个不是订单状态,是通用的,如果是支付查询,代表就是订单状态,如果是退款代表的是退款状态
        String trxstatus = map.get("trxstatus");
        if(!"0000".equals(trxstatus)){
            throw new ValidationException("订单退款交易失败:" + map.get("errmsg"));
        }
        re.setRequest(toJSONString(map));
        re.create(SecurityUtils.getUserId());
        re.setStatus(retcode);
        re.setNotification(retcode);
        re.setNotifyTime(LocalDateTime.now());
        orderRefundMapper.insert(re);
        return re.getId();
    }
}
src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java
@@ -169,7 +169,7 @@
    @PostMapping("/order/commit")
    @ApiOperation(value = "提交订单")
    public ResponseEntity<ReturnDataDTO<?>> commitOrder(@RequestBody OrderCommitDTO dto){
    public ResponseEntity<ReturnDataDTO<?>> commitOrder(@RequestBody OrderCommitDTO dto) throws Exception {
        Map<Long, PriceDTO > priceMap = new HashMap<>();
        PreOrderDTO p = orderService.processPreOrderInfo(dto.getFlowers(), priceMap);
        Map map;
src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java
@@ -13,6 +13,7 @@
import com.mzl.flower.dto.response.payment.OrderListDTO;
import com.mzl.flower.entity.payment.Order;
import com.mzl.flower.service.payment.OrderService;
import com.mzl.flower.service.payment.UserPaymentSybService;
import com.mzl.flower.service.payment.UserPaymentV3Service;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -37,7 +38,7 @@
    private OrderService orderService;
    @Autowired
    private UserPaymentV3Service paymentV3Service;
    private UserPaymentSybService paymentSybService;
    @GetMapping("/list")
    @ApiOperation(value = "查询订单列表")
@@ -79,12 +80,12 @@
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query")
    })
    public ResponseEntity<ReturnDataDTO<?>> payAgain(String id){
        boolean f = paymentV3Service.checkOrderStatus(id, true);
    public ResponseEntity<ReturnDataDTO<?>> payAgain(String id) throws Exception {
        boolean f = paymentSybService.checkOrderStatusPayAgain(id);
        if(f){
            throw new ValidationException("订单不可再支付");
        }
        return returnData(R.SUCCESS.getCode(), paymentV3Service.payAgain(id));
        return returnData(R.SUCCESS.getCode(), paymentSybService.payAgain(id));
    }
    @GetMapping(value = "/refund")
@@ -92,20 +93,15 @@
            @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query"),
    })
    @ApiOperation(value = "退款")
    public ResponseEntity<ReturnDataDTO> refundOrder(String id) {
    public ResponseEntity<ReturnDataDTO> refundOrder(String id) throws Exception {
        orderService.refundCheck(id);
        paymentV3Service.refundOrder(id);
        boolean f = paymentSybService.checkOrderStatusRefund(id);
        if(f) {
            throw new ValidationException("订单不可退款");
        }
        paymentSybService.refundOrderCustomer(id);
        return returnData(R.SUCCESS.getCode(), null);
    }
    /*@GetMapping(value = "/refund/check")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query"),
    })
    @ApiOperation(value = "查询退款")
    public ResponseEntity<ReturnDataDTO> refundQuery(String id) {
        return returnData(R.SUCCESS.getCode(), paymentV3Service.refundQuery(id));
    }*/
    @PostMapping("/evaluate")
    @ApiOperation(value = "评价")
@@ -131,11 +127,8 @@
            @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query"),
    })
    @ApiOperation(value = "取消订单")
    public ResponseEntity<ReturnDataDTO> cancelOrder(String id) {
        boolean f = paymentV3Service.checkOrderStatus(id);
        if(!f){
            paymentV3Service.cancelOrder(id);
        }
    public ResponseEntity<ReturnDataDTO> cancelOrder(String id) throws Exception {
        paymentSybService.cancelOrder(id);
        return returnData(R.SUCCESS.getCode(), null);
    }
src/main/java/com/mzl/flower/web/payment/OrderController.java
@@ -11,7 +11,7 @@
import com.mzl.flower.dto.response.payment.*;
import com.mzl.flower.service.payment.DeliveryOrderService;
import com.mzl.flower.service.payment.OrderService;
import com.mzl.flower.service.payment.UserPaymentV3Service;
import com.mzl.flower.service.payment.UserPaymentSybService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -36,7 +36,7 @@
    private OrderService orderService;
    @Autowired
    private UserPaymentV3Service paymentV3Service;
    private UserPaymentSybService paymentSybService;
    @Autowired
    private DeliveryOrderService deliveryOrderService;
@@ -88,7 +88,7 @@
    @GetMapping("/list/abnormal/process")
    @ApiOperation(value = "异常订单处理(不管有没有退款金额,建议都要处理)")
    public ResponseEntity<ReturnDataDTO> processLevelDown(String id) {
    public ResponseEntity<ReturnDataDTO> processLevelDown(String id) throws Exception {
        orderService.processAbnormalOrder(id);
        return returnData(R.SUCCESS.getCode(), null);
    }
@@ -175,9 +175,9 @@
            @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query"),
    })
    @ApiOperation(value = "退款")
    public ResponseEntity<ReturnDataDTO> refundOrder(String id) {
    public ResponseEntity<ReturnDataDTO> refundOrder(String id) throws Exception {
        orderService.refundCheckAdmin(id);
        paymentV3Service.refundOrder(id);
        paymentSybService.refundOrder(id);
        return returnData(R.SUCCESS.getCode(), null);
    }
src/main/java/com/mzl/flower/web/payment/PaymentCallBackSybResource.java
对比新文件
@@ -0,0 +1,28 @@
package com.mzl.flower.web.payment;
import com.mzl.flower.service.payment.UserPaymentSybService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/api/ua/notify/syb")
@Slf4j
public class PaymentCallBackSybResource {
    @Autowired
    private UserPaymentSybService paymentSybService;
    @RequestMapping(value = "/paid", method = RequestMethod.POST)
    @ResponseBody
    public String handlePayCallback(HttpServletRequest request) {
        log.info("通联回调");
        return paymentSybService.handlePayCallback(request);
    }
}
src/main/java/com/mzl/flower/web/payment/SalesController.java
@@ -70,7 +70,7 @@
    @PostMapping("/audit/agree")
    @ApiOperation(value = "审核售后单-通过")
    public ResponseEntity<ReturnDataDTO> agree(@RequestBody OrderItemSalesAuditDTO dto) {
    public ResponseEntity<ReturnDataDTO> agree(@RequestBody OrderItemSalesAuditDTO dto) throws Exception {
        OrderItem oi = salesService.doAudit(dto, Constants.ORDER_SALES_STATUS.AGREED.name());
        orderItemSettlementService.saveItemSettlementInfo(oi, SecurityUtils.getUserId(), Constants.S_TYPE.SALES);
        return returnData(R.SUCCESS.getCode(), null);
@@ -78,7 +78,7 @@
    @PostMapping("/audit/reject")
    @ApiOperation(value = "审核售后单-拒绝")
    public ResponseEntity<ReturnDataDTO> reject(@RequestBody OrderItemSalesAuditDTO dto) {
    public ResponseEntity<ReturnDataDTO> reject(@RequestBody OrderItemSalesAuditDTO dto) throws Exception {
        salesService.doAudit(dto, Constants.ORDER_SALES_STATUS.REJECTED.name());
        return returnData(R.SUCCESS.getCode(), null);
    }
src/main/resources/application-dev.yml
@@ -51,4 +51,7 @@
upload:
  fileServerPath: http://47.99.58.211/files
  fileGroup: /group1
  localServerPath: /data/files
  localServerPath: /data/files
syb:
  callBackUrl: http://47.99.58.211
src/main/resources/application-local.yml
@@ -51,4 +51,7 @@
upload:
  fileServerPath: http://47.99.58.211/files
  fileGroup: /group1
  localServerPath: /data/files
  localServerPath: /data/files
syb:
  callBackUrl: http://47.99.58.211
src/main/resources/application-prod.yml
@@ -61,4 +61,7 @@
upload:
  fileServerPath: https://www.hmyxianhua.com/files
  fileGroup: /group1
  localServerPath: /data/files
  localServerPath: /data/files
syb:
  callBackUrl: https://www.hmyxianhua.com
src/main/resources/application-test.yml
@@ -51,4 +51,7 @@
upload:
  fileServerPath: http://47.99.58.211/files
  fileGroup: /group1
  localServerPath: /data/files
  localServerPath: /data/files
syb:
  callBackUrl: http://47.99.58.211