diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/controller/PayOrderController.java b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/controller/PayOrderController.java index 16e0ef0..df87f0f 100644 --- a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/controller/PayOrderController.java +++ b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/controller/PayOrderController.java @@ -1,27 +1,31 @@ package com.ruoyi.pay.controller; import java.util.List; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.service.IPayOrderService; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.ruoyi.pay.utils.SnowflakeIdWorker; + import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; /** * 订单Controller @@ -37,6 +41,9 @@ public class PayOrderController extends BaseController @Autowired private IPayOrderService payOrderService; + @Autowired + private SnowflakeIdWorker snowflakeidworker; + /** * 查询订单列表 */ @@ -84,6 +91,8 @@ public class PayOrderController extends BaseController @PostMapping public AjaxResult add(@RequestBody PayOrder payOrder) { + payOrder.setUserId(getUserId()); + payOrder.setOrderNumber(snowflakeidworker.nextId().toString()); return toAjax(payOrderService.insertPayOrder(payOrder)); } diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/mapper/PayOrderMapper.java b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/mapper/PayOrderMapper.java index fc74207..73bdcb6 100644 --- a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/mapper/PayOrderMapper.java +++ b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/mapper/PayOrderMapper.java @@ -1,6 +1,7 @@ package com.ruoyi.pay.mapper; import java.util.List; + import com.ruoyi.pay.domain.PayOrder; /** @@ -19,6 +20,14 @@ public interface PayOrderMapper */ public PayOrder selectPayOrderByOrderId(Long orderId); + /** + * 查询订单 + * + * @param orderNumber 订单号 + * @return 订单集合 + */ + public PayOrder selectPayOrderByOrderNumber(String orderNumber); + /** * 查询订单列表 * diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/IPayOrderService.java b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/IPayOrderService.java index fb4d424..332c466 100644 --- a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/IPayOrderService.java +++ b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/IPayOrderService.java @@ -1,6 +1,7 @@ package com.ruoyi.pay.service; import java.util.List; + import com.ruoyi.pay.domain.PayOrder; /** @@ -9,8 +10,7 @@ import com.ruoyi.pay.domain.PayOrder; * @author ruoyi * @date 2024-02-15 */ -public interface IPayOrderService -{ +public interface IPayOrderService { /** * 查询订单 * @@ -19,6 +19,14 @@ public interface IPayOrderService */ public PayOrder selectPayOrderByOrderId(Long orderId); + /** + * 查询订单 + * + * @param orderNumber 订单号 + * @return 订单集合 + */ + public PayOrder selectPayOrderByOrderNumber(String orderNumber); + /** * 查询订单列表 * diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/impl/PayOrderServiceImpl.java b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/impl/PayOrderServiceImpl.java index 3c271ce..fd0820b 100644 --- a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/impl/PayOrderServiceImpl.java +++ b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/service/impl/PayOrderServiceImpl.java @@ -1,10 +1,12 @@ package com.ruoyi.pay.service.impl; import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.pay.mapper.PayOrderMapper; + import com.ruoyi.pay.domain.PayOrder; +import com.ruoyi.pay.mapper.PayOrderMapper; import com.ruoyi.pay.service.IPayOrderService; /** @@ -14,8 +16,7 @@ import com.ruoyi.pay.service.IPayOrderService; * @date 2024-02-15 */ @Service -public class PayOrderServiceImpl implements IPayOrderService -{ +public class PayOrderServiceImpl implements IPayOrderService { @Autowired private PayOrderMapper payOrderMapper; @@ -26,11 +27,21 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 订单 */ @Override - public PayOrder selectPayOrderByOrderId(Long orderId) - { + public PayOrder selectPayOrderByOrderId(Long orderId) { return payOrderMapper.selectPayOrderByOrderId(orderId); } + /** + * 查询订单 + * + * @param orderNumber 订单号 + * @return 订单集合 + */ + @Override + public PayOrder selectPayOrderByOrderNumber(String orderNumber) { + return payOrderMapper.selectPayOrderByOrderNumber(orderNumber); + } + /** * 查询订单列表 * @@ -38,8 +49,7 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 订单 */ @Override - public List selectPayOrderList(PayOrder payOrder) - { + public List selectPayOrderList(PayOrder payOrder) { return payOrderMapper.selectPayOrderList(payOrder); } @@ -50,8 +60,7 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 结果 */ @Override - public int insertPayOrder(PayOrder payOrder) - { + public int insertPayOrder(PayOrder payOrder) { return payOrderMapper.insertPayOrder(payOrder); } @@ -62,8 +71,7 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 结果 */ @Override - public int updatePayOrder(PayOrder payOrder) - { + public int updatePayOrder(PayOrder payOrder) { return payOrderMapper.updatePayOrder(payOrder); } @@ -74,8 +82,7 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 结果 */ @Override - public int deletePayOrderByOrderIds(Long[] orderIds) - { + public int deletePayOrderByOrderIds(Long[] orderIds) { return payOrderMapper.deletePayOrderByOrderIds(orderIds); } @@ -86,8 +93,7 @@ public class PayOrderServiceImpl implements IPayOrderService * @return 结果 */ @Override - public int deletePayOrderByOrderId(Long orderId) - { + public int deletePayOrderByOrderId(Long orderId) { return payOrderMapper.deletePayOrderByOrderId(orderId); } } diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/utils/SnowflakeIdWorker.java b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/utils/SnowflakeIdWorker.java new file mode 100644 index 0000000..47c22b3 --- /dev/null +++ b/ruoyi-pay/ruoyi-pay-common/src/main/java/com/ruoyi/pay/utils/SnowflakeIdWorker.java @@ -0,0 +1,79 @@ +package com.ruoyi.pay.utils; + +import org.springframework.stereotype.Component; + +@Component +public class SnowflakeIdWorker { + // 开始时间戳(2015-01-01) + private final long twepoch = 1420041600000L; + // 机器id所占的位数 + private final long workerIdBits = 5L; + // 数据标识id所占的位数 + private final long datacenterIdBits = 5L; + // 支持的最大机器id,结果是31(二进制:11111) + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 支持的最大数据标识id,结果是31(二进制:11111) + private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + // 序列在id中占的位数 + private final long sequenceBits = 12L; + // 机器ID向左移12位 + private final long workerIdShift = sequenceBits; + // 数据标识id向左移17位(12+5) + private final long datacenterIdShift = sequenceBits + workerIdBits; + // 时间戳向左移22位(5+5+12) + private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + // 生成序列的掩码,这里为4095(二进制:111111111111) + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + // 工作机器ID(0~31) + private long workerId; + // 数据中心ID(0~31) + private long datacenterId; + // 毫秒内序列(0~4095) + private long sequence = 0L; + // 上次生成ID的时间戳 + private long lastTimestamp = -1L; + + public SnowflakeIdWorker() { + this(0,0); + } + + public SnowflakeIdWorker(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + public synchronized Long nextId() { + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + lastTimestamp = timestamp; + return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; + } + + protected Long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + protected long timeGen() { + return System.currentTimeMillis(); + } +} diff --git a/ruoyi-pay/ruoyi-pay-common/src/main/resources/mapper/pay/PayOrderMapper.xml b/ruoyi-pay/ruoyi-pay-common/src/main/resources/mapper/pay/PayOrderMapper.xml index 74f4400..d7041a8 100644 --- a/ruoyi-pay/ruoyi-pay-common/src/main/resources/mapper/pay/PayOrderMapper.xml +++ b/ruoyi-pay/ruoyi-pay-common/src/main/resources/mapper/pay/PayOrderMapper.xml @@ -1,88 +1,101 @@ - - + + - + - - - - - - - - + + + + + + + + - - select order_id, user_id, order_number, order_status, total_amount, order_content, order_remark, order_message from pay_order - + select order_id, user_id, order_number, order_status, total_amount, + order_content, order_remark, order_message from pay_order - + - - - insert into pay_order - + where pay_order.order_id = #{orderId} + + + + insert into pay_order order_id, user_id, - order_number, - order_status, + order_number, + + order_status, total_amount, - order_content, - order_remark, + order_content, + + order_remark, order_message, - - + + #{orderId}, #{userId}, - #{orderNumber}, - #{orderStatus}, + #{orderNumber}, + + #{orderStatus}, #{totalAmount}, - #{orderContent}, - #{orderRemark}, + #{orderContent}, + + #{orderRemark}, #{orderMessage}, - + - - update pay_order - + update pay_order user_id = #{userId}, - order_number = #{orderNumber}, + order_number + = #{orderNumber}, order_status = #{orderStatus}, - total_amount = #{totalAmount}, - order_content = #{orderContent}, - order_remark = #{orderRemark}, - order_message = #{orderMessage}, + total_amount = #{totalAmount}, + order_content = #{orderContent}, + order_remark = #{orderRemark}, + order_message = #{orderMessage}, - where pay_order.order_id = #{orderId} - + where pay_order.order_id = #{orderId} - - delete from pay_order where order_id = #{orderId} - + delete from pay_order where order_id + = #{orderId} - - delete from pay_order where order_id in - - #{orderId} - + delete from pay_order where + order_id in + #{orderId} \ No newline at end of file diff --git a/ruoyi-pay/ruoyi-pay-sqb/pom.xml b/ruoyi-pay/ruoyi-pay-sqb/pom.xml index 676b0f7..cd54cc3 100644 --- a/ruoyi-pay/ruoyi-pay-sqb/pom.xml +++ b/ruoyi-pay/ruoyi-pay-sqb/pom.xml @@ -23,6 +23,12 @@ ruoyi-common + + + com.ruoyi + ruoyi-pay-common + + org.apache.httpcomponents diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java new file mode 100644 index 0000000..943af87 --- /dev/null +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java @@ -0,0 +1,33 @@ +package com.ruoyi.pay.sqb.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.ruoyi.common.annotation.Anonymous; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.pay.domain.PayOrder; +import com.ruoyi.pay.service.IPayOrderService; +import com.ruoyi.pay.sqb.service.Impl.SQBServiceImpl; + +@RestController +@RequestMapping("/pay/sql") +public class SQBController extends BaseController { + @Autowired + private SQBServiceImpl sqbServiceImpl; + @Autowired + private IPayOrderService payOrderServicer; + + @PostMapping("/payUrl") + @Anonymous + public AjaxResult postMethodName(@RequestParam("id") String orderNumber) throws Exception { + PayOrder payOrder = payOrderServicer.selectPayOrderByOrderNumber(orderNumber); + String url = sqbServiceImpl.payUrl(payOrder); + AjaxResult ajaxResult = new AjaxResult(200,url,"操作成功"); + return ajaxResult; + } + +} diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java index bbf7c46..7d28216 100644 --- a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.utils.sign.Md5Utils; +import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.sqb.constant.SqbConstant; import com.ruoyi.pay.sqb.utils.HttpUtil; @@ -99,8 +100,7 @@ public class SQBServiceImpl { * * @return */ - public String refund(String clientSn, String total, String payway, String subject, String operator, - String terminalSn) { + public String refund(String clientSn, String total, String payway, String subject, String operator) { String url = sqbConstant.getApiDomain() + "/upay/v2/refund"; JSONObject params = new JSONObject(); try { @@ -125,8 +125,7 @@ public class SQBServiceImpl { * @return */ - public String query(String clientSn, String total, String payway, String subject, String operator, - String terminalSn) { + public String query(String clientSn, String total, String payway, String subject, String operator) { String url = sqbConstant.getApiDomain() + "/upay/v2/query"; JSONObject params = new JSONObject(); try { @@ -146,22 +145,24 @@ public class SQBServiceImpl { } } - public String payUrl(String clientSn, String total, String payway, String subject, String operator, - String terminalSn) throws UnsupportedEncodingException { + public String payUrl(PayOrder payOrder) throws UnsupportedEncodingException { + if(payOrder.getRemark() == null){ + payOrder.setRemark("支付"); + } String param = "" + - "client_sn=" + clientSn + - "&operator=" + operator + + "client_sn=" + payOrder.getOrderNumber() + + "&operator=" + "admin" + "&return_url=" + "https://www.shouqianba.com/" + - "&subject=" + subject + - "&terminal_sn=" + terminalSn + - "&total_amount=" + total; + "&subject=" + payOrder.getRemark() + + "&terminal_sn=" + sqbConstant.getTerminalSn() + + "&total_amount=" + payOrder.getTotalAmount(); String urlParam = "" + - "client_sn=" + clientSn + - "&operator=" + URLEncoder.encode(operator, "UTF-8") + + "client_sn=" + payOrder.getOrderNumber() + + "&operator=" + URLEncoder.encode("admin", "UTF-8") + "&return_url=" + "https://www.shouqianba.com/" + - "&subject=" + URLEncoder.encode(subject, "UTF-8") + - "&terminal_sn=" + terminalSn + - "&total_amount=" + total; + "&subject=" + URLEncoder.encode(payOrder.getRemark(), "UTF-8") + + "&terminal_sn=" + sqbConstant.getTerminalSn() + + "&total_amount=" + payOrder.getTotalAmount(); String sign = getSign(param + "&key=" + sqbConstant.getTerminalKey()); return "https://qr.shouqianba.com/gateway?" + urlParam + "&sign=" + sign.toUpperCase(); }