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 a70a6d0..a6cf8c4 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"); - // 线上 +//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 +//// ); +// // 沙箱 // String authUrl = String.format( -// "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", +// "https://openauth-sandbox.dl.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", // appId, scope, encodedRedirectUri, state // ); - // 沙箱 - 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("/balance") -// @ResponseBody -// public AjaxResult balance() throws AlipayApiException { -// String balance = aliPayService.balance(); -// return AjaxResult.success(balance); +// +//// QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); +// return R.ok(authUrl, "成功"); // } - - - /** - * 支付接口 - * - * @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); +// +// /** +// * 支付宝绑定状态查询 +// */ +// @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("/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"; // } - } else { - // 验签失败 - System.out.println("验签失败"); - } - } else { - // 验签失败 - System.out.println("验签失败"); - } - - return "success"; - } - - -} +// // 获取订单后缀 +// 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"; +// } +// +// +//} 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 b073694..271e775 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,"用户未登录"); - } - 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("关闭成功"); -// } -// return AjaxResult.error("关闭失败"); +//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("/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("关闭失败"); +// +// +// /** +// * 查询列表 +// */ +// @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("关闭成功"); +//// } +//// 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-admin/src/main/resources/application-dev.yml b/mcwl-admin/src/main/resources/application-dev.yml index 7f4ed8f..33112d1 100644 --- a/mcwl-admin/src/main/resources/application-dev.yml +++ b/mcwl-admin/src/main/resources/application-dev.yml @@ -144,12 +144,12 @@ mall: appId: 9021000135682614 # 沙箱应用私钥 privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCQxmQGcaiKjOhayWi+zNTvpp8B5YT8jFFkjLzrD+W+T2Dwf2GfFR4p95zsCJxYeoLWdghMPA6/GMFrLbuVFpaEjuTm4icqA9N8n5d3W0j7gh+wMjZoqyJclAIeb09ut7rY6mWzilA9kWmZnUG7MOWIU70RVRYrfJectCFw/odM9lG4XIVe13X2h+1ecTQyQzLWmnvKFCfo7dQjE7fIYiWfud1ZGUneNs3u73pNWMB6ThGTTCbs0atcgM3fYOg3q7fTxIu9VcaUCJiJ/kNbL9sVEyOrSyx2f2o6w06zdEaOiQFsuDeS8QPYGMg7pf42wAfqCO6hqxQiQT5vp1hvB0o1AgMBAAECggEAIhaEYLwMSispXo8D2cES9iaOU/z91hUX6Qv2Q4anuqqoEZh8nN91Db6etTjFz1NxURvTklelxTsH97t56n26DRY0MWTYgd0Kw9Iz8MeOpKGb4nnAM97vpUq4QQBGfLRIC2ENdzu+7vA5JBFR88hsky/cWaNmJ/EbJauIIDneE7GigMR2HF7kfzdZzOBN4ZEh/ef5NKeCnEieRJJhWRgrgNXVZ44Tqi67AM7ey9pyUtBe7fgzxXtrWXBN9yKaVxxSXm3KJXFQqA6mcilFVZaxMNlAySc4MPTW8lq0ozOCOCunoeIphNz/OVIxGu3/voXFXlBfOKqOkYMVZxMY6OrvtQKBgQD0nIlXK4VW72VaGpz9kxQkRNzJV/yqaqet1GOSlPM2l0RCRFOVVdnvbQdHGPe6+HxHL1dh5MP8T/aHoP+4UXkkQCc8moS2FZxJvFH2QTSZBcSSdGL7GMpROqs38J+XlJzrhNcB20lrW6D7yMeQa4YEcXwdbD8Er/YaIqODBWYYewKBgQCXg+16RLDArciwwhf0TBWZPor2iYFDdwU5UPu7CKOhU1MLfQhG85gGpXHjB6G8cMUi/ezxh/FEl+sWOZegpkPwL5/BQS9tNYWIaC4kipPF/a5Up4DMYUHVAuuPwNqqXpvgU+rGjCns0wtPRnjrkghLkc3oTSID7o7pzUwIk2whDwKBgAys3+EIfExY82OL5X6uVGjcuKQmTw11oWK8krxRw5iclgjpCXu/ix+BAtOIU634mlgF9/02oYE9k4TLrvSaJDDgsifNyfq1e/fGLmkYT+VuCxWbulVQn4s+AwlPCrYMGWWK6KlL9638fYcOjGjLaZJpXwkXRtyzUYlhKh/r87JpAoGBAIavRp2mi/xrPvgpQQPv0k9L8llfOCHRnjoqC+thrZsNp8eRmJcBmMVnskofEZ2iHQuS71pw/n58EQTLo0ayJbhPjVJL8K3CovXzrfjbmqqoa5xi3bJQTiXdF6rMw1QpD6Uk05E1LVuQ6v/IZFr7kBYlAQWb8z3NhQq+bPU+nyLvAoGAGpBbSM8gPzdWQqkHoos0icu3cj0GhN3MU7+1Eb/rsXyh/lk5wtZTEnHjwhdUOUtwVNjvrv7CzA7unhOoaM6YcE/Zpd4zt8pjqH1Mhds7UHf4Xg+A+J4G6meYnhSwfBpOub02ncsqfBlXE0qhFv6AvcMewWndyLb8EYaUUXTYkG0= - # 线上应用公钥证书 - appCertPath: /opt/cert/pro/appCertPublicKey_2021005119630093.crt - # 线上支付宝公钥证书路径 - alipayCertPath: /opt/cert/pro/alipayCertPublicKey_RSA2.crt - # 线上支付宝根证书路径 - alipayRootCertPath: /opt/cert/pro/alipayRootCert.crt +# # 线上应用公钥证书 +# appCertPath: /opt/cert/pro/appCertPublicKey_2021005119630093.crt +# # 线上支付宝公钥证书路径 +# alipayCertPath: /opt/cert/pro/alipayCertPublicKey_RSA2.crt +# # 线上支付宝根证书路径 +# alipayRootCertPath: /opt/cert/pro/alipayRootCert.crt # # 沙箱应用公钥证书 # appCertPath: D:\workspace\mochuang\mcwl-ai\mcwl-admin\src\main\resources\cert\dev\alipayPublicCert.crt # # 沙箱支付宝公钥证书路径 diff --git a/mcwl-admin/src/test/java/com/mcwl/TestMQTT.java b/mcwl-admin/src/test/java/com/mcwl/TestMQTT.java deleted file mode 100644 index 54bb221..0000000 --- a/mcwl-admin/src/test/java/com/mcwl/TestMQTT.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.mcwl; - - -import com.mcwl.resource.util.MqttTemplate; -import lombok.RequiredArgsConstructor; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@SpringBootTest(classes = McWlApplication.class) -@RunWith(SpringRunner.class) -@RequiredArgsConstructor -public class TestMQTT { - - private final MqttTemplate mqttTemplate; - - @Test - public void publishTest() throws Exception { - mqttTemplate.publish("workFlow/1", "test"); - } -} 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 13e694d..c7fb370 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 778647b..5cbc904 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 b2a6d07..c5fb007 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,622 @@ -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(); +//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("mallProductId不能为空"); +// throw new ServiceException("memberLevelId不能为空"); // } // -// MallProduct mallProduct = mallProductService.getById(productId); -// if (!Optional.ofNullable(mallProduct).isPresent()) { -// throw new ServiceException("mallProduct不存在"); +// 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.setCode(UUID.randomUUID().toString(true).substring(0, 30) + "_member"); // tradeEntity.setUserId(SecurityUtils.getUserId()); -// tradeEntity.setUserName(SecurityUtils.getUsername()); -// tradeEntity.setProductName(mallProduct.getProductName()); +// 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(mallProduct.getProductName(), -// tradeEntity.getCode() + "_product", -// orderTradeDto.getPaymentAmount().toString()); +// // 设置过期时间 +// .preCreate(memberLevel.getMemberName(), +// tradeEntity.getCode(), +// orderTradeDto.getAmount().toString()); // // 缓存到redis -// redisCache.setCacheObject(tradeEntity.getCode() + "_product", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); +// 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); -// return jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString(); +// +// PayVo payVo = new PayVo(); +// payVo.setOrderNo(tradeEntity.getCode()); +// payVo.setUrl(jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString()); +// return payVo; // } - - - /** - * 调用支付宝预下订单接口 - * - * @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; - } -} +// +// +// /** +// * 调用支付宝预下订单接口 +// * +// * @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; +// } +//} diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/task/PayTask.java b/mcwl-pay/src/main/java/com/mcwl/pay/task/PayTask.java index 76a321d..1a3cba4 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/task/PayTask.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/task/PayTask.java @@ -1,45 +1,45 @@ -package com.mcwl.pay.task; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.mcwl.common.constant.QueueConstants; -import com.mcwl.memberCenter.domain.Member; -import com.mcwl.pay.domain.OrderTrade; -import com.mcwl.pay.service.AliPayService; -import com.mcwl.pay.service.OrderTradeService; -import lombok.RequiredArgsConstructor; -import org.joda.time.LocalDateTime; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; -import java.util.function.Consumer; - -@Component("payTask") -@RequiredArgsConstructor -public class PayTask { - - private final OrderTradeService orderTradeService; - - - /** - * 删除失效订单 间隔1h检查 0 0 0/1 * * ? - */ - public void deleteInvalidOrderTask() { - - Date date = LocalDateTime.now().plusMinutes(-15).toDate(); - - List orderTradeList = orderTradeService.lambdaQuery() - .le(OrderTrade::getCreateTime, date) - .and(wrapper -> wrapper - .eq(OrderTrade::getOrderStatus, 4) - .or() - .eq(OrderTrade::getPayStatus, 1) - ) - .list(); - - orderTradeService.removeBatchByIds(orderTradeList); - - } - - -} +//package com.mcwl.pay.task; +// +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.mcwl.common.constant.QueueConstants; +//import com.mcwl.memberCenter.domain.Member; +//import com.mcwl.pay.domain.OrderTrade; +//import com.mcwl.pay.service.AliPayService; +//import com.mcwl.pay.service.OrderTradeService; +//import lombok.RequiredArgsConstructor; +//import org.joda.time.LocalDateTime; +//import org.springframework.stereotype.Component; +// +//import java.util.Date; +//import java.util.List; +//import java.util.function.Consumer; +// +//@Component("payTask") +//@RequiredArgsConstructor +//public class PayTask { +// +// private final OrderTradeService orderTradeService; +// +// +// /** +// * 删除失效订单 间隔1h检查 0 0 0/1 * * ? +// */ +// public void deleteInvalidOrderTask() { +// +// Date date = LocalDateTime.now().plusMinutes(-15).toDate(); +// +// List orderTradeList = orderTradeService.lambdaQuery() +// .le(OrderTrade::getCreateTime, date) +// .and(wrapper -> wrapper +// .eq(OrderTrade::getOrderStatus, 4) +// .or() +// .eq(OrderTrade::getPayStatus, 1) +// ) +// .list(); +// +// orderTradeService.removeBatchByIds(orderTradeList); +// +// } +// +// +//}