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