From c6a6f44907b37efe3f2e21b9d8f9350897fa92c0 Mon Sep 17 00:00:00 2001 From: xin <1099200748@qq.com> Date: Mon, 07 Jul 2025 16:41:20 +0800 Subject: [PATCH] 小程序:提交订单(完善) --- oying-system/src/main/resources/config/application-dev.yml | 4 /dev/null | 35 -------- oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java | 13 +- oying-common/src/main/java/com/oying/utils/SecurityUtils.java | 12 +++ oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java | 55 +++++++++++++ oying-system/src/main/java/com/oying/modules/sh/domain/Order.java | 2 oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java | 2 oying-system/src/main/resources/config/application-prod.yml | 21 ++-- oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java | 43 ++++++++++ 9 files changed, 129 insertions(+), 58 deletions(-) diff --git a/oying-common/src/main/java/com/oying/utils/SecurityUtils.java b/oying-common/src/main/java/com/oying/utils/SecurityUtils.java index f6fc90d..fed67c5 100644 --- a/oying-common/src/main/java/com/oying/utils/SecurityUtils.java +++ b/oying-common/src/main/java/com/oying/utils/SecurityUtils.java @@ -75,6 +75,18 @@ } /** + * 获取当前用户openid + * + * @return / + */ + public static String getCurrentOpenid() { + UserDetails userDetails = getCurrentUser(); + // 将 Java 对象转换为 JSONObject 对象 + JSONObject jsonObject = (JSONObject) JSON.toJSON(userDetails); + return jsonObject.getJSONObject("user").getString("openid"); + } + + /** * 获取用户ID * @return 系统用户ID */ diff --git a/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java b/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java new file mode 100644 index 0000000..69718a4 --- /dev/null +++ b/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java @@ -0,0 +1,43 @@ +package com.oying.utils.enums; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrderStatusEnum { + ZERO(0, "订单已提交"), + ONE(1, "支付成功"), + TWO(2, "商家已接单"), + THREE(3, "骑手已接单"), + FOUR(4, "商家已接单"), + FIVE(5, "商家已备货"), + SIX(6, "骑手已到店"), + SEVEN(7, "骑手已取货"), + EIGHT(8, "商品已送达"), + NINE(9, "订单已完成"), + UNKNOWN(99, "未知枚举"); + + private final Integer key; + + private final String value; + + public static OrderStatusEnum find(Integer val) { + for (OrderStatusEnum value : OrderStatusEnum.values()) { + if (val.equals(value.getKey())) { + return value; + } + } + return UNKNOWN; + } + + public static String getValue(Integer val) { + for (OrderStatusEnum value : OrderStatusEnum.values()) { + if (val.equals(value.getKey())) { + return value.getValue(); + } + } + return UNKNOWN.getValue(); + } +} diff --git a/oying-common/src/main/java/com/oying/utils/enums/StatusEnum.java b/oying-common/src/main/java/com/oying/utils/enums/StatusEnum.java deleted file mode 100644 index f4bcd2e..0000000 --- a/oying-common/src/main/java/com/oying/utils/enums/StatusEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.oying.utils.enums; - - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum StatusEnum { - ZERO("0", "停用"), - ONE("1", "通过"), - THREE("2", "未知"); - - private final String key; - - private final String value; - - public static StatusEnum find(String val) { - for (StatusEnum value : StatusEnum.values()) { - if (val.equals(value.getKey())) { - return value; - } - } - return THREE; - } - - public static String getValue(String val) { - for (StatusEnum value : StatusEnum.values()) { - if (val.equals(value.getKey())) { - return value.getValue(); - } - } - return THREE.getValue(); - } -} diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java b/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java index 69a269d..20be22e 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/SwiftPassService.java @@ -24,7 +24,7 @@ * @see [类、类#方法、类#成员] */ HwcResponse pay(String ip, String total, String timeExpire, String description, String openId, - String orderNum, PayTypeEnum status) throws IOException; + String orderNum, PayTypeEnum status); /** * <一句话功能简述> diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java index c255e3f..e300f79 100644 --- a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/SwiftPassServiceImpl.java @@ -11,6 +11,7 @@ import com.oying.modules.security.config.WeiXinProperties; import com.oying.modules.sh.service.OrderReturnService; import com.oying.modules.sh.service.OrderService; +import com.oying.utils.CloseUtil; import com.oying.utils.enums.PayTypeEnum; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -54,7 +55,7 @@ @Override @Transactional(rollbackFor = Exception.class) public HwcResponse pay(String ip, String total, String timeExpire, String description, String openId, - String orderNum, PayTypeEnum status) throws IOException { + String orderNum, PayTypeEnum status) { SortedMap<String, String> map = new TreeMap<>(); map.put("service", service_pay); map.put("version", version); @@ -117,15 +118,15 @@ throw new BadRequestException("操作失败"); } } catch (Exception e) { - log.error("请求参数:{}", params); - log.error("返回参数:{}", resultMap); - throw new BadRequestException("系统异常:" + e.getMessage()); + log.error("汇旺财下单错误请求参数:{}", params); + log.error("汇旺财下单错误返回参数:{}", resultMap); + throw new BadRequestException("汇旺财下单错误:" + e.getMessage()); } finally { if (response != null) { - response.close(); + CloseUtil.close(response); } if (client != null) { - client.close(); + CloseUtil.close(client); } } } diff --git a/oying-system/src/main/java/com/oying/modules/sh/domain/Order.java b/oying-system/src/main/java/com/oying/modules/sh/domain/Order.java index 649bef2..d1893bd 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/domain/Order.java +++ b/oying-system/src/main/java/com/oying/modules/sh/domain/Order.java @@ -91,7 +91,7 @@ private String payTime; @NotBlank - @ApiModelProperty(value = "订单失效时间RFC3339") + @ApiModelProperty(value = "订单失效时间") private String expireTime; @NotBlank diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java index fa8fdea..82885bb 100644 --- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java +++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java @@ -2,10 +2,13 @@ import com.alibaba.fastjson2.JSONObject; import com.oying.exception.BadRequestException; +import com.oying.modules.hwc.domain.HwcResponse; import com.oying.modules.hwc.service.SwiftPassService; import com.oying.modules.pc.product.domain.Product; import com.oying.modules.pc.product.domain.enums.ProductStatusEnum; import com.oying.modules.pc.product.service.ProductService; +import com.oying.modules.pc.store.domain.Store; +import com.oying.modules.pc.store.service.StoreService; import com.oying.modules.sh.domain.Order; import com.oying.modules.sh.domain.OrderProductSnapshot; import com.oying.modules.sh.domain.request.GeneratorOrder; @@ -17,6 +20,7 @@ import com.oying.modules.sh.service.UserAddressService; import com.oying.utils.*; import com.oying.utils.enums.GenerateEnum; +import com.oying.utils.enums.OrderStatusEnum; import com.oying.utils.enums.PayStateEnum; import com.oying.utils.enums.PayTypeEnum; import lombok.RequiredArgsConstructor; @@ -50,6 +54,8 @@ private final SwiftPassService swiftPassService; private final OrderProductSnapshotService productSnapshotService; private final RedisUtils redisUtils; + private final StoreService storeService; + private final static String DESCRIBE = "哦应:"; @Override public PageResult<Order> queryAll(OrderQueryCriteria criteria, Page<Object> page) { @@ -98,12 +104,55 @@ snapshot.setPayState(PayStateEnum.NOTPAY.getKey()); snapshots.add(snapshot); } + Timestamp now = DateUtil.getTimeStamp(); // 下单后30分钟失效 - Timestamp time = DateUtil.addMinute(DateUtil.getTimeStamp(), 30); + Timestamp time = DateUtil.addMinute(now, 30); String expire = DateUtil.localDateTimeFormat(time.toLocalDateTime(), DateUtil.SDF_YMDHMS); - swiftPassService.pay(StringUtils.getIp(request), BigDecimalUtils.yuanToCents(amount).toString(), expire,SecurityUtils.getCurrentUserId()); + String openid = SecurityUtils.getCurrentOpenid(); + if (openid == null || openid.isEmpty()) { + throw new BadRequestException("OPENID错误"); + } + // 订单信息 + Order order = new Order(); + order.setOrderNum(orderNum); + order.setOrderStatus(OrderStatusEnum.ZERO.getKey()); + order.setOrderStatusDescribe(OrderStatusEnum.ZERO.getValue()); + order.setUserId(SecurityUtils.getCurrentUserId()); + order.setUsername(SecurityUtils.getCurrentUsername()); + Store store = storeService.getMerchantStore(submit.getStoreId()); + order.setStoreId(submit.getStoreId()); + order.setStoreName(store.getStoreName()); + order.setStoreLogo(store.getLogoImageUrl()); + order.setOrderDescribe(DESCRIBE + submit.getStoreId()); + order.setOriginalPrice(amount); + order.setPaidPrice(amount); + order.setActuallyPayPrice(amount); + order.setOpenid(openid); + order.setPayType(submit.getPayType().getKey()); + order.setExpireTime(expire); + order.setOpenid(openid); + Long total = BigDecimalUtils.yuanToCents(amount); + if (total > 0) { + HwcResponse response = swiftPassService.pay(StringUtils.getIp(request), total.toString(), expire, + DESCRIBE + submit.getStoreId(), openid, orderNum, submit.getPayType()); + //微信支付下单放回值 + order.setAppId(response.getAppId()); + order.setTimestamp(response.getTimeStamp()); + order.setNonceStr(response.getNonceStr()); + order.setPackageVal(response.getPackageVal()); + order.setSignType(response.getSignType()); + order.setPaySign(response.getPaySign()); + order.setPayState(PayStateEnum.NOTPAY.getKey()); + order.setPayMessage(PayStateEnum.NOTPAY.getValue()); + order.setPayTime(null); + } else { + order.setPayState(PayStateEnum.SUCCESS.getKey()); + order.setPayMessage(PayStateEnum.SUCCESS.getValue()); + order.setPayTime(DateUtil.localDateTimeFormat(now.toLocalDateTime(), DateUtil.SDF_YMDHMS)); + } + orderMapper.insert(order); productSnapshotService.saveBatch(snapshots); - return null; + return order; } @Override diff --git a/oying-system/src/main/resources/config/application-dev.yml b/oying-system/src/main/resources/config/application-dev.yml index b48be65..4aa5a20 100644 --- a/oying-system/src/main/resources/config/application-dev.yml +++ b/oying-system/src/main/resources/config/application-dev.yml @@ -167,9 +167,9 @@ # 请求url req-url: https://pay.hstypay.com/v2/pay/gateway # 支付通知地址 - notify-url: http://1.95.124.88:8088/api/swiftPass/alipayCallback + notify-url: http://1.95.124.88:8088/oying/api/swiftPass/alipayCallback # 退款通知地址 - refund-url: https://1.95.124.88:8088/api/swiftPass/returnNotify + refund-url: https://1.95.124.88:8088/oying/api/swiftPass/returnNotify obs: access_key_id: RZ1UIOZDZ58DD4NWPD6Q diff --git a/oying-system/src/main/resources/config/application-prod.yml b/oying-system/src/main/resources/config/application-prod.yml index ab56135..57f5446 100644 --- a/oying-system/src/main/resources/config/application-prod.yml +++ b/oying-system/src/main/resources/config/application-prod.yml @@ -93,6 +93,8 @@ online-key: "online_token:" # 验证码 code-key: "captcha_code:" + # 自定义redis key + generate-order-sn: oying:generate:sn # token 续期检查时间范围(默认30分钟,单位默认毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 detect: 1800000 # 续期时间范围,默认 1小时,这里单位毫秒 @@ -127,6 +129,7 @@ # 文件大小 /M maxSize: 100 avatarMaxSize: 5 + # 短信验证码key 时间 sms: key: oying-sms-key- @@ -158,28 +161,26 @@ # 汇旺财 swift-pass: - # 密钥1 - key: qqqqqqqqqqqqqqqqqqqq + # 密钥 + key: vJB6683s4NtQtXBgHTvE1hWOUtcre7nj # 私钥 - mch-private-key: qqqqqqqqqqqq + mch-private-key: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC2YNuGqSAFcIVOc9mnmIbnVfQoyyMBoyGqTD3beiy/UsXZrGF4OIrPEevwXnwHktURupjHAKvt92PL4L9wTz7cknaQkF0NH5saOdY3sL88xH7F3qSgIwHPvkRileFeEHx+pKnXBms8yiliDqPk0MV3iRRoXKhRnojrWAYJhyz+1iJ13qWXCWcpr9hf77Uu/r1N7wsJKN4Z75M2qQC6LgRTaHoBroLGVtld4PM30ee6o9RR8yiFVx4FDVukinGR15nTsrNh+sUx3piVXqYrq23UPjUWVtJlf9cEvfNVXCMsa71LGEzUl0zxDfeyXRQhel3E27p2oovEYvhl5s+pZhtXAgMBAAECggEBAKXZLKinccwgh8lRBrQmuz7x5ieWms3pWDryPCozTy/pCKyq2rQlzu0BIiqi8W09tG773eTSEodDOkhzqANsvQB+XD2YWlYN0NEnmUtpem67TYGItvI9A2+0WaHBJIGSwnO0MBKu7qQIP1vBbn8s7vWF/b3tzM70ORSzJkJR37QY435+ZG9rKMKyL/tuGW7E5AgrHmyl2aK9me3vgUrZct2e9l5XLrn9oU1niEmbDbFARhphXDCEPIvFiu7WtFDBmp/jEOc4u/y/sYMjS1RWpO9iOyTZDO8Mi9iofXugmoot4Tn0lBckeR6YVRb/I3EcVADoMfk1iaN1aWv1u+Ska8ECgYEA3ZFYMvo5y7SztrEbyLpWGsp6aM4a5ght8p52/rFhSHD5CGS7Uywhp4LxxIjLTRBNa/UkBzOq1Xt1+PVDNHf0E1yYZqEv9OXWC0yiCsnwO6b7o9hc3VnnX4jw7FkS0+pjfgCK4/A9hFj9xUI+qX3L3+pOCseioUeYofqTc2bn7ncCgYEA0rhvvNO30EisLACdOIem8XgbL4LjKJ47FnYS/TEZ9cDhJW5G2pAxgyFsqhN/GuTVg8uSQ7a6PlcBxzTuOwdZg05RcCAdmsXUdGjVbKk2i4CBp0K1j4QYfr8Wt18x0RLfzIQDrZQajWssVGjo8sfMn8qmjbRNbMmokRTflGIkEiECgYEAxChaYn9fzbYEaRixlWtKsdtSthjKfZ8239ZlWSVnEEBcaY7svTzT6r6mFq5Y9rgZIxvbsriOZQQxtKBGyFvubXnLvwizMWiNsGE/ELgphFZYcH0r8hgXHGBbk5NkdNMNFE+cpyJZBCPZP9tfKKUjavC/+RE3LPv66GS0SDXx3g8CgYAYOIT3cmqFcWUA5c0si0MgLEsLqgLMT2vBSC8klTlDqzj14XgZdUuLpBLmdbk9cSIttP+J8v3zXnLg3++mL1EVq7HmrnpYqPajrs0hYU3YuRuuCxfteCSMpRBKYZHLU10QF/iIQibPLIt65FgqV9boYxXD4f6oS4Gps3mDh8hXoQKBgBKojPBWgp4/WBMfh8nUzFzTiW7ACyG2jAxGtu0dtqfwx2LkesUKGhD1JGlxdDQ6jSv9tbhAgbZjTAULSo03626ZaiSDF+nCwFsobd3wRiij8LiL9amW5t6XBeX6bS5SCh45GbgnNBtzBqUI19/CGH09YXNpCYnADsY4fab4wNpR # 公钥 - plat-public-key: qqqqq - # 门店编号1 - mch-id: 1111 + plat-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtmDbhqkgBXCFTnPZp5iG51X0KMsjAaMhqkw923osv1LF2axheDiKzxHr8F58B5LVEbqYxwCr7fdjy+C/cE8+3JJ2kJBdDR+bGjnWN7C/PMR+xd6koCMBz75EYpXhXhB8fqSp1wZrPMopYg6j5NDFd4kUaFyoUZ6I61gGCYcs/tYidd6llwlnKa/YX++1Lv69Te8LCSjeGe+TNqkAui4EU2h6Aa6CxlbZXeDzN9HnuqPUUfMohVceBQ1bpIpxkdeZ07KzYfrFMd6YlV6mK6tt1D41FlbSZX/XBL3zVVwjLGu9SxhM1JdM8Q33sl0UIXpdxNu6dqKLxGL4ZebPqWYbVwIDAQAB + # 门店编号 + mch-id: 1030238092 # 签名方式 sign-type: MD5 # 原生JS is-raw: 1 # 是否小程序支付 is-minipg: 1 - # AppID - app-id: wx2273296a5569cbad # 请求url req-url: https://pay.hstypay.com/v2/pay/gateway # 支付通知地址 - notify-url: https://localhost/oying/api/swiftPass/alipayCallback + notify-url: http://1.95.124.88:8088/oying/api/swiftPass/alipayCallback # 退款通知地址 - refund-url: https://localhost/oying/api/swiftPass/returnNotify + refund-url: https://1.95.124.88:8088/oying/api/swiftPass/returnNotify obs: access_key_id: RZ1UIOZDZ58DD4NWPD6Q -- Gitblit v1.9.3