VipUserOrderController.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package com.cyksj.web.controller.vip;
  2. import cn.hutool.extra.servlet.ServletUtil;
  3. import com.cyksj.common.exception.BusinessRuntimeException;
  4. import com.cyksj.common.util.StringUtil;
  5. import com.cyksj.dto.Result;
  6. import com.cyksj.enums.GatewayResponse;
  7. import com.cyksj.model.dto.AliPayParams;
  8. import com.cyksj.model.entity.VipOrderDon;
  9. import com.cyksj.model.request.AlipayOrderDonReq;
  10. import com.cyksj.model.request.VipOrderDonPayReq;
  11. import com.cyksj.model.response.AliPayTradeStatus;
  12. import com.cyksj.service.order.VipOrderDonService;
  13. import com.cyksj.web.util.StpUserUtil;
  14. import lombok.RequiredArgsConstructor;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.validation.annotation.Validated;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import org.springframework.web.bind.annotation.RequestBody;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import javax.servlet.http.HttpServletRequest;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import java.util.Set;
  25. /**
  26. * 项目名: yhlxj2
  27. * 文件名: VipUserOrderController
  28. * 创建者: JavaZou
  29. * 创建时间:2025/5/13 11:08
  30. */
  31. @RestController
  32. @RequestMapping("/applet/vip/orders")
  33. @RequiredArgsConstructor
  34. @Slf4j
  35. public class VipUserOrderController {
  36. private final HttpServletRequest request;
  37. private final VipOrderDonService vipOrderDonService;
  38. /**
  39. * 会员预下单
  40. */
  41. @PostMapping("/post/submit")
  42. public Result<VipOrderDon> submit(@Validated @RequestBody VipOrderDonPayReq payRequest) throws Exception {
  43. final String methodName = "吊起会员预支付";
  44. Long userId = StpUserUtil.getUserIdAfterLogin();
  45. payRequest.setUserId(userId);
  46. log.info("{}[start] params:{}", methodName, payRequest);
  47. String ip = ServletUtil.getClientIP(request);
  48. String address = StringUtil.getNewInternalAddressByIp(ip);
  49. //address.contains("柬埔寨") ||
  50. if (address != null && address.contains("缅甸")) {
  51. throw BusinessRuntimeException.getInstance("用户异常");
  52. }
  53. VipOrderDon orderDon = vipOrderDonService.submit(payRequest);
  54. return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
  55. }
  56. /**
  57. * 支付宝支付
  58. */
  59. @PostMapping("/post/pay/zfb")
  60. public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
  61. AliPayParams aliPayParams = vipOrderDonService.aliPay(re);
  62. return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
  63. }
  64. /**
  65. * 支付宝回调
  66. */
  67. @PostMapping("/zfb/notify")
  68. public String aliPayNotify(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
  69. ////将异步通知中收到的所有参数都存放到map中
  70. Map<String, String> params = convertRequestParamsToMap(request);
  71. String tradeStatus = params.get("trade_status");
  72. String orderNo = params.get("out_trade_no");
  73. if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
  74. log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus);
  75. vipOrderDonService.aliPayNotify(params);
  76. } else {
  77. log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
  78. return "fail";
  79. }
  80. return "success";
  81. }
  82. /**
  83. * 获取支付宝回调参数
  84. */
  85. private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
  86. Map<String, String> retMap = new HashMap<>();
  87. Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
  88. for (Map.Entry<String, String[]> entry : entrySet) {
  89. String name = entry.getKey();
  90. String[] values = entry.getValue();
  91. int valLen = values.length;
  92. if (valLen == 1) {
  93. retMap.put(name, values[0]);
  94. } else if (valLen > 1) {
  95. StringBuilder sb = new StringBuilder();
  96. for (String val : values) {
  97. sb.append(",").append(val);
  98. }
  99. retMap.put(name, sb.substring(1));
  100. } else {
  101. retMap.put(name, "");
  102. }
  103. }
  104. return retMap;
  105. }
  106. }