From dc5ea067897f0813761a302fed450bd1a3803d15 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Sat, 15 Mar 2025 10:05:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor(mcwl):=20=E5=8F=96=E6=B6=88=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/AliPay/AliPayController.java | 590 ++++---- .../pay/AliPay/AliPayIntegration.java | 316 ----- .../pay/AliPay/OrderTradeController.java | 318 ++--- .../java/com/mcwl/pay/config/AliConfig.java | 68 +- .../com/mcwl/pay/service/AliPayService.java | 54 +- .../pay/service/impl/AliPayServiceImpl.java | 1204 ++++++++--------- 6 files changed, 1097 insertions(+), 1453 deletions(-) delete mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayIntegration.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java index a6cf8c4..a70a6d0 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java @@ -1,303 +1,303 @@ -//package com.mcwl.web.controller.pay.AliPay; -// -//import cn.hutool.core.lang.UUID; -//import cn.hutool.extra.qrcode.QrCodeUtil; -//import com.alipay.api.domain.AlipayAccount; -//import com.alipay.easysdk.factory.Factory; -//import com.mcwl.common.annotation.Anonymous; -//import com.mcwl.common.constant.HttpStatus; -//import com.mcwl.common.core.controller.BaseController; -//import com.mcwl.common.core.domain.AjaxResult; -//import com.mcwl.common.core.domain.R; -//import com.mcwl.common.core.redis.RedisCache; -//import com.mcwl.common.utils.SecurityUtils; -//import com.mcwl.common.utils.ShareCodeUtils; -//import com.mcwl.pay.config.AliConfig; -//import com.mcwl.pay.domain.OrderTrade; -//import com.mcwl.pay.domain.OrderTradeDto; -//import com.mcwl.pay.domain.vo.PayVo; -//import com.mcwl.pay.service.AliPayService; -//import com.mcwl.pay.service.OrderTradeService; -//import com.mcwl.system.domain.SysUserPayAccount; -//import com.mcwl.system.service.ISysUserPayAccountService; -//import io.swagger.annotations.Api; -//import io.swagger.annotations.ApiOperation; -//import org.apache.ibatis.annotations.Param; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.stereotype.Controller; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import javax.servlet.http.HttpServletRequest; -//import javax.servlet.http.HttpServletResponse; -//import javax.validation.Valid; -//import javax.validation.constraints.Min; -//import javax.validation.constraints.NotBlank; -//import javax.validation.constraints.NotNull; -//import javax.validation.constraints.Pattern; -//import java.io.FileNotFoundException; -//import java.net.URLEncoder; -//import java.util.HashMap; -//import java.util.Map; -//import java.util.Objects; -//import java.util.Optional; -// -///** -// * @Author:ChenYan -// * @Project:McWl -// * @Package:com.mcwl.web.controller.pay -// * @Filename:OrderTradeController -// * @Description 支付模块 -// * @Date:2025/1/3 14:46 -// */ -// -//@Controller -//@RequestMapping("/ali/pay") -//@Validated -//@Api(tags = "支付模块") -//public class AliPayController extends BaseController { -// -// @Autowired -// private OrderTradeService orderTradeService; -// -// @Autowired -// private ISysUserPayAccountService sysUserPayAccountService; -// -// @Autowired -// private AliPayService aliPayService; -// -// @Autowired -// private AliConfig aliConfig; -// -// -// @Autowired -// private RedisCache redisCache; -// -// @Value("${mall.mgt.aliPayConfig.bindUrl}") -// private String bindUrl; -// -// -// /** -// * 授权二维码 -// * -// * @param response 响应 -// * @throws Exception 抛出异常 -// */ -// @ApiOperation(value = "支付宝绑定") -// @GetMapping("/generateQrCode") -// @ResponseBody -// public R generateQrCode(HttpServletResponse response) throws Exception { -// String scope = "auth_user"; // 需要获取用户信息 -// String appId = aliConfig.getAppId(); -// String state = ShareCodeUtils.idToCode(SecurityUtils.getUserId()); // 防止CSRF攻击 -// -// String encodedRedirectUri = URLEncoder.encode(bindUrl, "UTF-8"); -// // 线上 -//// String authUrl = String.format( -//// "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", -//// appId, scope, encodedRedirectUri, state -//// ); -// // 沙箱 +package com.mcwl.web.controller.pay.AliPay; + +import cn.hutool.core.lang.UUID; +import cn.hutool.extra.qrcode.QrCodeUtil; +import com.alipay.api.domain.AlipayAccount; +import com.alipay.easysdk.factory.Factory; +import com.mcwl.common.annotation.Anonymous; +import com.mcwl.common.constant.HttpStatus; +import com.mcwl.common.core.controller.BaseController; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.R; +import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.common.utils.ShareCodeUtils; +import com.mcwl.pay.config.AliConfig; +import com.mcwl.pay.domain.OrderTrade; +import com.mcwl.pay.domain.OrderTradeDto; +import com.mcwl.pay.domain.vo.PayVo; +import com.mcwl.pay.service.AliPayService; +import com.mcwl.pay.service.OrderTradeService; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.service.ISysUserPayAccountService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Param; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.FileNotFoundException; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** + * @Author:ChenYan + * @Project:McWl + * @Package:com.mcwl.web.controller.pay + * @Filename:OrderTradeController + * @Description 支付模块 + * @Date:2025/1/3 14:46 + */ + +@Controller +@RequestMapping("/ali/pay") +@Validated +@Api(tags = "支付模块") +public class AliPayController extends BaseController { + + @Autowired + private OrderTradeService orderTradeService; + + @Autowired + private ISysUserPayAccountService sysUserPayAccountService; + + @Autowired + private AliPayService aliPayService; + + @Autowired + private AliConfig aliConfig; + + + @Autowired + private RedisCache redisCache; + + @Value("${mall.mgt.aliPayConfig.bindUrl}") + private String bindUrl; + + + /** + * 授权二维码 + * + * @param response 响应 + * @throws Exception 抛出异常 + */ + @ApiOperation(value = "支付宝绑定") + @GetMapping("/generateQrCode") + @ResponseBody + public R generateQrCode(HttpServletResponse response) throws Exception { + String scope = "auth_user"; // 需要获取用户信息 + String appId = aliConfig.getAppId(); + String state = ShareCodeUtils.idToCode(SecurityUtils.getUserId()); // 防止CSRF攻击 + + String encodedRedirectUri = URLEncoder.encode(bindUrl, "UTF-8"); + // 线上 // String authUrl = String.format( -// "https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", +// "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", // appId, scope, encodedRedirectUri, state // ); -// -//// QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); -// return R.ok(authUrl, "成功"); -// } -// + // 沙箱 + String authUrl = String.format( + "https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", + appId, scope, encodedRedirectUri, state + ); + +// QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); + return R.ok(authUrl, "成功"); + } + + /** + * 支付宝绑定状态查询 + */ + @GetMapping("/queryBindStatus") + @ApiOperation(value = "支付宝绑定状态查询") + @ResponseBody + public R queryTradeStatus() throws Exception { + + return aliPayService.queryBindStatus(); + } + + /** + * 授权回调 + * + * @param authCode 授权码 + */ + @GetMapping("/callback") + public String callback(@RequestParam("auth_code") String authCode, String state) throws FileNotFoundException { + + System.out.println("authCode = " + authCode); + String result = aliPayService.bindingCallback(authCode, state); + if ("success".equals(result)) { + return "binding-success"; + } else { + return "binding-fail"; + } + } + // /** -// * 支付宝绑定状态查询 +// * 账户余额查询 // */ -// @GetMapping("/queryBindStatus") -// @ApiOperation(value = "支付宝绑定状态查询") +// @GetMapping("/balance") // @ResponseBody -// public R queryTradeStatus() throws Exception { -// -// return aliPayService.queryBindStatus(); +// public AjaxResult balance() throws AlipayApiException { +// String balance = aliPayService.balance(); +// return AjaxResult.success(balance); // } -// -// /** -// * 授权回调 -// * -// * @param authCode 授权码 -// */ -// @GetMapping("/callback") -// public String callback(@RequestParam("auth_code") String authCode, String state) throws FileNotFoundException { -// -// System.out.println("authCode = " + authCode); -// String result = aliPayService.bindingCallback(authCode, state); -// if ("success".equals(result)) { -// return "binding-success"; -// } else { -// return "binding-fail"; -// } -// } -// -//// /** -//// * 账户余额查询 -//// */ -//// @GetMapping("/balance") -//// @ResponseBody -//// public AjaxResult balance() throws AlipayApiException { -//// String balance = aliPayService.balance(); -//// return AjaxResult.success(balance); -//// } -// -// -// /** -// * 支付接口 -// * -// * @param orderTradeDto 订单实体 -// * @param response 响应 -// * @throws Exception -// */ -// @Anonymous -// @PostMapping("/doPay") -// @ApiOperation(value = "支付宝支付") -// @ResponseBody -// public R doPay(@Valid -// @RequestBody -// OrderTradeDto orderTradeDto, -// HttpServletResponse response) throws Exception { -// PayVo payVo = null; -// -// String type = orderTradeDto.getType(); -// -// if ("member".equalsIgnoreCase(type)) { -// if (!Optional.ofNullable(orderTradeDto.getProductId()).isPresent()) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"商品id不能为空"); -// } -// payVo = aliPayService.memberPay(orderTradeDto); -//// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); -// } else if ("points".equalsIgnoreCase(type)) { -// payVo = aliPayService.pointsPay(orderTradeDto.getAmount()); -//// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); -// } else if ("wallet".equalsIgnoreCase(type)) { -// // 充值金额只能是整数 -// if (orderTradeDto.getAmount() % 1 != 0) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"充值金额只能是整数"); -// } -// payVo = aliPayService.walletPay(orderTradeDto.getAmount()); -//// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); -// } else { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"订单类型错误"); -// } -// -// return R.ok(payVo); -// } -// -// /** -// * 提现接口 -// */ -// @Anonymous -// @GetMapping("/fetch") -// @ResponseBody -// @ApiOperation(value = "提现") -// public R fetch(@Valid -// @NotNull(message = "提现金额不能为空") -// @Pattern(regexp = "^(0|(?!0\\d)[1-9]\\d*)(\\.\\d{2})?$", message = "金额格式错误(必须保留两位小数)") -// String amount) throws Exception { -// -// SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() -// .eq(SysUserPayAccount::getUserId, SecurityUtils.getUserId()) -// .eq(SysUserPayAccount::getType, 0) -// .one(); -// -// if (Objects.isNull(sysUserPayAccount)) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"请先绑定支付宝"); -// } -// -// -// if (Double.parseDouble(amount) < 0.1) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"提现金额最小为0.1"); -// } -// -// return aliPayService.fetch(amount.toString()); -// } -// -// -// /** -// * 支付回调接口 -// * -// * @param request -// * @return -// * @throws Exception -// */ -// @Anonymous -// @PostMapping("/notify") // 注意这里必须是POST接口 -// @ResponseBody -// public String payNotify(HttpServletRequest request) throws Exception { -// -// -// if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { -// System.out.println("=========支付宝异步回调========"); -// -// Map params = new HashMap<>(); -// Map requestParams = request.getParameterMap(); -// for (String name : requestParams.keySet()) { -// params.put(name, request.getParameter(name)); -// // System.out.println(name + " = " + request.getParameter(name)); -// } -// -// // 支付宝验签 -// if (Factory.Payment.Common().verifyNotify(params)) { -//// System.out.println("交易名称: " + params.get("subject")); -//// System.out.println("交易状态: " + params.get("trade_status")); -//// System.out.println("支付宝交易凭证号: " + params.get("trade_no")); -//// System.out.println("商户订单号: " + params.get("out_trade_no")); -//// System.out.println("交易金额: " + params.get("total_amount")); -//// System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); -//// System.out.println("买家付款时间: " + params.get("gmt_payment")); -//// System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); -// // 验签通过 -// -// String code = params.get("out_trade_no"); // 商户订单号 -// OrderTrade orderTrade = orderTradeService.lambdaQuery() -// .eq(OrderTrade::getCode, code) -// .one(); -// if (Objects.isNull(orderTrade)) { -// return "failure"; + + + /** + * 支付接口 + * + * @param orderTradeDto 订单实体 + * @param response 响应 + * @throws Exception + */ + @Anonymous + @PostMapping("/doPay") + @ApiOperation(value = "支付宝支付") + @ResponseBody + public R doPay(@Valid + @RequestBody + OrderTradeDto orderTradeDto, + HttpServletResponse response) throws Exception { + PayVo payVo = null; + + String type = orderTradeDto.getType(); + + if ("member".equalsIgnoreCase(type)) { + if (!Optional.ofNullable(orderTradeDto.getProductId()).isPresent()) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"商品id不能为空"); + } + payVo = aliPayService.memberPay(orderTradeDto); +// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); + } else if ("points".equalsIgnoreCase(type)) { + payVo = aliPayService.pointsPay(orderTradeDto.getAmount()); +// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); + } else if ("wallet".equalsIgnoreCase(type)) { + // 充值金额只能是整数 + if (orderTradeDto.getAmount() % 1 != 0) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"充值金额只能是整数"); + } + payVo = aliPayService.walletPay(orderTradeDto.getAmount()); +// QrCodeUtil.generate(payVo.getUrl(), 300, 300, "png", response.getOutputStream()); + } else { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"订单类型错误"); + } + + return R.ok(payVo); + } + + /** + * 提现接口 + */ + @Anonymous + @GetMapping("/fetch") + @ResponseBody + @ApiOperation(value = "提现") + public R fetch(@Valid + @NotNull(message = "提现金额不能为空") + @Pattern(regexp = "^(0|(?!0\\d)[1-9]\\d*)(\\.\\d{2})?$", message = "金额格式错误(必须保留两位小数)") + String amount) throws Exception { + + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() + .eq(SysUserPayAccount::getUserId, SecurityUtils.getUserId()) + .eq(SysUserPayAccount::getType, 0) + .one(); + + if (Objects.isNull(sysUserPayAccount)) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"请先绑定支付宝"); + } + + + if (Double.parseDouble(amount) < 0.1) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"提现金额最小为0.1"); + } + + return aliPayService.fetch(amount.toString()); + } + + + /** + * 支付回调接口 + * + * @param request + * @return + * @throws Exception + */ + @Anonymous + @PostMapping("/notify") // 注意这里必须是POST接口 + @ResponseBody + public String payNotify(HttpServletRequest request) throws Exception { + + + if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { + System.out.println("=========支付宝异步回调========"); + + Map params = new HashMap<>(); + Map requestParams = request.getParameterMap(); + for (String name : requestParams.keySet()) { + params.put(name, request.getParameter(name)); + // System.out.println(name + " = " + request.getParameter(name)); + } + + // 支付宝验签 + if (Factory.Payment.Common().verifyNotify(params)) { +// System.out.println("交易名称: " + params.get("subject")); +// System.out.println("交易状态: " + params.get("trade_status")); +// System.out.println("支付宝交易凭证号: " + params.get("trade_no")); +// System.out.println("商户订单号: " + params.get("out_trade_no")); +// System.out.println("交易金额: " + params.get("total_amount")); +// System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); +// System.out.println("买家付款时间: " + params.get("gmt_payment")); +// System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); + // 验签通过 + + String code = params.get("out_trade_no"); // 商户订单号 + OrderTrade orderTrade = orderTradeService.lambdaQuery() + .eq(OrderTrade::getCode, code) + .one(); + if (Objects.isNull(orderTrade)) { + return "failure"; + } + // 获取订单后缀 + String suffix = code.substring(code.lastIndexOf("_") + 1); + + orderTradeService.orderHandler(orderTrade, suffix, params); + + // 更新订单状态 +// if (!StringUtils.isEmpty(orderTradeJson)) { +// OrderTrade orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); +// // 支付宝交易凭证号 +// orderTrade.setPaymentMethod(params.get("trade_no")); +// orderTrade.setTransactionId(1); +// orderTrade.setOrderTime(DateUtils.parseDate(params.get("gmt_payment"))); +// orderTrade.setOrderStatus(3); +// orderTrade.setPayStatus(2); +// String totalAmountStr = params.get("total_amount"); +// if (totalAmountStr != null && !totalAmountStr.isEmpty()) { +// BigDecimal totalAmount = new BigDecimal(totalAmountStr); +// orderTrade.setTotalAmount(totalAmount.intValue()); +// } +// String buyerPayAmountStr = params.get("buyer_pay_amount"); +// if (buyerPayAmountStr != null && !buyerPayAmountStr.isEmpty()) { +// BigDecimal buyerPayAmount = new BigDecimal(buyerPayAmountStr); +// orderTrade.setPaymentAmount(buyerPayAmount.intValue()); +// } +// orderTradeService.save(orderTrade); // } -// // 获取订单后缀 -// String suffix = code.substring(code.lastIndexOf("_") + 1); -// -// orderTradeService.orderHandler(orderTrade, suffix, params); -// -// // 更新订单状态 -//// if (!StringUtils.isEmpty(orderTradeJson)) { -//// OrderTrade orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); -//// // 支付宝交易凭证号 -//// orderTrade.setPaymentMethod(params.get("trade_no")); -//// orderTrade.setTransactionId(1); -//// orderTrade.setOrderTime(DateUtils.parseDate(params.get("gmt_payment"))); -//// orderTrade.setOrderStatus(3); -//// orderTrade.setPayStatus(2); -//// String totalAmountStr = params.get("total_amount"); -//// if (totalAmountStr != null && !totalAmountStr.isEmpty()) { -//// BigDecimal totalAmount = new BigDecimal(totalAmountStr); -//// orderTrade.setTotalAmount(totalAmount.intValue()); -//// } -//// String buyerPayAmountStr = params.get("buyer_pay_amount"); -//// if (buyerPayAmountStr != null && !buyerPayAmountStr.isEmpty()) { -//// BigDecimal buyerPayAmount = new BigDecimal(buyerPayAmountStr); -//// orderTrade.setPaymentAmount(buyerPayAmount.intValue()); -//// } -//// orderTradeService.save(orderTrade); -//// } -// } else { -// // 验签失败 -// System.out.println("验签失败"); -// } -// } else { -// // 验签失败 -// System.out.println("验签失败"); -// } -// -// return "success"; -// } -// -// -//} + } else { + // 验签失败 + System.out.println("验签失败"); + } + } else { + // 验签失败 + System.out.println("验签失败"); + } + + return "success"; + } + + +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayIntegration.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayIntegration.java deleted file mode 100644 index 84ba704..0000000 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayIntegration.java +++ /dev/null @@ -1,316 +0,0 @@ -//package com.mcwl.web.controller.pay.AliPay; -// -//import cn.hutool.core.bean.BeanUtil; -//import cn.hutool.core.lang.UUID; -//import cn.hutool.json.JSONUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.alipay.api.AlipayApiException; -//import com.alipay.api.AlipayClient; -//import com.alipay.api.AlipayConfig; -//import com.alipay.api.DefaultAlipayClient; -//import com.alipay.api.diagnosis.DiagnosisUtils; -//import com.alipay.api.domain.AlipayFundAccountQueryModel; -//import com.alipay.api.domain.AlipayFundTransUniTransferModel; -//import com.alipay.api.domain.Participant; -//import com.alipay.api.request.AlipayFundAccountQueryRequest; -//import com.alipay.api.request.AlipayFundTransUniTransferRequest; -//import com.alipay.api.request.AlipaySystemOauthTokenRequest; -//import com.alipay.api.request.AlipayUserInfoAuthRequest; -//import com.alipay.api.response.AlipayFundAccountQueryResponse; -//import com.alipay.api.response.AlipayFundTransUniTransferResponse; -//import com.alipay.easysdk.base.oauth.models.AlipaySystemOauthTokenResponse; -//import com.alipay.easysdk.factory.Factory; -//import com.alipay.easysdk.kernel.Config; -//import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; -//import com.mcwl.common.core.redis.RedisCache; -//import com.mcwl.common.exception.ServiceException; -//import com.mcwl.common.utils.SecurityUtils; -//import com.mcwl.memberCenter.domain.MemberLevel; -//import com.mcwl.memberCenter.service.MemberLevelService; -//import com.mcwl.pay.config.AliConfig; -//import com.mcwl.pay.domain.OrderTrade; -//import com.mcwl.pay.domain.OrderTradeDto; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Component; -// -//import java.util.Optional; -//import java.util.concurrent.TimeUnit; -// -///** -// * 支付宝支付 -// */ -//@Component -//@Slf4j -//public class AliPayIntegration { -// -// @Autowired -// private RedisCache redisCache; -// -// -// @Autowired -// private MemberLevelService memberLevelService; -// -// -// @Autowired -// private AliConfig aliConfig; -// -// -// public AliPayIntegration(Config config) { -// Factory.setOptions(config); -// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param orderTradeDto 订单实体 -// * @return 二维码url -// * @throws Exception -// */ -//// public String orderPay(OrderTradeDto orderTradeDto) throws Exception { -//// Integer productId = orderTradeDto.getProductId(); -//// if (!Optional.ofNullable(productId).isPresent()) { -//// throw new ServiceException("mallProductId不能为空"); -//// } -//// -//// MallProduct mallProduct = mallProductService.getById(productId); -//// if (!Optional.ofNullable(mallProduct).isPresent()) { -//// throw new ServiceException("mallProduct不存在"); -//// } -//// -//// // 设置orderTrade信息 -//// OrderTrade tradeEntity = new OrderTrade(); -//// BeanUtil.copyProperties(orderTradeDto, tradeEntity); -//// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30)); -//// tradeEntity.setUserId(SecurityUtils.getUserId()); -//// tradeEntity.setUserName(SecurityUtils.getUsername()); -//// tradeEntity.setProductName(mallProduct.getProductName()); -//// -//// //调用支付宝的接口 -//// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -//// .preCreate(mallProduct.getProductName(), -//// tradeEntity.getCode() + "_product", -//// orderTradeDto.getPaymentAmount().toString()); -//// // 缓存到redis -//// redisCache.setCacheObject(tradeEntity.getCode() + "_product", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); -////// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); -//// //参照官方文档响应示例,解析返回结果 -//// String httpBodyStr = payResponse.getHttpBody(); -//// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -//// return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -//// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param orderTradeDto 订单实体 -// * @return 二维码url -// * @throws Exception -// */ -// public String memberPay(OrderTradeDto orderTradeDto) throws Exception { -// -// // 会员等级id -// Integer productId = orderTradeDto.getProductId(); -// -// if (!Optional.ofNullable(productId).isPresent()) { -// throw new ServiceException("memberLevelId不能为空"); -// } -// -// MemberLevel memberLevel = memberLevelService.getById(productId); -// -// if (!Optional.ofNullable(memberLevel).isPresent()) { -// throw new ServiceException("memberLevel不存在"); -// } -// -// // 设置orderTrade信息 -// OrderTrade tradeEntity = new OrderTrade(); -// BeanUtil.copyProperties(orderTradeDto, tradeEntity); -// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30)); -// tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setUserName(SecurityUtils.getUsername()); -// tradeEntity.setProductName(memberLevel.getMemberName()); -// -// //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// // 设置过期时 -// .preCreate(memberLevel.getMemberName(), -// tradeEntity.getCode() + "_member", -// orderTradeDto.getPaymentAmount().toString()); -// // 缓存到redis -// redisCache.setCacheObject(tradeEntity.getCode() + "_member", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); -// redisCache.setCacheObject(tradeEntity.getCode() + "_member" + "_promotionId", orderTradeDto.getPromotionId(), 3, TimeUnit.MINUTES); -//// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); -// //参照官方文档响应示例,解析返回结果 -// String httpBodyStr = payResponse.getHttpBody(); -// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -// return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param paymentAmount 充值金额 -// * @return 二维码url -// * @throws Exception -// */ -// public String pointsPay(Double paymentAmount) throws Exception { -// // 设置orderTrade信息 -// OrderTrade tradeEntity = new OrderTrade(); -// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30)); -// tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setProductId(-1); -// tradeEntity.setProductName("积分充值"); -// tradeEntity.setUserName(SecurityUtils.getUsername()); -// tradeEntity.setPaymentAmount(paymentAmount.intValue()); -// -// //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// .preCreate(tradeEntity.getProductName(), -// tradeEntity.getCode() + "_points", -// tradeEntity.getPaymentAmount().toString()); -// // 缓存到redis -// redisCache.setCacheObject(tradeEntity.getCode() + "_points", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); -// //参照官方文档响应示例,解析返回结果 -// String httpBodyStr = payResponse.getHttpBody(); -// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -// return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -// } -// -// /** -// * 支付宝转账方法 -// * @param outBizNo 外部业务单号 -// * @param payerUserId 付款方用户ID -// * @param payeeUserId 收款方用户ID -// * @param amount 转账金额 -// * @return 返回支付宝转账响应的内容 -// */ -// public String transfer(String outBizNo, String payerUserId, String payeeUserId, String amount) throws AlipayApiException { -// -// // 初始化SDK -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// -// // 构造请求参数以调用接口 -// AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); -// AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); -// -// // 设置商家侧唯一订单号 -// model.setOutBizNo(outBizNo); -// -// // 设置订单总金额 -// model.setTransAmount(amount); -// -// // 设置描述特定的业务场景 -// model.setBizScene("DIRECT_TRANSFER"); -// -// // 设置业务产品码 -// model.setProductCode("TRANS_ACCOUNT_NO_PWD"); -// -// // 设置转账业务的标题 -// model.setOrderTitle("测试"); -// -// // 设置收款方信息 -// Participant payeeInfo = new Participant(); -// payeeInfo.setCertType("IDENTITY_CARD"); -// payeeInfo.setCertNo("1201152******72917"); -// payeeInfo.setIdentity("2088123412341234"); -// payeeInfo.setName("黄龙国际有限公司"); -// payeeInfo.setIdentityType("ALIPAY_USER_ID"); -// model.setPayeeInfo(payeeInfo); -// -// // 设置业务备注 -// model.setRemark("201905代发"); -// -// // 设置转账业务请求的扩展参数 -// model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); -// -// request.setBizModel(model); -// AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); -// System.out.println(response.getBody()); -// -// if (response.isSuccess()) { -// System.out.println("调用成功"); -// } else { -// System.out.println("调用失败"); -// // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 -// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); -// System.out.println(diagnosisUrl); -// } -// return response.getBody(); -// } -// -// /** -// * 查看余额 -// */ -// public void balance() throws Exception { -// -// AlipaySystemOauthTokenResponse token = Factory.Base.OAuth().getToken("code"); -// -// -// // 初始化SDK -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// -// // 构造请求参数以调用接口 -// AlipayFundAccountQueryRequest request = new AlipayFundAccountQueryRequest(); -// AlipayFundAccountQueryModel model = new AlipayFundAccountQueryModel(); -// -// // uid参数未来计划废弃,存量商户可继续使用,新商户请使用openid。请根据应用-开发配置-openid配置选择支持的字段。 -// // model.setAlipayUserId("2088301409188095"); -// -// // 设置支付宝openId -// model.setAlipayOpenId("061P6NAblcWDWJoDRxSVvOYz-ufp-3wQaA4E_szQyMFTXse"); -// -// // 设置查询的账号类型 -// model.setAccountType("ACCTRANS_ACCOUNT"); -// -// request.setBizModel(model); -// AlipayFundAccountQueryResponse response = alipayClient.execute(request); -// System.out.println(response.getBody()); -// -// if (response.isSuccess()) { -// System.out.println("调用成功"); -// } else { -// System.out.println("调用失败"); -// // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 -// // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); -// // System.out.println(diagnosisUrl); -// } -// } -// -// private AlipayConfig getAlipayConfig() { -// String privateKey = aliConfig.getPrivateKey(); -// String alipayPublicKey = aliConfig.getPublicKey(); -// AlipayConfig alipayConfig = new AlipayConfig(); -// alipayConfig.setServerUrl(aliConfig.getGatewayUrl()); -// alipayConfig.setAppId(aliConfig.getAppId()); -// alipayConfig.setPrivateKey(privateKey); -// alipayConfig.setFormat("json"); -// alipayConfig.setAlipayPublicKey(alipayPublicKey); -// alipayConfig.setCharset("UTF-8"); -// alipayConfig.setSignType("RSA2"); -// return alipayConfig; -// } -// -// //TODO 绑定回调,获取openId,保存到数据库 -// public void bindingCallback(String authCode) { -// try { -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); -// request.setCode(authCode); -// request.setGrantType("authorization_code"); -// com.alipay.api.response.AlipaySystemOauthTokenResponse response = alipayClient.execute(request); -// if (response.isSuccess()) { -// String openId = response.getOpenId(); // 支付宝用户唯一ID -// // 将openId与当前商城用户绑定(保存到数据库) -// System.out.println("绑定成功!openId:" + openId); -// } else { -// System.out.println("绑定失败:" + response.getSubMsg()); -// } -// -// } catch (AlipayApiException e) { -// throw new RuntimeException(e); -// } -// } -//} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java index 271e775..b073694 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/OrderTradeController.java @@ -1,163 +1,163 @@ -//package com.mcwl.web.controller.pay.AliPay; -// -//import com.alipay.easysdk.factory.Factory; -//import com.alipay.easysdk.kernel.Config; -//import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse; -//import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse; -//import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; -//import com.mcwl.common.JSONUtils; -//import com.mcwl.common.constant.HttpStatus; -//import com.mcwl.common.core.controller.BaseController; -//import com.mcwl.common.core.domain.AjaxResult; -//import com.mcwl.common.core.domain.R; -//import com.mcwl.common.core.page.TableDataInfo; -//import com.mcwl.common.core.redis.RedisCache; -//import com.mcwl.common.domain.IdsParam; -//import com.mcwl.common.utils.SecurityUtils; -//import com.mcwl.pay.domain.OrderTrade; -//import com.mcwl.pay.service.AliPayService; -//import com.mcwl.pay.service.OrderTradeService; -//import com.mcwl.resource.domain.dto.ProductRes; -//import io.swagger.annotations.Api; -//import io.swagger.annotations.ApiOperation; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.validation.annotation.Validated; -//import org.springframework.web.bind.annotation.*; -// -//import javax.validation.Valid; -//import javax.validation.constraints.NotBlank; -//import java.util.List; -//import java.util.Map; -// -///** -// * @Author:ChenYan -// * @Project:McWl -// * @Package:com.mcwl.web.controller.pay -// * @Filename:OrderTradeController -// * @Description 支付模块 -// * @Date:2025/1/3 14:46 -// */ -// -//@RestController -//@RequestMapping("/order") -//@Validated -//@Api(tags = "订单模块") -//public class OrderTradeController extends BaseController { -// -// @Autowired -// private Config config; -// -// @Autowired -// private OrderTradeService orderTradeService; -// -// @Autowired -// private AliPayService aliPayService; -// -// @Autowired -// private RedisCache redisCache; -// -// -// /** -// * 购买产品 -// */ -// @PostMapping("/buy") -// @ApiOperation(value = "购买产品") -// public R buy(@Valid @RequestBody ProductRes productRes) throws Exception { -// orderTradeService.productHandler(productRes); -// return R.ok(); -// } -// -// -// /** -// * 查询列表 -// */ -// @GetMapping("/list") -// @ApiOperation(value = "查询订单列表") -// public TableDataInfo list(OrderTrade orderTrade) { -// startPage(); -// List list = orderTradeService.selectMallProductList(orderTrade); -// return getDataTable(list); -// } -// -// /** -// * 新增 -// */ -// @PostMapping("/add") -// @ApiOperation(value = "新增订单") -// public R add(@RequestBody OrderTrade orderTrade) { -// // 获取当前用户 -// Long userId = SecurityUtils.getUserId(); -// if (userId == null) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"用户未登录"); +package com.mcwl.web.controller.pay.AliPay; + +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse; +import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse; +import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; +import com.mcwl.common.JSONUtils; +import com.mcwl.common.constant.HttpStatus; +import com.mcwl.common.core.controller.BaseController; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.R; +import com.mcwl.common.core.page.TableDataInfo; +import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.domain.IdsParam; +import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.pay.domain.OrderTrade; +import com.mcwl.pay.service.AliPayService; +import com.mcwl.pay.service.OrderTradeService; +import com.mcwl.resource.domain.dto.ProductRes; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.Map; + +/** + * @Author:ChenYan + * @Project:McWl + * @Package:com.mcwl.web.controller.pay + * @Filename:OrderTradeController + * @Description 支付模块 + * @Date:2025/1/3 14:46 + */ + +@RestController +@RequestMapping("/order") +@Validated +@Api(tags = "订单模块") +public class OrderTradeController extends BaseController { + + @Autowired + private Config config; + + @Autowired + private OrderTradeService orderTradeService; + + @Autowired + private AliPayService aliPayService; + + @Autowired + private RedisCache redisCache; + + + /** + * 购买产品 + */ + @PostMapping("/buy") + @ApiOperation(value = "购买产品") + public R buy(@Valid @RequestBody ProductRes productRes) throws Exception { + orderTradeService.productHandler(productRes); + return R.ok(); + } + + + /** + * 查询列表 + */ + @GetMapping("/list") + @ApiOperation(value = "查询订单列表") + public TableDataInfo list(OrderTrade orderTrade) { + startPage(); + List list = orderTradeService.selectMallProductList(orderTrade); + return getDataTable(list); + } + + /** + * 新增 + */ + @PostMapping("/add") + @ApiOperation(value = "新增订单") + public R add(@RequestBody OrderTrade orderTrade) { + // 获取当前用户 + Long userId = SecurityUtils.getUserId(); + if (userId == null) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"用户未登录"); + } + orderTrade.setUserId(userId); + return R.ok(orderTradeService.insertMallProduct(orderTrade)); + } + + /** + * 修改 + */ + @PostMapping("/update") + @ApiOperation(value = "修改订单") + public R update(@RequestBody OrderTrade orderTrade) { + // 获取当前用户 + Long userId = SecurityUtils.getUserId(); + if (userId == null) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"用户未登录"); + } + orderTrade.setUserId(userId); + orderTradeService.updateMallProduct(orderTrade); + return R.ok(); + } + + /** + * 删除 + */ + @PostMapping + @ApiOperation(value = "删除订单") + public R remove(@RequestBody IdsParam ids) { + orderTradeService.deleteMallProductByIds(ids); + return R.ok(); + } + + + /** + * 查询交易状态 + */ + @GetMapping("/queryTradeStatus") + @ApiOperation(value = "查询交易状态") + public R queryTradeStatus(@Valid @NotBlank(message = "订单号不能为空") String outTradeNo) throws Exception { + return aliPayService.queryTradeStatus(outTradeNo); + + + } + + + /** + * 撤销交易 + */ +// @GetMapping("/cancelTrade") +// public AjaxResult cancelTrade(String outTradeNo) throws Exception { +// // 关闭交易 +// AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(outTradeNo); +// if (cancel.getCode().equals("10000")) { +// return AjaxResult.success("关闭成功"); // } -// orderTrade.setUserId(userId); -// return R.ok(orderTradeService.insertMallProduct(orderTrade)); +// return AjaxResult.error("关闭失败"); // } -// -// /** -// * 修改 -// */ -// @PostMapping("/update") -// @ApiOperation(value = "修改订单") -// public R update(@RequestBody OrderTrade orderTrade) { -// // 获取当前用户 -// Long userId = SecurityUtils.getUserId(); -// if (userId == null) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"用户未登录"); + + /** + * 关闭交易 + */ +// @GetMapping("/closeTrade") +// public AjaxResult closeTrade(String outTradeNo) throws Exception { +// // 关闭交易 +// AlipayTradeCloseResponse close = Factory.Payment.Common().close(outTradeNo); +// if (close.getCode().equals("10000")) { +// return AjaxResult.success("关闭成功"); // } -// orderTrade.setUserId(userId); -// orderTradeService.updateMallProduct(orderTrade); -// return R.ok(); +// return AjaxResult.error("关闭失败"); // } -// -// /** -// * 删除 -// */ -// @PostMapping -// @ApiOperation(value = "删除订单") -// public R remove(@RequestBody IdsParam ids) { -// orderTradeService.deleteMallProductByIds(ids); -// return R.ok(); -// } -// -// -// /** -// * 查询交易状态 -// */ -// @GetMapping("/queryTradeStatus") -// @ApiOperation(value = "查询交易状态") -// public R queryTradeStatus(@Valid @NotBlank(message = "订单号不能为空") String outTradeNo) throws Exception { -// return aliPayService.queryTradeStatus(outTradeNo); -// -// -// } -// -// -// /** -// * 撤销交易 -// */ -//// @GetMapping("/cancelTrade") -//// public AjaxResult cancelTrade(String outTradeNo) throws Exception { -//// // 关闭交易 -//// AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(outTradeNo); -//// if (cancel.getCode().equals("10000")) { -//// return AjaxResult.success("关闭成功"); -//// } -//// return AjaxResult.error("关闭失败"); -//// } -// -// /** -// * 关闭交易 -// */ -//// @GetMapping("/closeTrade") -//// public AjaxResult closeTrade(String outTradeNo) throws Exception { -//// // 关闭交易 -//// AlipayTradeCloseResponse close = Factory.Payment.Common().close(outTradeNo); -//// if (close.getCode().equals("10000")) { -//// return AjaxResult.success("关闭成功"); -//// } -//// return AjaxResult.error("关闭失败"); -//// } -// -// -//} + + +} diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/config/AliConfig.java b/mcwl-pay/src/main/java/com/mcwl/pay/config/AliConfig.java index c7fb370..13e694d 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/config/AliConfig.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/config/AliConfig.java @@ -1,34 +1,34 @@ -//package com.mcwl.pay.config; -// -// -//import lombok.Data; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.boot.context.properties.ConfigurationProperties; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.stereotype.Component; -// -//@Data -//@Configuration -//@Component -//public class AliConfig { -// @Value("${mall.mgt.aliPayConfig.protocol}") -// private String protocol; -// @Value("${mall.mgt.aliPayConfig.gatewayHost}") -// private String gatewayHost; -// @Value("${mall.mgt.aliPayConfig.signType}") -// private String signType; -// @Value("${mall.mgt.aliPayConfig.appId}") -// private String appId; -// @Value("${mall.mgt.aliPayConfig.privateKey}") -// private String privateKey; -// @Value("${mall.mgt.aliPayConfig.appCertPath}") -// private String appCertPath; -// @Value("${mall.mgt.aliPayConfig.alipayCertPath}") -// private String alipayCertPath; -// @Value("${mall.mgt.aliPayConfig.alipayRootCertPath}") -// private String alipayRootCertPath; -// @Value("${mall.mgt.aliPayConfig.gatewayUrl}") -// private String gatewayUrl; -// @Value("${mall.mgt.aliPayConfig.notifyUrl}") -// private String notifyUrl; -//} +package com.mcwl.pay.config; + + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +@Data +@Configuration +@Component +public class AliConfig { + @Value("${mall.mgt.aliPayConfig.protocol}") + private String protocol; + @Value("${mall.mgt.aliPayConfig.gatewayHost}") + private String gatewayHost; + @Value("${mall.mgt.aliPayConfig.signType}") + private String signType; + @Value("${mall.mgt.aliPayConfig.appId}") + private String appId; + @Value("${mall.mgt.aliPayConfig.privateKey}") + private String privateKey; + @Value("${mall.mgt.aliPayConfig.appCertPath}") + private String appCertPath; + @Value("${mall.mgt.aliPayConfig.alipayCertPath}") + private String alipayCertPath; + @Value("${mall.mgt.aliPayConfig.alipayRootCertPath}") + private String alipayRootCertPath; + @Value("${mall.mgt.aliPayConfig.gatewayUrl}") + private String gatewayUrl; + @Value("${mall.mgt.aliPayConfig.notifyUrl}") + private String notifyUrl; +} diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java index 5cbc904..778647b 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java @@ -1,27 +1,27 @@ -//package com.mcwl.pay.service; -// -//import com.alipay.api.AlipayApiException; -//import com.mcwl.common.core.domain.AjaxResult; -//import com.mcwl.common.core.domain.R; -//import com.mcwl.pay.domain.OrderTradeDto; -//import com.mcwl.pay.domain.vo.PayVo; -// -//import javax.validation.constraints.NotNull; -//import java.io.FileNotFoundException; -// -//public interface AliPayService { -// String bindingCallback(String authCode, String state) throws FileNotFoundException; -// -// PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception; -// -// PayVo pointsPay(Double paymentAmount) throws Exception; -// -// R fetch(String amount) throws AlipayApiException, FileNotFoundException; -// -// // 查询订单状态 -// R queryTradeStatus(String outTradeNo) throws Exception; -// -// PayVo walletPay(Double amount) throws Exception; -// -// R queryBindStatus(); -//} +package com.mcwl.pay.service; + +import com.alipay.api.AlipayApiException; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.R; +import com.mcwl.pay.domain.OrderTradeDto; +import com.mcwl.pay.domain.vo.PayVo; + +import javax.validation.constraints.NotNull; +import java.io.FileNotFoundException; + +public interface AliPayService { + String bindingCallback(String authCode, String state) throws FileNotFoundException; + + PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception; + + PayVo pointsPay(Double paymentAmount) throws Exception; + + R fetch(String amount) throws AlipayApiException, FileNotFoundException; + + // 查询订单状态 + R queryTradeStatus(String outTradeNo) throws Exception; + + PayVo walletPay(Double amount) throws Exception; + + R queryBindStatus(); +} diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java index c5fb007..2c02e25 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java @@ -1,622 +1,582 @@ -//package com.mcwl.pay.service.impl; -// -//import cn.hutool.core.bean.BeanUtil; -//import cn.hutool.core.collection.CollUtil; -//import cn.hutool.core.io.resource.ClassPathResource; -//import cn.hutool.core.lang.UUID; -//import cn.hutool.extra.mail.MailUtil; -//import cn.hutool.json.JSONUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.alipay.api.AlipayApiException; -//import com.alipay.api.AlipayClient; -//import com.alipay.api.AlipayConfig; -//import com.alipay.api.DefaultAlipayClient; -//import com.alipay.api.domain.AlipayFundAccountQueryModel; -//import com.alipay.api.domain.AlipayFundTransUniTransferModel; -//import com.alipay.api.domain.AlipayTradeQueryModel; -//import com.alipay.api.domain.Participant; -//import com.alipay.api.internal.util.file.IOUtils; -//import com.alipay.api.request.AlipayFundAccountQueryRequest; -//import com.alipay.api.request.AlipayFundTransUniTransferRequest; -//import com.alipay.api.request.AlipaySystemOauthTokenRequest; -//import com.alipay.api.request.AlipayTradeQueryRequest; -//import com.alipay.api.response.AlipayFundAccountQueryResponse; -//import com.alipay.api.response.AlipayFundTransUniTransferResponse; -//import com.alipay.api.response.AlipaySystemOauthTokenResponse; -//import com.alipay.api.response.AlipayTradeQueryResponse; -//import com.alipay.easysdk.factory.Factory; -//import com.alipay.easysdk.kernel.Config; -//import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse; -//import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; -//import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; -//import com.mcwl.common.JSONUtils; -//import com.mcwl.common.constant.HttpStatus; -//import com.mcwl.common.core.domain.AjaxResult; -//import com.mcwl.common.core.domain.R; -//import com.mcwl.common.core.domain.entity.SysUser; -//import com.mcwl.common.core.redis.RedisCache; -//import com.mcwl.common.exception.ServiceException; -//import com.mcwl.common.utils.DateUtils; -//import com.mcwl.common.utils.SecurityUtils; -//import com.mcwl.common.utils.ShareCodeUtils; -//import com.mcwl.common.utils.StringUtils; -//import com.mcwl.memberCenter.domain.MemberLevel; -//import com.mcwl.memberCenter.service.MemberLevelService; -//import com.mcwl.pay.config.AliConfig; -//import com.mcwl.pay.domain.OrderTrade; -//import com.mcwl.pay.domain.OrderTradeDto; -//import com.mcwl.pay.domain.vo.PayVo; -//import com.mcwl.pay.service.AliPayService; -//import com.mcwl.pay.service.OrderTradeService; -//import com.mcwl.system.domain.SysUserPayAccount; -//import com.mcwl.system.domain.SysUserPayAccountLog; -//import com.mcwl.system.service.ISysUserPayAccountLogService; -//import com.mcwl.system.service.ISysUserPayAccountService; -//import com.mcwl.system.service.ISysUserService; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -//import org.springframework.stereotype.Component; -//import org.springframework.transaction.annotation.Transactional; -//import org.springframework.util.ResourceUtils; -// -//import java.io.FileNotFoundException; -//import java.math.BigDecimal; -//import java.math.RoundingMode; -//import java.text.SimpleDateFormat; -//import java.util.*; -//import java.util.concurrent.TimeUnit; -// -///** -// * 支付宝支付 -// */ -//@Component -//@Slf4j -//public class AliPayServiceImpl implements AliPayService { -// -// @Autowired -// private Config config; -// -// @Autowired -// private RedisCache redisCache; -// -// -// @Autowired -// private MemberLevelService memberLevelService; -// -// -// @Autowired -// private AliConfig aliConfig; -// -// @Autowired -// private ISysUserPayAccountService sysUserPayAccountService; -// -// @Autowired -// private ISysUserService sysUserService; -// -// @Autowired -// private ISysUserPayAccountLogService sysUserPayAccountLogService; -// -// @Autowired -// private OrderTradeService orderTradeService; -// -// @Autowired -// private ThreadPoolTaskExecutor threadPoolTaskExecutor; -// -// private final int MAX_RETRY = 3; // 最大重试次数 -// -// -// public AliPayServiceImpl(AliConfig aliConfig) { -// -// Config config = new Config(); -// config.protocol = "https"; -// config.signType = "RSA2"; -// config.appId = aliConfig.getAppId(); -// config.merchantPrivateKey = aliConfig.getPrivateKey(); -// config.merchantCertPath = aliConfig.getAppCertPath(); -// config.alipayCertPath = aliConfig.getAlipayCertPath(); -// config.alipayRootCertPath = aliConfig.getAlipayRootCertPath(); -// config.gatewayHost = aliConfig.getGatewayHost(); -// config.notifyUrl = aliConfig.getNotifyUrl(); -// -// Factory.setOptions(config); -// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param orderTradeDto 订单实体 -// * @return 二维码url -// * @throws Exception -// */ -//// public String orderPay(OrderTradeDto orderTradeDto) throws Exception { -//// Integer productId = orderTradeDto.getProductId(); -//// if (!Optional.ofNullable(productId).isPresent()) { -//// throw new ServiceException("mallProductId不能为空"); -//// } -//// -//// MallProduct mallProduct = mallProductService.getById(productId); -//// if (!Optional.ofNullable(mallProduct).isPresent()) { -//// throw new ServiceException("mallProduct不存在"); -//// } -//// -//// // 设置orderTrade信息 -//// OrderTrade tradeEntity = new OrderTrade(); -//// BeanUtil.copyProperties(orderTradeDto, tradeEntity); -//// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30)); -//// tradeEntity.setUserId(SecurityUtils.getUserId()); -//// tradeEntity.setUserName(SecurityUtils.getUsername()); -//// tradeEntity.setProductName(mallProduct.getProductName()); -//// -//// //调用支付宝的接口 -//// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -//// .preCreate(mallProduct.getProductName(), -//// tradeEntity.getCode() + "_product", -//// orderTradeDto.getPaymentAmount().toString()); -//// // 缓存到redis -//// redisCache.setCacheObject(tradeEntity.getCode() + "_product", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); -////// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); -//// //参照官方文档响应示例,解析返回结果 -//// String httpBodyStr = payResponse.getHttpBody(); -//// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -//// return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -//// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param orderTradeDto 订单实体 -// * @return 二维码url -// * @throws Exception -// */ -// @Override -// public PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception { -// -// // 会员等级id -// Long productId = orderTradeDto.getProductId(); -// -// if (!Optional.ofNullable(productId).isPresent()) { -// throw new ServiceException("memberLevelId不能为空"); -// } -// -// MemberLevel memberLevel = memberLevelService.getById(productId); -// -// if (!Optional.ofNullable(memberLevel).isPresent()) { -// throw new ServiceException("memberLevel不存在"); -// } -// -// // 设置orderTrade信息 -// OrderTrade tradeEntity = new OrderTrade(); -// BeanUtil.copyProperties(orderTradeDto, tradeEntity); -// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_member"); -// tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); -// tradeEntity.setProductId(productId); -// tradeEntity.setProductName(memberLevel.getMemberName()); -// tradeEntity.setTotalAmount(orderTradeDto.getAmount()); -// tradeEntity.setOrderStatus(1); -// tradeEntity.setPayStatus(1); -// orderTradeService.save(tradeEntity); -// -// //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// // 设置过期时间 -// .preCreate(memberLevel.getMemberName(), -// tradeEntity.getCode(), -// orderTradeDto.getAmount().toString()); -// // 缓存到redis -// if (Objects.nonNull(orderTradeDto.getPromotionId())) -// redisCache.setCacheObject(tradeEntity.getCode() + "_promotionId", orderTradeDto.getPromotionId(), 15, TimeUnit.MINUTES); -//// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); -// //参照官方文档响应示例,解析返回结果 -// String httpBodyStr = payResponse.getHttpBody(); -// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -// -// PayVo payVo = new PayVo(); -// payVo.setOrderNo(tradeEntity.getCode()); -// payVo.setUrl(jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString()); -// return payVo; -// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param paymentAmount 充值积分 -// * @return 二维码url -// * @throws Exception -// */ -// @Override -// public PayVo pointsPay(Double paymentAmount) throws Exception { -// // 设置orderTrade信息 -// OrderTrade tradeEntity = new OrderTrade(); -// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_points"); -// tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setProductId(-1L); -// tradeEntity.setProductName("积分充值"); -// tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); -// tradeEntity.setTotalAmount(paymentAmount); -// tradeEntity.setOrderStatus(1); -// tradeEntity.setPayStatus(1); -// orderTradeService.save(tradeEntity); -// //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// .preCreate(tradeEntity.getProductName(), -// tradeEntity.getCode(), -// paymentAmount.toString()); -// //参照官方文档响应示例,解析返回结果 -// String httpBodyStr = payResponse.getHttpBody(); -// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -// -// String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -// PayVo payVo = new PayVo(); -// payVo.setOrderNo(tradeEntity.getCode()); -// payVo.setUrl(url); -// -// return payVo; -// } -// -// -// /** -// * 调用支付宝预下订单接口 -// * -// * @param paymentAmount 充值金币 -// * @return 二维码url -// * @throws Exception -// */ -// @Override -// public PayVo walletPay(Double paymentAmount) throws Exception { -// // 设置orderTrade信息 -// OrderTrade tradeEntity = new OrderTrade(); -// tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_wallet"); -// tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setProductId(-1L); -// tradeEntity.setProductName("金币充值"); -// tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); -// tradeEntity.setTotalAmount(paymentAmount); -// tradeEntity.setOrderStatus(1); -// tradeEntity.setPayStatus(1); -// orderTradeService.save(tradeEntity); -// //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// .preCreate(tradeEntity.getProductName(), -// tradeEntity.getCode(), -// paymentAmount.toString()); -// //参照官方文档响应示例,解析返回结果 -// String httpBodyStr = payResponse.getHttpBody(); -// JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); -// -// String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); -// PayVo payVo = new PayVo(); -// payVo.setOrderNo(tradeEntity.getCode()); -// payVo.setUrl(url); -// -// return payVo; -// } -// -// /** -// * 查询支付宝账户绑定状态 -// * -// * @return 0:未绑定,1:已绑定 -// */ -// @Override -// public R queryBindStatus() { -// -// // 查询redis中支付宝绑定状态 -// String bindStatus = redisCache.getCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId()); -// -// if (Objects.nonNull(bindStatus)) { -// return R.ok(bindStatus); -// } -// -// SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() -// .eq(SysUserPayAccount::getUserId, SecurityUtils.getUserId()) -// .eq(SysUserPayAccount::getAppId, aliConfig.getAppId()) -// .eq(SysUserPayAccount::getType, 0) -// .one(); -// -// if (Objects.isNull(sysUserPayAccount)) { -// redisCache.setCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId(), "0", 4, TimeUnit.SECONDS); -// return R.ok("0"); -// } -// redisCache.setCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId(), "1", 4, TimeUnit.SECONDS); -// return R.ok("1"); -// } -// -// /** -// * 支付宝转账方法 -// * -// * @param amount 转账金额 -// * @return 返回支付宝转账响应的内容 -// */ -// @Override -// @Transactional(rollbackFor = Exception.class) -// public R fetch(String amount) throws AlipayApiException, FileNotFoundException { -// Long userId = SecurityUtils.getUserId(); -// SysUser sysUser = sysUserService.selectUserById(userId); -// if (sysUser.getWallet() < Double.parseDouble(amount)) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"钱包余额不足"); -// } -// -// // 初始化SDK -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// -// // 构造请求参数以调用接口 -// AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); -// AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); -// // 设置商家侧唯一订单号 -// model.setOutBizNo(UUID.fastUUID().toString(true)); -// -// // 设置订单总金额 -// model.setTransAmount(amount); -// -// // 设置描述特定的业务场景 -// model.setBizScene("DIRECT_TRANSFER"); -// -// // 设置业务产品码 -// model.setProductCode("TRANS_ACCOUNT_NO_PWD"); -// -// // 设置转账业务的标题 -// model.setOrderTitle("提现"); -// -// // 查询用户支付宝账户 -// SysUserPayAccount sysUserPayAccount = sysUserPayAccountService -// .lambdaQuery() -// .eq(SysUserPayAccount::getUserId, userId) -// .eq(SysUserPayAccount::getType, 0) -// .one(); -// if (Objects.isNull(sysUserPayAccount)) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"请先绑定支付宝账号"); -// } -// -// // 收款方信息 -// Participant payeeInfo = new Participant(); -// -// // 沙箱环境 -//// payeeInfo.setIdentity("2088722057445020"); -//// payeeInfo.setIdentityType("ALIPAY_USER_ID"); -// -//// 线上环境 -// payeeInfo.setIdentity(sysUserPayAccount.getOpenId()); -// payeeInfo.setIdentityType("ALIPAY_OPEN_ID"); -// model.setPayeeInfo(payeeInfo); -// -// request.setBizModel(model); -// -// // 添加提现记录和修改用户钱包 -// this.addLogAndUpdateUserWallet(sysUser, amount); -// -// // 证书用:certificateExecute(request),密钥用:execute(request) -// AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); -// System.out.println(response.getBody()); -// -// if (response.isSuccess()) { -// -// return R.ok("提现成功"); -// } -// -// if (response.getSubCode().equals("PAYER_BALANCE_NOT_ENOUGH")) { -// // 账户余额不足,发送邮件通知 -// ArrayList tos = CollUtil.newArrayList("2119157836@qq.com"); -// -// String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount); -// MailUtil.send(tos, "魔创未来", content, false); -// throw new ServiceException("网络连接出错,请稍后再试"); -// } -// System.out.println("用户" + SecurityUtils.getLoginUser().getUser().getNickName() + "提现失败:" + response.getSubMsg()); -// throw new ServiceException("提现失败"); -// } -// -// @Override -// public R queryTradeStatus(String outTradeNo) throws Exception { -// -// // 查询redis中订单信息 -// String orderTradeJson = redisCache.getCacheObject(outTradeNo); -// OrderTrade orderTrade = null; -// if (StringUtils.isNotBlank(orderTradeJson)) { -// orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); -// } -// // 如果redis中存在该订单, 则直接返回该订单的支付状态 -// if (Objects.nonNull(orderTrade)) { -// return R.ok(orderTrade.getOrderStatus()); -// } -// -// // 查询支付宝订单 -// orderTrade = orderTradeService.lambdaQuery() -// .eq(OrderTrade::getCode, outTradeNo) -// .one(); -// -// // 如果数据库中不存在该订单, 则返回订单不存在 -// if (Objects.isNull(orderTrade)) { -// return R.fail(HttpStatus.SHOW_ERROR_MSG,"订单不存在"); -// } -// -// -// if (orderTrade.getPayStatus() == 1) { -// // 查询支付宝订单 -// AlipayTradeQueryResponse tradStatus; -// try { -// tradStatus = this.getTradStatus(outTradeNo); -// } catch (Exception e) { -// log.error("支付状态获取失败,原始内容: {}", e.getMessage()); -// return R.ok(0); -// } -// -// // 返回交易结果, 是否交易成功需要根据该对象中的 trade_status 来确定 -// // trade_status 的枚举值如下, 请见 https://opendocs.alipay.com/apis/api_1/alipay.trade.query -// // WAIT_BUYER_PAY(交易创建,等待买家付款) -// // TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款) -// // TRADE_SUCCESS(交易支付成功) -// // TRADE_FINISHED(交易结束,不可退款) -// // 当 trade_status 等于 TRADE_SUCCESS 或 TRADE_FINISHED 时, 表示支付成功 -// -// String tradeStatus = tradStatus.getTradeStatus(); -// if (Objects.nonNull(tradeStatus) && tradeStatus.equals("TRADE_SUCCESS")) { -// Map params = new HashMap<>(); -// params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount()); -// params.put("out_trade_no", tradStatus.getOutTradeNo()); -// params.put("gmt_payment",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tradStatus.getSendPayDate())); -// params.put("total_amount", tradStatus.getTotalAmount()); -// params.put("trade_no", tradStatus.getTradeNo()); -// String code = orderTrade.getCode(); -// // 获取订单后缀 -// String suffix = code.substring(code.lastIndexOf("_") + 1); -// orderTradeService.orderHandler(orderTrade, suffix, params); -// return R.ok(orderTrade.getOrderStatus()); -// } -// long time = (System.currentTimeMillis() - orderTrade.getCreateTime().getTime()) / 1000 / 60; -// // time 超过15分钟,则删除redis中订单信息 -// if (time >= 1) { -// -// this.cancelTrade(orderTrade); -// -// } -// } -// -// redisCache.setCacheObject(outTradeNo, JSONUtil.toJsonStr(orderTrade), 4, TimeUnit.SECONDS); -// return R.ok(orderTrade.getOrderStatus()); -// } -// -// @Override -// public String bindingCallback(String authCode, String state) throws FileNotFoundException { -// try { -// Long userId = ShareCodeUtils.codeToId(state); -// if (Objects.isNull(userId)) { -// return "fail"; -// } -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); -// request.setCode(authCode); -// request.setGrantType("authorization_code"); -// AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request); -// if (response.isSuccess()) { -// // 支付宝用户唯一ID -// String openId = response.getOpenId(); -// // 判断是否已经绑定过 -// SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() -// .eq(SysUserPayAccount::getUserId, userId) -// .eq(SysUserPayAccount::getAppId, aliConfig.getAppId()) -// .eq(SysUserPayAccount::getType, 0) -// .one(); -// if (Objects.nonNull(sysUserPayAccount)) { -// // 已经绑定过,直接返回 -// return "success"; -// } -// System.out.println("绑定成功!openId:" + openId); -// // 将openId与当前商城用户绑定(保存到数据库) -// SysUserPayAccount userPayAccount = new SysUserPayAccount(); -// userPayAccount.setUserId(userId); -// userPayAccount.setAppId(aliConfig.getAppId()); -// userPayAccount.setOpenId(openId); -// userPayAccount.setType(0); -// sysUserPayAccountService.save(userPayAccount); -// redisCache.setCacheObject("alipay:bind:user:status:" + userId, "1", 4, TimeUnit.SECONDS); -// return "success"; -// } else { -// System.out.println("绑定失败:" + response.getSubMsg()); -// redisCache.setCacheObject("alipay:bind:user:status:" + userId, "0", 4, TimeUnit.SECONDS); -// return "fail"; -// } -// } catch (AlipayApiException e) { -// return "fail"; -// } -// -// } -// -// -// private void cancelTrade(OrderTrade orderTrade) throws Exception { -// -// threadPoolTaskExecutor.execute(() -> { -// try { -// for (int i = 0; i < MAX_RETRY; i++) { -// // 撤销交易 -// AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(orderTrade.getCode()); -// if (cancel.getMsg().equals("Success")) { -// orderTrade.setOrderStatus(4); -// orderTradeService.updateById(orderTrade); -// redisCache.deleteObject(orderTrade.getCode() + "promotionId"); -// break; -// } else { -// // 检查是否需要继续重试 -// if (!"Y".equals(cancel.getRetryFlag())) { -// break; -// } -// } -// Thread.sleep(2000); // 间隔2秒重试 -// } -// } catch (Exception e) { -// throw new RuntimeException(e); -// } -// }); -// -// } -// -// private AlipayTradeQueryResponse getTradStatus(String outTradeNo) throws Exception { -// // 初始化SDK -// AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); -// -// // 构造请求参数以调用接口 -// AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); -// AlipayTradeQueryModel model = new AlipayTradeQueryModel(); -// -// // 设置订单支付时传入的商户订单号 -// model.setOutTradeNo(outTradeNo); -// -// request.setBizModel(model); -// -// AlipayTradeQueryResponse response = alipayClient.certificateExecute(request); -// return response; -// } -// -// private void addLogAndUpdateUserWallet(SysUser sysUser, String amount) { -// BigDecimal wallet = new BigDecimal(sysUser.getWallet().toString()); -// BigDecimal amountBigDecimal = new BigDecimal(amount); -// sysUser.setWallet(wallet.subtract(amountBigDecimal).setScale(2, RoundingMode.HALF_UP).doubleValue()); -// sysUserService.updateUser(sysUser); -// -// // 添加记录 -// SysUserPayAccountLog sysUserPayAccountLog = new SysUserPayAccountLog(); -// sysUserPayAccountLog.setUserId(sysUser.getUserId()); -// sysUserPayAccountLog.setAmount(Double.valueOf(amount)); -// sysUserPayAccountLog.setAccount("支付宝"); -// sysUserPayAccountLogService.save(sysUserPayAccountLog); -// } -// -// public AlipayConfig getAlipayConfig() throws FileNotFoundException { -// -// AlipayConfig config = new AlipayConfig(); -// -// // 设置网关地址 -// config.setServerUrl(aliConfig.getGatewayUrl()); -// -// // 设置应用ID -// config.setAppId(aliConfig.getAppId()); -// -// // 设置应用私钥 -// config.setPrivateKey(aliConfig.getPrivateKey()); -// -// // 设置支付宝公钥,因为配置了证书,所以不需要设置支付宝公钥 -//// config.setAlipayPublicKey(aliConfig.getPublicKey()); -// -// // 设置应用公钥证书路径(线上) -//// config.setAppCertPath(getClass().getResource("/cert/appCertPublicKey.crt").getPath()); -// // 设置应用公钥证书路径(沙箱) -// config.setAppCertPath(aliConfig.getAppCertPath()); -// -// // 设置支付宝公钥证书路径 -// config.setAlipayPublicCertPath(aliConfig.getAlipayCertPath()); -// -// // 设置支付宝根证书路径 -// config.setRootCertPath(aliConfig.getAlipayRootCertPath()); -// -// // 设置字符编码格式 -// config.setCharset("UTF-8"); -// -// // 设置签名类型 -// config.setSignType("RSA2"); -// -// return config; -// } -//} +package com.mcwl.pay.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.core.lang.UUID; +import cn.hutool.extra.mail.MailUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayFundAccountQueryModel; +import com.alipay.api.domain.AlipayFundTransUniTransferModel; +import com.alipay.api.domain.AlipayTradeQueryModel; +import com.alipay.api.domain.Participant; +import com.alipay.api.internal.util.file.IOUtils; +import com.alipay.api.request.AlipayFundAccountQueryRequest; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import com.alipay.api.request.AlipayTradeQueryRequest; +import com.alipay.api.response.AlipayFundAccountQueryResponse; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import com.alipay.api.response.AlipaySystemOauthTokenResponse; +import com.alipay.api.response.AlipayTradeQueryResponse; +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.alipay.easysdk.payment.common.models.AlipayTradeCancelResponse; +import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.mcwl.common.JSONUtils; +import com.mcwl.common.constant.HttpStatus; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.R; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.exception.ServiceException; +import com.mcwl.common.utils.DateUtils; +import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.common.utils.ShareCodeUtils; +import com.mcwl.common.utils.StringUtils; +import com.mcwl.memberCenter.domain.MemberLevel; +import com.mcwl.memberCenter.service.MemberLevelService; +import com.mcwl.pay.config.AliConfig; +import com.mcwl.pay.domain.OrderTrade; +import com.mcwl.pay.domain.OrderTradeDto; +import com.mcwl.pay.domain.vo.PayVo; +import com.mcwl.pay.service.AliPayService; +import com.mcwl.pay.service.OrderTradeService; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.domain.SysUserPayAccountLog; +import com.mcwl.system.service.ISysUserPayAccountLogService; +import com.mcwl.system.service.ISysUserPayAccountService; +import com.mcwl.system.service.ISysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ResourceUtils; + +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * 支付宝支付 + */ +@Component +@Slf4j +public class AliPayServiceImpl implements AliPayService { + + @Autowired + private Config config; + + @Autowired + private RedisCache redisCache; + + + @Autowired + private MemberLevelService memberLevelService; + + + @Autowired + private AliConfig aliConfig; + + @Autowired + private ISysUserPayAccountService sysUserPayAccountService; + + @Autowired + private ISysUserService sysUserService; + + @Autowired + private ISysUserPayAccountLogService sysUserPayAccountLogService; + + @Autowired + private OrderTradeService orderTradeService; + + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + private final int MAX_RETRY = 3; // 最大重试次数 + + + public AliPayServiceImpl(AliConfig aliConfig) { + + Config config = new Config(); + config.protocol = "https"; + config.signType = "RSA2"; + config.appId = aliConfig.getAppId(); + config.merchantPrivateKey = aliConfig.getPrivateKey(); + config.merchantCertPath = aliConfig.getAppCertPath(); + config.alipayCertPath = aliConfig.getAlipayCertPath(); + config.alipayRootCertPath = aliConfig.getAlipayRootCertPath(); + config.gatewayHost = aliConfig.getGatewayHost(); + config.notifyUrl = aliConfig.getNotifyUrl(); + + Factory.setOptions(config); + } + + + /** + * 调用支付宝预下订单接口 + * + * @param orderTradeDto 订单实体 + * @return 二维码url + * @throws Exception + */ + @Override + public PayVo memberPay(OrderTradeDto orderTradeDto) throws Exception { + + // 会员等级id + Long productId = orderTradeDto.getProductId(); + + if (!Optional.ofNullable(productId).isPresent()) { + throw new ServiceException("memberLevelId不能为空"); + } + + MemberLevel memberLevel = memberLevelService.getById(productId); + + if (!Optional.ofNullable(memberLevel).isPresent()) { + throw new ServiceException("memberLevel不存在"); + } + + // 设置orderTrade信息 + OrderTrade tradeEntity = new OrderTrade(); + BeanUtil.copyProperties(orderTradeDto, tradeEntity); + tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_member"); + tradeEntity.setUserId(SecurityUtils.getUserId()); + tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); + tradeEntity.setProductId(productId); + tradeEntity.setProductName(memberLevel.getMemberName()); + tradeEntity.setTotalAmount(orderTradeDto.getAmount()); + tradeEntity.setOrderStatus(1); + tradeEntity.setPayStatus(1); + orderTradeService.save(tradeEntity); + + //调用支付宝的接口 + AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() + // 设置过期时间 + .preCreate(memberLevel.getMemberName(), + tradeEntity.getCode(), + orderTradeDto.getAmount().toString()); + // 缓存到redis + if (Objects.nonNull(orderTradeDto.getPromotionId())) { + redisCache.setCacheObject(tradeEntity.getCode() + "_promotionId", orderTradeDto.getPromotionId(), 15, TimeUnit.MINUTES); + } +// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); + //参照官方文档响应示例,解析返回结果 + String httpBodyStr = payResponse.getHttpBody(); + JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); + + PayVo payVo = new PayVo(); + payVo.setOrderNo(tradeEntity.getCode()); + payVo.setUrl(jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString()); + return payVo; + } + + + /** + * 调用支付宝预下订单接口 + * + * @param paymentAmount 充值积分 + * @return 二维码url + * @throws Exception + */ + @Override + public PayVo pointsPay(Double paymentAmount) throws Exception { + // 设置orderTrade信息 + OrderTrade tradeEntity = new OrderTrade(); + tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_points"); + tradeEntity.setUserId(SecurityUtils.getUserId()); + tradeEntity.setProductId(-1L); + tradeEntity.setProductName("积分充值"); + tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); + tradeEntity.setTotalAmount(paymentAmount); + tradeEntity.setOrderStatus(1); + tradeEntity.setPayStatus(1); + orderTradeService.save(tradeEntity); + //调用支付宝的接口 + AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() + .preCreate(tradeEntity.getProductName(), + tradeEntity.getCode(), + paymentAmount.toString()); + //参照官方文档响应示例,解析返回结果 + String httpBodyStr = payResponse.getHttpBody(); + JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); + + String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); + PayVo payVo = new PayVo(); + payVo.setOrderNo(tradeEntity.getCode()); + payVo.setUrl(url); + + return payVo; + } + + + /** + * 调用支付宝预下订单接口 + * + * @param paymentAmount 充值金币 + * @return 二维码url + * @throws Exception + */ + @Override + public PayVo walletPay(Double paymentAmount) throws Exception { + // 设置orderTrade信息 + OrderTrade tradeEntity = new OrderTrade(); + tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_wallet"); + tradeEntity.setUserId(SecurityUtils.getUserId()); + tradeEntity.setProductId(-1L); + tradeEntity.setProductName("金币充值"); + tradeEntity.setUserName(SecurityUtils.getLoginUser().getUser().getNickName()); + tradeEntity.setTotalAmount(paymentAmount); + tradeEntity.setOrderStatus(1); + tradeEntity.setPayStatus(1); + orderTradeService.save(tradeEntity); + //调用支付宝的接口 + AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() + .preCreate(tradeEntity.getProductName(), + tradeEntity.getCode(), + paymentAmount.toString()); + //参照官方文档响应示例,解析返回结果 + String httpBodyStr = payResponse.getHttpBody(); + JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); + + String url = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); + PayVo payVo = new PayVo(); + payVo.setOrderNo(tradeEntity.getCode()); + payVo.setUrl(url); + + return payVo; + } + + /** + * 查询支付宝账户绑定状态 + * + * @return 0:未绑定,1:已绑定 + */ + @Override + public R queryBindStatus() { + + // 查询redis中支付宝绑定状态 + String bindStatus = redisCache.getCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId()); + + if (Objects.nonNull(bindStatus)) { + return R.ok(bindStatus); + } + + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() + .eq(SysUserPayAccount::getUserId, SecurityUtils.getUserId()) + .eq(SysUserPayAccount::getAppId, aliConfig.getAppId()) + .eq(SysUserPayAccount::getType, 0) + .one(); + + if (Objects.isNull(sysUserPayAccount)) { + redisCache.setCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId(), "0", 4, TimeUnit.SECONDS); + return R.ok("0"); + } + redisCache.setCacheObject("alipay:bind:user:status:" + SecurityUtils.getUserId(), "1", 4, TimeUnit.SECONDS); + return R.ok("1"); + } + + /** + * 支付宝转账方法 + * + * @param amount 转账金额 + * @return 返回支付宝转账响应的内容 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R fetch(String amount) throws AlipayApiException, FileNotFoundException { + Long userId = SecurityUtils.getUserId(); + SysUser sysUser = sysUserService.selectUserById(userId); + if (sysUser.getWallet() < Double.parseDouble(amount)) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"钱包余额不足"); + } + + // 初始化SDK + AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); + + // 构造请求参数以调用接口 + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + // 设置商家侧唯一订单号 + model.setOutBizNo(UUID.fastUUID().toString(true)); + + // 设置订单总金额 + model.setTransAmount(amount); + + // 设置描述特定的业务场景 + model.setBizScene("DIRECT_TRANSFER"); + + // 设置业务产品码 + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + + // 设置转账业务的标题 + model.setOrderTitle("提现"); + + // 查询用户支付宝账户 + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService + .lambdaQuery() + .eq(SysUserPayAccount::getUserId, userId) + .eq(SysUserPayAccount::getType, 0) + .one(); + if (Objects.isNull(sysUserPayAccount)) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"请先绑定支付宝账号"); + } + + // 收款方信息 + Participant payeeInfo = new Participant(); + + // 沙箱环境 +// payeeInfo.setIdentity("2088722057445020"); +// payeeInfo.setIdentityType("ALIPAY_USER_ID"); + +// 线上环境 + payeeInfo.setIdentity(sysUserPayAccount.getOpenId()); + payeeInfo.setIdentityType("ALIPAY_OPEN_ID"); + model.setPayeeInfo(payeeInfo); + + request.setBizModel(model); + + // 添加提现记录和修改用户钱包 + this.addLogAndUpdateUserWallet(sysUser, amount); + + // 证书用:certificateExecute(request),密钥用:execute(request) + AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + System.out.println(response.getBody()); + + if (response.isSuccess()) { + + return R.ok("提现成功"); + } + + if (response.getSubCode().equals("PAYER_BALANCE_NOT_ENOUGH")) { + // 账户余额不足,发送邮件通知 + ArrayList tos = CollUtil.newArrayList("2119157836@qq.com"); + + String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount); + MailUtil.send(tos, "魔创未来", content, false); + throw new ServiceException("网络连接出错,请稍后再试"); + } + System.out.println("用户" + SecurityUtils.getLoginUser().getUser().getNickName() + "提现失败:" + response.getSubMsg()); + throw new ServiceException("提现失败"); + } + + @Override + public R queryTradeStatus(String outTradeNo) throws Exception { + + // 查询redis中订单信息 + String orderTradeJson = redisCache.getCacheObject(outTradeNo); + OrderTrade orderTrade = null; + if (StringUtils.isNotBlank(orderTradeJson)) { + orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); + } + // 如果redis中存在该订单, 则直接返回该订单的支付状态 + if (Objects.nonNull(orderTrade)) { + return R.ok(orderTrade.getOrderStatus()); + } + + // 查询支付宝订单 + orderTrade = orderTradeService.lambdaQuery() + .eq(OrderTrade::getCode, outTradeNo) + .one(); + + // 如果数据库中不存在该订单, 则返回订单不存在 + if (Objects.isNull(orderTrade)) { + return R.fail(HttpStatus.SHOW_ERROR_MSG,"订单不存在"); + } + + + if (orderTrade.getPayStatus() == 1) { + // 查询支付宝订单 + AlipayTradeQueryResponse tradStatus; + try { + tradStatus = this.getTradStatus(outTradeNo); + } catch (Exception e) { + log.error("支付状态获取失败,原始内容: {}", e.getMessage()); + return R.ok(0); + } + + // 返回交易结果, 是否交易成功需要根据该对象中的 trade_status 来确定 + // trade_status 的枚举值如下, 请见 https://opendocs.alipay.com/apis/api_1/alipay.trade.query + // WAIT_BUYER_PAY(交易创建,等待买家付款) + // TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款) + // TRADE_SUCCESS(交易支付成功) + // TRADE_FINISHED(交易结束,不可退款) + // 当 trade_status 等于 TRADE_SUCCESS 或 TRADE_FINISHED 时, 表示支付成功 + + String tradeStatus = tradStatus.getTradeStatus(); + if (Objects.nonNull(tradeStatus) && tradeStatus.equals("TRADE_SUCCESS")) { + Map params = new HashMap<>(); + params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount()); + params.put("out_trade_no", tradStatus.getOutTradeNo()); + params.put("gmt_payment",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tradStatus.getSendPayDate())); + params.put("total_amount", tradStatus.getTotalAmount()); + params.put("trade_no", tradStatus.getTradeNo()); + String code = orderTrade.getCode(); + // 获取订单后缀 + String suffix = code.substring(code.lastIndexOf("_") + 1); + orderTradeService.orderHandler(orderTrade, suffix, params); + return R.ok(orderTrade.getOrderStatus()); + } + long time = (System.currentTimeMillis() - orderTrade.getCreateTime().getTime()) / 1000 / 60; + // time 超过15分钟,则删除redis中订单信息 + if (time >= 1) { + + this.cancelTrade(orderTrade); + + } + } + + redisCache.setCacheObject(outTradeNo, JSONUtil.toJsonStr(orderTrade), 4, TimeUnit.SECONDS); + return R.ok(orderTrade.getOrderStatus()); + } + + @Override + public String bindingCallback(String authCode, String state) throws FileNotFoundException { + try { + Long userId = ShareCodeUtils.codeToId(state); + if (Objects.isNull(userId)) { + return "fail"; + } + AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + request.setCode(authCode); + request.setGrantType("authorization_code"); + AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request); + if (response.isSuccess()) { + // 支付宝用户唯一ID + String openId = response.getOpenId(); + // 判断是否已经绑定过 + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() + .eq(SysUserPayAccount::getUserId, userId) + .eq(SysUserPayAccount::getAppId, aliConfig.getAppId()) + .eq(SysUserPayAccount::getType, 0) + .one(); + if (Objects.nonNull(sysUserPayAccount)) { + // 已经绑定过,直接返回 + return "success"; + } + System.out.println("绑定成功!openId:" + openId); + // 将openId与当前商城用户绑定(保存到数据库) + SysUserPayAccount userPayAccount = new SysUserPayAccount(); + userPayAccount.setUserId(userId); + userPayAccount.setAppId(aliConfig.getAppId()); + userPayAccount.setOpenId(openId); + userPayAccount.setType(0); + sysUserPayAccountService.save(userPayAccount); + redisCache.setCacheObject("alipay:bind:user:status:" + userId, "1", 4, TimeUnit.SECONDS); + return "success"; + } else { + System.out.println("绑定失败:" + response.getSubMsg()); + redisCache.setCacheObject("alipay:bind:user:status:" + userId, "0", 4, TimeUnit.SECONDS); + return "fail"; + } + } catch (AlipayApiException e) { + return "fail"; + } + + } + + + private void cancelTrade(OrderTrade orderTrade) throws Exception { + + threadPoolTaskExecutor.execute(() -> { + try { + for (int i = 0; i < MAX_RETRY; i++) { + // 撤销交易 + AlipayTradeCancelResponse cancel = Factory.Payment.Common().cancel(orderTrade.getCode()); + if (cancel.getMsg().equals("Success")) { + orderTrade.setOrderStatus(4); + orderTradeService.updateById(orderTrade); + redisCache.deleteObject(orderTrade.getCode() + "promotionId"); + break; + } else { + // 检查是否需要继续重试 + if (!"Y".equals(cancel.getRetryFlag())) { + break; + } + } + Thread.sleep(2000); // 间隔2秒重试 + } + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + } + + private AlipayTradeQueryResponse getTradStatus(String outTradeNo) throws Exception { + // 初始化SDK + AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); + + // 构造请求参数以调用接口 + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + AlipayTradeQueryModel model = new AlipayTradeQueryModel(); + + // 设置订单支付时传入的商户订单号 + model.setOutTradeNo(outTradeNo); + + request.setBizModel(model); + + AlipayTradeQueryResponse response = alipayClient.certificateExecute(request); + return response; + } + + private void addLogAndUpdateUserWallet(SysUser sysUser, String amount) { + BigDecimal wallet = new BigDecimal(sysUser.getWallet().toString()); + BigDecimal amountBigDecimal = new BigDecimal(amount); + sysUser.setWallet(wallet.subtract(amountBigDecimal).setScale(2, RoundingMode.HALF_UP).doubleValue()); + sysUserService.updateUser(sysUser); + + // 添加记录 + SysUserPayAccountLog sysUserPayAccountLog = new SysUserPayAccountLog(); + sysUserPayAccountLog.setUserId(sysUser.getUserId()); + sysUserPayAccountLog.setAmount(Double.valueOf(amount)); + sysUserPayAccountLog.setAccount("支付宝"); + sysUserPayAccountLogService.save(sysUserPayAccountLog); + } + + public AlipayConfig getAlipayConfig() throws FileNotFoundException { + + AlipayConfig config = new AlipayConfig(); + + // 设置网关地址 + config.setServerUrl(aliConfig.getGatewayUrl()); + + // 设置应用ID + config.setAppId(aliConfig.getAppId()); + + // 设置应用私钥 + config.setPrivateKey(aliConfig.getPrivateKey()); + + // 设置支付宝公钥,因为配置了证书,所以不需要设置支付宝公钥 +// config.setAlipayPublicKey(aliConfig.getPublicKey()); + + // 设置应用公钥证书路径(线上) +// config.setAppCertPath(getClass().getResource("/cert/appCertPublicKey.crt").getPath()); + // 设置应用公钥证书路径(沙箱) + config.setAppCertPath(aliConfig.getAppCertPath()); + + // 设置支付宝公钥证书路径 + config.setAlipayPublicCertPath(aliConfig.getAlipayCertPath()); + + // 设置支付宝根证书路径 + config.setRootCertPath(aliConfig.getAlipayRootCertPath()); + + // 设置字符编码格式 + config.setCharset("UTF-8"); + + // 设置签名类型 + config.setSignType("RSA2"); + + return config; + } +}