From 58a8acceb63d52377da4b837e859f2e03d2bce1b Mon Sep 17 00:00:00 2001 From: gongzuming <gongzuming> Date: 星期一, 14 十月 2024 08:44:40 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v3' into master-v2 --- src/main/resources/application-local.yml | 5 src/main/java/com/mzl/flower/config/SybPaymentProperties.java | 13 src/main/java/com/mzl/flower/service/payment/OrderSalesService.java | 6 src/main/java/com/mzl/flower/web/payment/OrderController.java | 10 src/main/java/com/mzl/flower/service/payment/OrderService.java | 33 + src/main/java/com/mzl/flower/schedule/ScheduleService.java | 8 src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java | 33 - src/main/resources/application-prod.yml | 5 src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java | 4 src/main/resources/application-test.yml | 5 src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java | 2 src/main/java/com/mzl/flower/pay/SybConstants.java | 2 src/main/java/com/mzl/flower/pay/SybPayService.java | 175 ++++++---- src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java | 6 src/main/java/com/mzl/flower/web/payment/SalesController.java | 4 src/main/java/com/mzl/flower/service/payment/UserPaymentSybService.java | 600 +++++++++++++++++++++++++++++++++++++ src/main/resources/application-dev.yml | 5 src/main/java/com/mzl/flower/web/payment/PaymentCallBackSybResource.java | 28 + 18 files changed, 812 insertions(+), 132 deletions(-) diff --git a/src/main/java/com/mzl/flower/config/SybPaymentProperties.java b/src/main/java/com/mzl/flower/config/SybPaymentProperties.java new file mode 100644 index 0000000..ebf4a00 --- /dev/null +++ b/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; +} diff --git a/src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java b/src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java index 01b0f42..4cb8a5a 100644 --- a/src/main/java/com/mzl/flower/pay/HttpConnectionUtil.java +++ b/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); } diff --git a/src/main/java/com/mzl/flower/pay/SybConstants.java b/src/main/java/com/mzl/flower/pay/SybConstants.java index 76dfde8..91a9ce8 100644 --- a/src/main/java/com/mzl/flower/pay/SybConstants.java +++ b/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"; diff --git a/src/main/java/com/mzl/flower/pay/SybPayService.java b/src/main/java/com/mzl/flower/pay/SybPayService.java index 8dc5e9e..0de4250 100644 --- a/src/main/java/com/mzl/flower/pay/SybPayService.java +++ b/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("返回数据错误"); diff --git a/src/main/java/com/mzl/flower/schedule/ScheduleService.java b/src/main/java/com/mzl/flower/schedule/ScheduleService.java index 765abb7..1cf50e6 100644 --- a/src/main/java/com/mzl/flower/schedule/ScheduleService.java +++ b/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); diff --git a/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java b/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java index 1be4b9b..7fddc66 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java +++ b/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); } } diff --git a/src/main/java/com/mzl/flower/service/payment/OrderSalesService.java b/src/main/java/com/mzl/flower/service/payment/OrderSalesService.java index 684d00b..00b8b8f 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderSalesService.java +++ b/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()){ diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java index 47f3acb..75ffe19 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/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()); diff --git a/src/main/java/com/mzl/flower/service/payment/UserPaymentSybService.java b/src/main/java/com/mzl/flower/service/payment/UserPaymentSybService.java new file mode 100644 index 0000000..39da81a --- /dev/null +++ b/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(); + } + +} diff --git a/src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java b/src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java index e29a410..1062f85 100644 --- a/src/main/java/com/mzl/flower/web/customer/FlowerCustomerController.java +++ b/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; diff --git a/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java b/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java index a18d47f..4247628 100644 --- a/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java +++ b/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); } diff --git a/src/main/java/com/mzl/flower/web/payment/OrderController.java b/src/main/java/com/mzl/flower/web/payment/OrderController.java index 0d9d2d6..5b60475 100644 --- a/src/main/java/com/mzl/flower/web/payment/OrderController.java +++ b/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); } diff --git a/src/main/java/com/mzl/flower/web/payment/PaymentCallBackSybResource.java b/src/main/java/com/mzl/flower/web/payment/PaymentCallBackSybResource.java new file mode 100644 index 0000000..4c09a10 --- /dev/null +++ b/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); + } + +} diff --git a/src/main/java/com/mzl/flower/web/payment/SalesController.java b/src/main/java/com/mzl/flower/web/payment/SalesController.java index 32cac36..597b9ad 100644 --- a/src/main/java/com/mzl/flower/web/payment/SalesController.java +++ b/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); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e4c8c1d..8163949 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -51,4 +51,7 @@ upload: fileServerPath: http://47.99.58.211/files fileGroup: /group1 - localServerPath: /data/files \ No newline at end of file + localServerPath: /data/files + +syb: + callBackUrl: http://47.99.58.211 \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 1366594..d745545 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -51,4 +51,7 @@ upload: fileServerPath: http://47.99.58.211/files fileGroup: /group1 - localServerPath: /data/files \ No newline at end of file + localServerPath: /data/files + +syb: + callBackUrl: http://47.99.58.211 \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 34806f4..c5405ea 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -61,4 +61,7 @@ upload: fileServerPath: https://www.hmyxianhua.com/files fileGroup: /group1 - localServerPath: /data/files \ No newline at end of file + localServerPath: /data/files + +syb: + callBackUrl: https://www.hmyxianhua.com \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index e57b439..2128ba9 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -51,4 +51,7 @@ upload: fileServerPath: http://47.99.58.211/files fileGroup: /group1 - localServerPath: /data/files \ No newline at end of file + localServerPath: /data/files + +syb: + callBackUrl: http://47.99.58.211 \ No newline at end of file -- Gitblit v1.9.3