package com.cyksj.web.controller.vip; import cn.hutool.extra.servlet.ServletUtil; import com.cyksj.common.exception.BusinessRuntimeException; import com.cyksj.common.util.StringUtil; import com.cyksj.dto.Result; import com.cyksj.enums.GatewayResponse; import com.cyksj.model.dto.AliPayParams; import com.cyksj.model.entity.VipOrderDon; import com.cyksj.model.request.AlipayOrderDonReq; import com.cyksj.model.request.VipOrderDonPayReq; import com.cyksj.model.response.AliPayTradeStatus; import com.cyksj.service.order.VipOrderDonService; import com.cyksj.web.util.StpUserUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 项目名: yhlxj2 * 文件名: VipUserOrderController * 创建者: JavaZou * 创建时间:2025/5/13 11:08 */ @RestController @RequestMapping("/applet/vip/orders") @RequiredArgsConstructor @Slf4j public class VipUserOrderController { private final HttpServletRequest request; private final VipOrderDonService vipOrderDonService; /** * 会员预下单 */ @PostMapping("/post/submit") public Result submit(@Validated @RequestBody VipOrderDonPayReq payRequest) throws Exception { final String methodName = "吊起会员预支付"; Long userId = StpUserUtil.getUserIdAfterLogin(); payRequest.setUserId(userId); log.info("{}[start] params:{}", methodName, payRequest); String ip = ServletUtil.getClientIP(request); String address = StringUtil.getNewInternalAddressByIp(ip); //address.contains("柬埔寨") || if (address != null && address.contains("缅甸")) { throw BusinessRuntimeException.getInstance("用户异常"); } VipOrderDon orderDon = vipOrderDonService.submit(payRequest); return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon); } /** * 支付宝支付 */ @PostMapping("/post/pay/zfb") public Result aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception { AliPayParams aliPayParams = vipOrderDonService.aliPay(re); return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody()); } /** * 支付宝回调 */ @PostMapping("/zfb/notify") public String aliPayNotify(@RequestBody @Validated AlipayOrderDonReq re) throws Exception { ////将异步通知中收到的所有参数都存放到map中 Map params = convertRequestParamsToMap(request); String tradeStatus = params.get("trade_status"); String orderNo = params.get("out_trade_no"); if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) { log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus); vipOrderDonService.aliPayNotify(params); } else { log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo); return "fail"; } return "success"; } /** * 获取支付宝回调参数 */ private static Map convertRequestParamsToMap(HttpServletRequest request) { Map retMap = new HashMap<>(); Set> entrySet = request.getParameterMap().entrySet(); for (Map.Entry entry : entrySet) { String name = entry.getKey(); String[] values = entry.getValue(); int valLen = values.length; if (valLen == 1) { retMap.put(name, values[0]); } else if (valLen > 1) { StringBuilder sb = new StringBuilder(); for (String val : values) { sb.append(",").append(val); } retMap.put(name, sb.substring(1)); } else { retMap.put(name, ""); } } return retMap; } }