From c7a59a0d992e47c80b0995247a581cf02853e630 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 5 Feb 2025 11:28:33 +0800 Subject: [PATCH 01/11] =?UTF-8?q?fix(resource):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E4=B8=BA=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/service/impl/ModelImageLikeServiceImpl.java | 8 ++++++++ .../mcwl/resource/service/impl/ModelImageServiceImpl.java | 4 ++++ .../mcwl/resource/service/impl/ModelLikeServiceImpl.java | 8 ++++++++ .../com/mcwl/resource/service/impl/ModelServiceImpl.java | 4 ++++ .../mcwl/resource/service/impl/WorkFlowServiceImpl.java | 5 +++++ 5 files changed, 29 insertions(+) diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageLikeServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageLikeServiceImpl.java index 4ce3bca..33419cc 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageLikeServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageLikeServiceImpl.java @@ -116,11 +116,19 @@ public class ModelImageLikeServiceImpl extends ServiceImpl impl BeanUtil.copyProperties(modelImage, modelVo); // 获取用户信息 SysUser sysUser = sysUserService.selectUserById(modelImage.getUserId()); + if (Objects.isNull(sysUser)) { + page.setTotal(page.getTotal() - 1); + continue; + } modelVo.setUserId(sysUser.getUserId()); modelVo.setUserName(sysUser.getUserName()); modelVo.setUserAvatar(sysUser.getAvatar()); diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowServiceImpl.java index c387858..2464738 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowServiceImpl.java @@ -37,6 +37,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Objects; /** * 工作流 业务实现层 @@ -381,6 +382,10 @@ public class WorkFlowServiceImpl extends ServiceImpl i BeanUtil.copyProperties(workFlow, workFlowVo); // 获取用户信息 SysUser sysUser = sysUserService.selectUserById(workFlow.getUserId()); + if (Objects.isNull(sysUser)) { + page.setTotal(page.getTotal() - 1); + continue; + } workFlowVo.setUserId(sysUser.getUserId()); workFlowVo.setUserName(sysUser.getUserName()); workFlowVo.setUserAvatar(sysUser.getAvatar()); From bb64605dc426210dcd5d08511a6e362c515456cd Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 5 Feb 2025 13:28:58 +0800 Subject: [PATCH 02/11] =?UTF-8?q?refactor(mcwl):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/MallProductController.java | 9 ++++--- .../resource/ModelImageController.java | 27 ++++++++++--------- .../java/com/mcwl/common/domain/IdsParam.java | 4 +++ 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java index 1a3ecb5..4562d0b 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java @@ -5,6 +5,7 @@ import com.mcwl.common.core.controller.BaseController; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.page.PageDomain; import com.mcwl.common.core.page.TableDataInfo; +import com.mcwl.common.domain.IdsParam; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.resource.domain.ModelProduct; import com.mcwl.resource.domain.dto.ModelImagePageRes; @@ -19,6 +20,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; import java.util.List; @@ -145,9 +148,9 @@ public class MallProductController extends BaseController { @ApiOperation(value = "删除模型") - @PostMapping("delete") - public AjaxResult delete(@RequestBody ModelProduct modelVersion) { - modelService.removeById(modelVersion.getId()); + @GetMapping("delete") + public AjaxResult delete(@Valid @NotNull(message = "模型id不能为空") Long id) { + modelService.removeById(id); return AjaxResult.success(); } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelImageController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelImageController.java index ce75038..7be5c8d 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelImageController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelImageController.java @@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; @@ -42,7 +43,9 @@ public class ModelImageController { */ @ApiOperation(value = "图片列表") @PostMapping("/list") - public TableDataInfo list(@RequestBody PageDomain pageDomain) { + public TableDataInfo list(@RequestBody + @Valid + PageDomain pageDomain) { ModelImagePageRes imagePageRes = new ModelImagePageRes(); BeanUtil.copyProperties(pageDomain, imagePageRes); return modelImageService.listByPage(imagePageRes); @@ -52,9 +55,9 @@ public class ModelImageController { * 图片详情 */ @ApiOperation(value = "图片详情") - @GetMapping("/detail/{imageId}") - public AjaxResult detail(@PathVariable @NotNull(message = "图片id不能为空") Long imageId) { - ModelImageVo modelImageVo = modelImageService.getDetail(imageId); + @GetMapping("/detail") + public AjaxResult detail(@Valid @NotNull(message = "图片id不能为空") Long id) { + ModelImageVo modelImageVo = modelImageService.getDetail(id); return AjaxResult.success(modelImageVo); } @@ -62,9 +65,9 @@ public class ModelImageController { * 图片删除 */ @ApiOperation(value = "图片删除") - @GetMapping("/delete/{imageId}") - public AjaxResult delete(@PathVariable @NotNull(message = "图片id不能为空") Long imageId) { - modelImageService.removeById(imageId); + @GetMapping("/delete") + public AjaxResult delete(@Valid @NotNull(message = "图片id不能为空") Long id) { + modelImageService.removeById(id); return AjaxResult.success(); } @@ -73,7 +76,7 @@ public class ModelImageController { */ @ApiOperation(value = "图片修改") @PostMapping("/update") - public AjaxResult update(@RequestBody ModelImageRes modelImageRes) { + public AjaxResult update(@Valid @RequestBody ModelImageRes modelImageRes) { modelImageService.updateById(modelImageRes); return AjaxResult.success(); } @@ -84,7 +87,7 @@ public class ModelImageController { */ @ApiOperation(value = "图片发布") @PostMapping("/publish") - public AjaxResult publish(@RequestBody ModelImageRes modelImageRes) { + public AjaxResult publish(@Valid @RequestBody ModelImageRes modelImageRes) { modelImageService.publish(modelImageRes); return AjaxResult.success(); } @@ -94,9 +97,9 @@ public class ModelImageController { */ @ApiOperation(value = "图片点赞/取消") @RepeatSubmit - @GetMapping("/imageLike/{imageId}") - public AjaxResult like(@PathVariable @NotNull(message = "图片id不能为空") Long imageId) { - modelImageLikeService.like(imageId); + @GetMapping("/imageLike") + public AjaxResult like(@Valid @NotNull(message = "图片id不能为空") Long id) { + modelImageLikeService.like(id); return AjaxResult.success(); } diff --git a/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java b/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java index 66041d1..b6379ce 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java +++ b/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java @@ -1,10 +1,14 @@ package com.mcwl.common.domain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data +@ApiModel(description = "id集合") public class IdsParam { + @ApiModelProperty(value = "id集合") private List ids; } From 0d9a485c191f112b8fd2f75bbf42340105f0675b Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 5 Feb 2025 15:20:45 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat(resource):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mcwl/resource/domain/ModelProduct.java | 6 +++--- .../main/java/com/mcwl/resource/domain/vo/ModelVo.java | 9 +++++++-- .../com/mcwl/resource/service/impl/ModelServiceImpl.java | 7 +++++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelProduct.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelProduct.java index 5c5a876..a11d6f4 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelProduct.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelProduct.java @@ -47,10 +47,10 @@ public class ModelProduct extends BaseEntity { @ApiModelProperty(value = "用户id") private Long userId; /** - * 模型类型ID + * 模型类型 */ - @ApiModelProperty(value = "模型类型ID") - private Long modelTypeId; + @ApiModelProperty(value = "模型类型") + private Long modelType; /** * 垂类 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelVo.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelVo.java index 6d13a6b..36c9031 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelVo.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelVo.java @@ -10,13 +10,18 @@ public class ModelVo { /** * 模型id */ - @ApiModelProperty(value = "模型id", required = true) + @ApiModelProperty(value = "模型id") private Long id; /** * 模型名称 */ - @ApiModelProperty(value = "模型名称", required = true) + @ApiModelProperty(value = "模型名称") private String modelName; + /** + * 模型类型 + */ + @ApiModelProperty(value = "模型类型") + private String modelType; /** * 封面图 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelServiceImpl.java index 2028325..1fed1ef 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelServiceImpl.java @@ -155,6 +155,13 @@ public class ModelServiceImpl extends ServiceImpl impl for (ModelProduct modelImage : modelImageList) { ModelVo modelVo = new ModelVo(); BeanUtil.copyProperties(modelImage, modelVo); + + // 设置模型类型 + if (Objects.nonNull(modelImage.getModelType())) { + String modelTypeName = DictInit.getDictValue(DictConstants.MODEL_CATEGORY, modelImage.getModelType().toString()); + modelVo.setModelType(modelTypeName); + } + // 获取用户信息 SysUser sysUser = sysUserService.selectUserById(modelImage.getUserId()); if (Objects.isNull(sysUser)) { From e559b6d04dd52cf5d250cdf54e7a453798f580e6 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 5 Feb 2025 16:47:14 +0800 Subject: [PATCH 04/11] =?UTF-8?q?feat(resource):=20=E6=9B=B4=E6=96=B0=20Mo?= =?UTF-8?q?delLike?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcwl/resource/domain/vo/ModelLikeVo.java | 20 +++++++++---------- .../service/impl/ModelLikeServiceImpl.java | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelLikeVo.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelLikeVo.java index b388b81..18a4787 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelLikeVo.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelLikeVo.java @@ -10,38 +10,38 @@ public class ModelLikeVo { /** * id */ - @ApiModelProperty(value = "id", required = true) + @ApiModelProperty(value = "id") private Long id; /** * 用户ID */ - @ApiModelProperty(value = "用户id", required = true) + @ApiModelProperty(value = "用户id") private Long userId; /** * 用户名称 */ - @ApiModelProperty(value = "用户名称", required = true) + @ApiModelProperty(value = "用户名称") private String userName; /** * 用户头像 */ - @ApiModelProperty(value = "用户头像", required = true) + @ApiModelProperty(value = "用户头像") private String userAvatar; /** * 模型id */ - @ApiModelProperty(value = "模型id", required = true) + @ApiModelProperty(value = "模型id") private Long modelId; + /** + * 模型名称 + */ + @ApiModelProperty(value = "模型名称") + private String modelName; /** * 封面图 */ @ApiModelProperty(value = "封面图") private String surfaceUrl; - /** - * 点赞数 - */ - @ApiModelProperty(value = "点赞数") - private Integer likeNum; } diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelLikeServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelLikeServiceImpl.java index bb2d6b1..a111615 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelLikeServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelLikeServiceImpl.java @@ -107,7 +107,7 @@ public class ModelLikeServiceImpl extends ServiceImpl Date: Thu, 6 Feb 2025 09:47:32 +0800 Subject: [PATCH 05/11] =?UTF-8?q?feat(resource):=20=E6=9B=B4=E6=96=B0=20Mo?= =?UTF-8?q?delLike?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/AliPay/AliPayIntegration.java | 23 +++++++++++++ .../pay/AliPay/OrderTradeController.java | 32 +++++++++++++++++++ .../resource/ToActivityController.java | 2 +- .../mcwl/framework/config/SecurityConfig.java | 2 +- .../service/impl/ToActivityServiceImpl.java | 3 +- 5 files changed, 59 insertions(+), 3 deletions(-) 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 index 4d02b0b..5e09966 100644 --- 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 @@ -14,6 +14,8 @@ 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; @@ -290,4 +292,25 @@ public class AliPayIntegration { 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 e6f9d4b..292f439 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,8 +1,13 @@ package com.mcwl.web.controller.pay.AliPay; import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.json.JSON; import cn.hutool.json.JSONUtil; +import com.alipay.api.AlipayApiException; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +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.common.models.AlipayTradeQueryResponse; @@ -23,9 +28,13 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; /** * @Author:ChenYan @@ -54,6 +63,29 @@ public class OrderTradeController extends BaseController { @Autowired private RedisCache redisCache; + + @GetMapping("/generateQrCode") + public void generateQrCode(HttpServletResponse response) throws Exception { + String scope = "auth_user"; // 需要获取用户信息 + String state = RandomUtil.randomString(3); // 防止CSRF攻击 + + String encodedRedirectUri = URLEncoder.encode("https://3195d9a3.r27.cpolar.top/web/pay/callback", "UTF-8"); + String authUrl = String.format( + "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", + "2021005114616085", scope, encodedRedirectUri, state + ); + + QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); + } + + @GetMapping("/callback") + public void callback(@RequestParam("auth_code") String authCode) { + + System.out.println("authCode = " + authCode); + aliPayIntegration.bindingCallback(authCode); + + } + /** * 查询列表 */ diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ToActivityController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ToActivityController.java index 31ff596..9d7e514 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ToActivityController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ToActivityController.java @@ -37,7 +37,7 @@ public class ToActivityController extends BaseController { @PostMapping("/list") public TableDataInfo list(@RequestBody ToActivity toActivity) { - startPage(); +// startPage(); List list = toActivityService.selectToActivityList(toActivity); return getDataTable(list); } diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java index 31218f8..2507c22 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java @@ -129,7 +129,7 @@ public class SecurityConfig .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/login", "/register", "/captchaImage","/web/pay/doPay","/web/pay/notify").permitAll() + requests.antMatchers("/login", "/register", "/captchaImage","/web/pay/doPay","/web/pay/notify","/web/pay/generateQrCode","/web/pay/callback").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ToActivityServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ToActivityServiceImpl.java index fe21434..8e9b06a 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ToActivityServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ToActivityServiceImpl.java @@ -2,6 +2,7 @@ package com.mcwl.resource.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.common.utils.StringUtils; import com.mcwl.resource.domain.ModelProduct; import com.mcwl.resource.domain.ToActivity; import com.mcwl.resource.mapper.ToActivityMapper; @@ -31,7 +32,7 @@ public class ToActivityServiceImpl extends ServiceImpl selectToActivityList(ToActivity toActivity) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ToActivity::getActivityName, toActivity.getActivityName()); + queryWrapper.eq(StringUtils.isNotBlank(toActivity.getActivityName()),ToActivity::getActivityName, toActivity.getActivityName()); return toActivityMapper.selectList(queryWrapper); } From 8d04847cd2d32fffb571a7104c3c8f1a2a4c493f Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 6 Feb 2025 11:41:44 +0800 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20=E6=96=B0=E5=A2=9EAliPayContr?= =?UTF-8?q?oller,=E9=87=8D=E6=9E=84AliPayIntegration=E7=B1=BB=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=AE=9E=E7=8E=B0=20AliPayService=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcwl/web/controller/common/OssUtil.java | 2 +- .../pay/AliPay/AliPayController.java | 211 +++++++ .../pay/AliPay/AliPayIntegration.java | 586 +++++++++--------- .../pay/AliPay/OrderTradeController.java | 152 +---- .../resource/MallProductController.java | 8 +- .../mcwl/framework/config/SecurityConfig.java | 4 +- mcwl-pay/pom.xml | 13 + .../com/mcwl/pay/service/AliPayService.java | 16 + .../pay/service/impl/AliPayServiceImpl.java | 321 ++++++++++ .../mcwl/resource/domain/ModelVersion.java | 5 + 10 files changed, 870 insertions(+), 448 deletions(-) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java create mode 100644 mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java create mode 100644 mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/common/OssUtil.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/common/OssUtil.java index 6baeb3f..f2ecda6 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/common/OssUtil.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/common/OssUtil.java @@ -146,7 +146,7 @@ public class OssUtil { } public static String getOssFilePath(String filePath){ - String fileSuf = filePath.substring(filePath.indexOf(".") + 1); + String fileSuf = filePath.substring(filePath.lastIndexOf(".") + 1); return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf; } 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 new file mode 100644 index 0000000..eff5d41 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayController.java @@ -0,0 +1,211 @@ +package com.mcwl.web.controller.pay.AliPay; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.json.JSONUtil; +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; +import com.mcwl.common.JSONUtils; +import com.mcwl.common.annotation.Anonymous; +import com.mcwl.common.core.controller.BaseController; +import com.mcwl.common.core.domain.AjaxResult; +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.domain.OrderTradeDto; +import com.mcwl.pay.service.AliPayService; +import com.mcwl.pay.service.OrderTradeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.HashMap; +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("/ali/pay") +@Validated +public class AliPayController extends BaseController { + + @Autowired + private OrderTradeService orderTradeService; + + @Autowired + private AliPayService aliPayService; + + + @Autowired + private RedisCache redisCache; + + + /** + * 授权二维码 + * @param response 响应 + * @throws Exception 抛出异常 + */ + @GetMapping("/generateQrCode") + public void generateQrCode(HttpServletResponse response) throws Exception { + String scope = "auth_user"; // 需要获取用户信息 + String state = RandomUtil.randomString(3); // 防止CSRF攻击 + + String encodedRedirectUri = URLEncoder.encode("https://3195d9a3.r27.cpolar.top/ali/pay/callback", "UTF-8"); + String authUrl = String.format( + "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", + "2021005114616085", scope, encodedRedirectUri, state + ); + + QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); + } + + /** + * 授权回调 + * @param authCode 授权码 + */ + @GetMapping("/callback") + public void callback(@RequestParam("auth_code") String authCode) { + + System.out.println("authCode = " + authCode); + aliPayService.bindingCallback(authCode); + + } + + + /** + * 支付接口 + * + * @param orderTradeDto 订单实体 + * @param response 响应 + * @throws Exception + */ + @Anonymous + @PostMapping("/doPay") + public void doPay(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { + String qrUrl = null; + + String type = orderTradeDto.getType(); + + if ("member".equalsIgnoreCase(type)) { + qrUrl = aliPayService.memberPay(orderTradeDto); + } else if ("points".equalsIgnoreCase(type)) { + qrUrl = aliPayService.pointsPay(orderTradeDto.getPaymentAmount()); + } + + QrCodeUtil.generate(qrUrl, 300, 300, "png", response.getOutputStream()); + } + + /** + * 查看余额 + */ + @GetMapping("/balance") + public void balance() throws Exception { + aliPayService.balance(); + } + + /** + * 提现接口 + */ + @Anonymous + @PostMapping("/withdraw") + public void withdraw(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { + String outBizNo = UUID.fastUUID().toString(true); + String payerUserId = "2088102167258880"; + String payeeUserId = "2088102167258880"; + String amount = "100"; + aliPayService.transfer(outBizNo, payerUserId, payeeUserId, amount); + } + + + /** + * 支付回调接口 + * + * @param request + * @return + * @throws Exception + */ + @Anonymous + @PostMapping("/notify") // 注意这里必须是POST接口 + 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"); // 商户订单号 + // 获取订单后缀 + String suffix = code.substring(code.lastIndexOf("_") + 1); + String orderTradeJson = redisCache.getCacheObject(code); + OrderTrade orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); + + 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/AliPayIntegration.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPay/AliPayIntegration.java index 5e09966..84ba704 100644 --- 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 @@ -1,82 +1,127 @@ -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 { +//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("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信息 @@ -85,232 +130,187 @@ public class AliPayIntegration { // tradeEntity.setCode(UUID.randomUUID().toString(true).substring(0, 30)); // tradeEntity.setUserId(SecurityUtils.getUserId()); // tradeEntity.setUserName(SecurityUtils.getUsername()); -// tradeEntity.setProductName(mallProduct.getProductName()); +// tradeEntity.setProductName(memberLevel.getMemberName()); // // //调用支付宝的接口 // AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// .preCreate(mallProduct.getProductName(), -// tradeEntity.getCode() + "_product", +// // 设置过期时 +// .preCreate(memberLevel.getMemberName(), +// tradeEntity.getCode() + "_member", // orderTradeDto.getPaymentAmount().toString()); // // 缓存到redis -// redisCache.setCacheObject(tradeEntity.getCode() + "_product", JSONUtil.toJsonStr(tradeEntity), 3, TimeUnit.MINUTES); +// 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 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); - } - } -} +// +// +// /** +// * 调用支付宝预下订单接口 +// * +// * @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 292f439..89e7bbf 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 @@ -21,6 +21,7 @@ import com.mcwl.common.domain.IdsParam; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTradeDto; +import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.OrderTradeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -56,36 +57,6 @@ public class OrderTradeController extends BaseController { @Autowired private OrderTradeService orderTradeService; - @Autowired - private AliPayIntegration aliPayIntegration; - - - @Autowired - private RedisCache redisCache; - - - @GetMapping("/generateQrCode") - public void generateQrCode(HttpServletResponse response) throws Exception { - String scope = "auth_user"; // 需要获取用户信息 - String state = RandomUtil.randomString(3); // 防止CSRF攻击 - - String encodedRedirectUri = URLEncoder.encode("https://3195d9a3.r27.cpolar.top/web/pay/callback", "UTF-8"); - String authUrl = String.format( - "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", - "2021005114616085", scope, encodedRedirectUri, state - ); - - QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); - } - - @GetMapping("/callback") - public void callback(@RequestParam("auth_code") String authCode) { - - System.out.println("authCode = " + authCode); - aliPayIntegration.bindingCallback(authCode); - - } - /** * 查询列表 */ @@ -136,30 +107,6 @@ public class OrderTradeController extends BaseController { } - /** - * 支付接口 - * - * @param orderTradeDto 订单实体 - * @param response 响应 - * @throws Exception - */ - @Anonymous - @PostMapping("/doPay") - public void doPay(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { - String qrUrl = null; - - String type = orderTradeDto.getType(); - - if ("member".equalsIgnoreCase(type)) { - qrUrl = aliPayIntegration.memberPay(orderTradeDto); - } else if ("points".equalsIgnoreCase(type)) { - qrUrl = aliPayIntegration.pointsPay(orderTradeDto.getPaymentAmount()); - } - - QrCodeUtil.generate(qrUrl, 300, 300, "png", response.getOutputStream()); - } - - @GetMapping("/queryTradeStatus") public Object queryTradeStatus(@RequestParam String outTradeNo) throws Exception { Factory.setOptions(config); @@ -176,102 +123,5 @@ public class OrderTradeController extends BaseController { return map.get("alipay_trade_query_response"); } - /** - * 查看余额 - */ - @GetMapping("/balance") - public void balance() throws Exception { - aliPayIntegration.balance(); - } - - /** - * 提现接口 - */ - @Anonymous - @PostMapping("/withdraw") - public void withdraw(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { - String outBizNo = UUID.fastUUID().toString(true); - String payerUserId = "2088102167258880"; - String payeeUserId = "2088102167258880"; - String amount = "100"; - aliPayIntegration.transfer(outBizNo, payerUserId, payeeUserId, amount); - } - - - /** - * 支付回调接口 - * - * @param request - * @return - * @throws Exception - */ - @Anonymous - @PostMapping("/notify") // 注意这里必须是POST接口 - 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"); // 商户订单号 - // 获取订单后缀 - String suffix = code.substring(code.lastIndexOf("_") + 1); - String orderTradeJson = redisCache.getCacheObject(code); - OrderTrade orderTrade = JSONUtil.toBean(orderTradeJson, OrderTrade.class); - - 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/resource/MallProductController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java index 4562d0b..7336e4d 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/MallProductController.java @@ -22,7 +22,9 @@ import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; import javax.validation.constraints.NotNull; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -72,7 +74,11 @@ public class MallProductController extends BaseController { public AjaxResult Malifile(@RequestParam MultipartFile file) { String s = OssUtil.uploadMultipartFile(file); - return AjaxResult.success(s); + String fileName = file.getOriginalFilename(); + Map map = new HashMap<>(); + map.put("fileName", fileName); + map.put("url", s); + return AjaxResult.success(map); } diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java index 2507c22..ffc5676 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java @@ -129,11 +129,11 @@ public class SecurityConfig .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/login", "/register", "/captchaImage","/web/pay/doPay","/web/pay/notify","/web/pay/generateQrCode","/web/pay/callback").permitAll() + requests.antMatchers("/login", "/register", "/captchaImage","/ali/pay/doPay","/ali/pay/notify", + "/ali/pay/generateQrCode","/ali/pay/callback").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() - .antMatchers("/web/pay/notify").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); }) diff --git a/mcwl-pay/pom.xml b/mcwl-pay/pom.xml index 85203c4..8b19afc 100644 --- a/mcwl-pay/pom.xml +++ b/mcwl-pay/pom.xml @@ -55,5 +55,18 @@ compile + + com.alipay.sdk + alipay-sdk-java + 4.40.30.ALL + + + + + com.alipay.sdk + alipay-easysdk + 2.2.0 + + 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 new file mode 100644 index 0000000..882096d --- /dev/null +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/AliPayService.java @@ -0,0 +1,16 @@ +package com.mcwl.pay.service; + +import com.alipay.api.AlipayApiException; +import com.mcwl.pay.domain.OrderTradeDto; + +public interface AliPayService { + void bindingCallback(String authCode); + + String memberPay(OrderTradeDto orderTradeDto) throws Exception; + + String pointsPay(Double paymentAmount) throws Exception; + + void balance() throws Exception; + + String transfer(String outBizNo, String payerUserId, String payeeUserId, String amount) throws AlipayApiException; +} 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 new file mode 100644 index 0000000..ae8358e --- /dev/null +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java @@ -0,0 +1,321 @@ +package com.mcwl.pay.service.impl; + +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.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 com.mcwl.pay.service.AliPayService; +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 AliPayServiceImpl implements AliPayService { + + @Autowired + private RedisCache redisCache; + + + @Autowired + private MemberLevelService memberLevelService; + + + @Autowired + private AliConfig aliConfig; + + + public AliPayServiceImpl(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 + */ + @Override + 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 + */ + @Override + 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 返回支付宝转账响应的内容 + */ + @Override + 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(); + } + + /** + * 查看余额 + */ + @Override + 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,保存到数据库 + @Override + 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-resource/src/main/java/com/mcwl/resource/domain/ModelVersion.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelVersion.java index 4dfc188..f2747be 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelVersion.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelVersion.java @@ -54,6 +54,11 @@ public class ModelVersion extends BaseEntity { */ @ApiModelProperty(value = "文件地址") private String filePath; + /** + * 文件名 + */ + @ApiModelProperty(value = "文件名") + private String fileName; /** * 版本介绍(富文本编辑) */ From 61ac03de3823a3e7e8ea143dc68edd578f041daf Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 6 Feb 2025 16:34:14 +0800 Subject: [PATCH 07/11] =?UTF-8?q?feat(payment):=20=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9D=E8=B4=A6=E5=8F=B7=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcwl-admin/pom.xml | 5 + .../pay/AliPay/AliPayController.java | 36 +++----- .../resources/templates/binding-fail.html | 11 +++ .../resources/templates/binding-success.html | 11 +++ .../common/handler/MyMetaObjectHandler.java | 12 ++- .../mcwl/framework/config/SecurityConfig.java | 2 +- .../com/mcwl/pay/service/AliPayService.java | 5 +- .../pay/service/impl/AliPayServiceImpl.java | 92 +++++++++---------- .../mcwl/system/domain/SysUserPayAccount.java | 36 ++++++++ .../mapper/SysUserPayAccountMapper.java | 13 +++ .../service/ISysUserPayAccountService.java | 14 +++ .../impl/SysUserPayAccountServiceImpl.java | 18 ++++ 12 files changed, 177 insertions(+), 78 deletions(-) create mode 100644 mcwl-admin/src/main/resources/templates/binding-fail.html create mode 100644 mcwl-admin/src/main/resources/templates/binding-success.html create mode 100644 mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountMapper.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountService.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountServiceImpl.java diff --git a/mcwl-admin/pom.xml b/mcwl-admin/pom.xml index 8b347e3..bbeea53 100644 --- a/mcwl-admin/pom.xml +++ b/mcwl-admin/pom.xml @@ -135,6 +135,11 @@ test + + org.springframework.boot + spring-boot-starter-thymeleaf + + com.aliyun aliyun-java-sdk-core 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 eff5d41..3bdb9fa 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,25 +1,20 @@ package com.mcwl.web.controller.pay.AliPay; import cn.hutool.core.lang.UUID; -import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.json.JSONUtil; import com.alipay.easysdk.factory.Factory; -import com.alipay.easysdk.kernel.Config; -import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; -import com.mcwl.common.JSONUtils; import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.core.controller.BaseController; -import com.mcwl.common.core.domain.AjaxResult; -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.common.utils.ShareCodeUtils; import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.OrderTradeService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -27,7 +22,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -39,7 +33,7 @@ import java.util.Map; * @Date:2025/1/3 14:46 */ -@RestController +@Controller @RequestMapping("/ali/pay") @Validated public class AliPayController extends BaseController { @@ -63,12 +57,13 @@ public class AliPayController extends BaseController { @GetMapping("/generateQrCode") public void generateQrCode(HttpServletResponse response) throws Exception { String scope = "auth_user"; // 需要获取用户信息 - String state = RandomUtil.randomString(3); // 防止CSRF攻击 + String appId = "2021005114616085"; + String state = ShareCodeUtils.idToCode(SecurityUtils.getUserId()); // 防止CSRF攻击 String encodedRedirectUri = URLEncoder.encode("https://3195d9a3.r27.cpolar.top/ali/pay/callback", "UTF-8"); String authUrl = String.format( "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=%s&scope=%s&redirect_uri=%s&state=%s", - "2021005114616085", scope, encodedRedirectUri, state + appId, scope, encodedRedirectUri, state ); QrCodeUtil.generate(authUrl, 300, 300, "png", response.getOutputStream()); @@ -79,11 +74,15 @@ public class AliPayController extends BaseController { * @param authCode 授权码 */ @GetMapping("/callback") - public void callback(@RequestParam("auth_code") String authCode) { + public String callback(@RequestParam("auth_code") String authCode, String state) { System.out.println("authCode = " + authCode); - aliPayService.bindingCallback(authCode); - + String result = aliPayService.bindingCallback(authCode, state); + if ("success".equals(result)) { + return "binding-success"; + } else { + return "binding-fail"; + } } @@ -110,14 +109,6 @@ public class AliPayController extends BaseController { QrCodeUtil.generate(qrUrl, 300, 300, "png", response.getOutputStream()); } - /** - * 查看余额 - */ - @GetMapping("/balance") - public void balance() throws Exception { - aliPayService.balance(); - } - /** * 提现接口 */ @@ -141,6 +132,7 @@ public class AliPayController extends BaseController { */ @Anonymous @PostMapping("/notify") // 注意这里必须是POST接口 + @ResponseBody public String payNotify(HttpServletRequest request) throws Exception { diff --git a/mcwl-admin/src/main/resources/templates/binding-fail.html b/mcwl-admin/src/main/resources/templates/binding-fail.html new file mode 100644 index 0000000..6a3efc1 --- /dev/null +++ b/mcwl-admin/src/main/resources/templates/binding-fail.html @@ -0,0 +1,11 @@ + + + + + 绑定失败 + + +

支付宝账号绑定失败!

+

请检查您的网络或稍后重试。

+ + \ No newline at end of file diff --git a/mcwl-admin/src/main/resources/templates/binding-success.html b/mcwl-admin/src/main/resources/templates/binding-success.html new file mode 100644 index 0000000..da73c50 --- /dev/null +++ b/mcwl-admin/src/main/resources/templates/binding-success.html @@ -0,0 +1,11 @@ + + + + + 绑定成功 + + +

支付宝账号绑定成功!

+

您可以返回用户中心继续操作。

+ + \ No newline at end of file diff --git a/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java b/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java index 90ecc26..02160c5 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java +++ b/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java @@ -20,9 +20,17 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { - this.strictInsertFill(metaObject, "createBy", String.class, SecurityUtils.getUsername()); + try { + this.strictInsertFill(metaObject, "createBy", String.class, SecurityUtils.getUsername()); + } catch (Exception e) { + this.strictInsertFill(metaObject, "createBy", String.class, ""); + } this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); - this.strictInsertFill(metaObject, "tenantId", Long.class, SecurityUtils.getUserId()); + try { + this.strictInsertFill(metaObject, "tenantId", Long.class, SecurityUtils.getUserId()); + } catch (Exception e) { + this.strictInsertFill(metaObject, "tenantId", Long.class, -1L); + } } @Override diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java index ffc5676..936e217 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java @@ -130,7 +130,7 @@ public class SecurityConfig permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 requests.antMatchers("/login", "/register", "/captchaImage","/ali/pay/doPay","/ali/pay/notify", - "/ali/pay/generateQrCode","/ali/pay/callback").permitAll() + "/ali/pay/callback").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() 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 882096d..a6e3686 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,16 +1,15 @@ package com.mcwl.pay.service; import com.alipay.api.AlipayApiException; +import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.pay.domain.OrderTradeDto; public interface AliPayService { - void bindingCallback(String authCode); + String bindingCallback(String authCode, String state); String memberPay(OrderTradeDto orderTradeDto) throws Exception; String pointsPay(Double paymentAmount) throws Exception; - void balance() throws Exception; - String transfer(String outBizNo, String payerUserId, String payeeUserId, String amount) throws AlipayApiException; } 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 ae8358e..5ff9d2d 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 @@ -21,19 +21,25 @@ 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.domain.AjaxResult; import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.exception.BusinessException; import com.mcwl.common.exception.ServiceException; import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.common.utils.ShareCodeUtils; 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.service.AliPayService; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.service.ISysUserPayAccountService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -55,6 +61,9 @@ public class AliPayServiceImpl implements AliPayService { @Autowired private AliConfig aliConfig; + @Autowired + private ISysUserPayAccountService sysUserPayAccountService; + public AliPayServiceImpl(Config config) { Factory.setOptions(config); @@ -183,10 +192,11 @@ public class AliPayServiceImpl implements AliPayService { /** * 支付宝转账方法 - * @param outBizNo 外部业务单号 + * + * @param outBizNo 外部业务单号 * @param payerUserId 付款方用户ID * @param payeeUserId 收款方用户ID - * @param amount 转账金额 + * @param amount 转账金额 * @return 返回支付宝转账响应的内容 */ @Override @@ -238,53 +248,14 @@ public class AliPayServiceImpl implements AliPayService { } else { System.out.println("调用失败"); // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 - String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); - System.out.println(diagnosisUrl); + String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); + System.out.println(diagnosisUrl); } return response.getBody(); } - /** - * 查看余额 - */ - @Override - 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 privateKey = aliConfig.getPrivateKey(); String alipayPublicKey = aliConfig.getPublicKey(); AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl(aliConfig.getGatewayUrl()); @@ -297,25 +268,46 @@ public class AliPayServiceImpl implements AliPayService { return alipayConfig; } - //TODO 绑定回调,获取openId,保存到数据库 @Override - public void bindingCallback(String authCode) { + public String bindingCallback(String authCode, String state) { 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"); com.alipay.api.response.AlipaySystemOauthTokenResponse response = alipayClient.execute(request); if (response.isSuccess()) { - String openId = response.getOpenId(); // 支付宝用户唯一ID - // 将openId与当前商城用户绑定(保存到数据库) + // 支付宝用户唯一ID + String openId = response.getOpenId(); + // 判断是否已经绑定过 + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() + .eq(SysUserPayAccount::getUserId, userId) + .eq(SysUserPayAccount::getOpenId, openId) + .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.setOpenId(openId); + userPayAccount.setType(0); + sysUserPayAccountService.save(userPayAccount); + return "success"; } else { System.out.println("绑定失败:" + response.getSubMsg()); + return "fail"; } - } catch (AlipayApiException e) { - throw new RuntimeException(e); + return "fail"; } + } } diff --git a/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java new file mode 100644 index 0000000..2439a6b --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java @@ -0,0 +1,36 @@ +package com.mcwl.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 消息通知 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user_pay_account") +public class SysUserPayAccount extends BaseEntity { + + @TableId + private Long id; + + /** + * 用户id + */ + private Long userId; + /** + * 账号唯一标识 + */ + private String openId; + /** + * 账号类型 0 支付宝 1 微信 2 QQ + */ + private Integer type; + + + + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountMapper.java b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountMapper.java new file mode 100644 index 0000000..9596d06 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountMapper.java @@ -0,0 +1,13 @@ +package com.mcwl.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.system.domain.SysUserPayAccount; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户支付账户 + */ +@Mapper +public interface SysUserPayAccountMapper extends BaseMapper { + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountService.java b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountService.java new file mode 100644 index 0000000..98056a3 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountService.java @@ -0,0 +1,14 @@ +package com.mcwl.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.system.domain.SysUserPayAccount; + +/** + * 用户支付账户 服务层 + * + * @author mcwl + */ +public interface ISysUserPayAccountService extends IService { + + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountServiceImpl.java b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountServiceImpl.java new file mode 100644 index 0000000..16d49b6 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountServiceImpl.java @@ -0,0 +1,18 @@ +package com.mcwl.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.mapper.SysUserPayAccountMapper; +import com.mcwl.system.service.ISysUserPayAccountService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户支付账户 业务层处理 + */ +@Service +public class SysUserPayAccountServiceImpl extends ServiceImpl implements ISysUserPayAccountService { + + +} From 2672fc9e33421fe3364939bad87d9dd2270c9c55 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 6 Feb 2025 17:27:00 +0800 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=8F=90=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/AliPay/AliPayController.java | 24 ++++++-- .../com/mcwl/pay/service/AliPayService.java | 2 +- .../pay/service/impl/AliPayServiceImpl.java | 59 +++++++++++++++---- .../mcwl/system/domain/SysUserPayAccount.java | 2 +- .../system/domain/SysUserPayAccountLog.java | 32 ++++++++++ .../mapper/SysUserPayAccountLogMapper.java | 14 +++++ .../service/ISysUserPayAccountLogService.java | 15 +++++ .../impl/SysUserPayAccountLogServiceImpl.java | 19 ++++++ 8 files changed, 147 insertions(+), 20 deletions(-) create mode 100644 mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccountLog.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountLogMapper.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountLogService.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountLogServiceImpl.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 3bdb9fa..9c49232 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 @@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil; import com.alipay.easysdk.factory.Factory; import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.core.controller.BaseController; +import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.redis.RedisCache; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.common.utils.ShareCodeUtils; @@ -13,6 +14,7 @@ import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.OrderTradeService; +import org.checkerframework.checker.units.qual.min; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; @@ -20,6 +22,10 @@ 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 java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @@ -51,6 +57,7 @@ public class AliPayController extends BaseController { /** * 授权二维码 + * * @param response 响应 * @throws Exception 抛出异常 */ @@ -71,6 +78,7 @@ public class AliPayController extends BaseController { /** * 授权回调 + * * @param authCode 授权码 */ @GetMapping("/callback") @@ -113,13 +121,17 @@ public class AliPayController extends BaseController { * 提现接口 */ @Anonymous - @PostMapping("/withdraw") - public void withdraw(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { + @PostMapping("/fetch") + @ResponseBody + public AjaxResult fetch(@Valid + @NotNull(message = "提现金额不能为空") + Double amount) throws Exception { + if (amount < 0.01) { + return AjaxResult.error("提现金额最小为0.01"); + } String outBizNo = UUID.fastUUID().toString(true); - String payerUserId = "2088102167258880"; - String payeeUserId = "2088102167258880"; - String amount = "100"; - aliPayService.transfer(outBizNo, payerUserId, payeeUserId, amount); + + return aliPayService.fetch(outBizNo, amount.toString()); } 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 a6e3686..38044ae 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 @@ -11,5 +11,5 @@ public interface AliPayService { String pointsPay(Double paymentAmount) throws Exception; - String transfer(String outBizNo, String payerUserId, String payeeUserId, String amount) throws AlipayApiException; + AjaxResult fetch(String outBizNo, String amount) throws AlipayApiException; } 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 5ff9d2d..71606e4 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 @@ -22,6 +22,7 @@ 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.domain.AjaxResult; +import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.core.redis.RedisCache; import com.mcwl.common.exception.BusinessException; import com.mcwl.common.exception.ServiceException; @@ -34,11 +35,16 @@ import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.service.AliPayService; 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.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -64,6 +70,12 @@ public class AliPayServiceImpl implements AliPayService { @Autowired private ISysUserPayAccountService sysUserPayAccountService; + @Autowired + private ISysUserService sysUserService; + + @Autowired + private ISysUserPayAccountLogService sysUserPayAccountLogService; + public AliPayServiceImpl(Config config) { Factory.setOptions(config); @@ -194,13 +206,17 @@ public class AliPayServiceImpl implements AliPayService { * 支付宝转账方法 * * @param outBizNo 外部业务单号 - * @param payerUserId 付款方用户ID - * @param payeeUserId 收款方用户ID * @param amount 转账金额 * @return 返回支付宝转账响应的内容 */ @Override - public String transfer(String outBizNo, String payerUserId, String payeeUserId, String amount) throws AlipayApiException { + @Transactional(rollbackFor = Exception.class) + public AjaxResult fetch(String outBizNo, String amount) throws AlipayApiException { + Long userId = SecurityUtils.getUserId(); + SysUser sysUser = sysUserService.selectUserById(userId); + if (sysUser.getWallet() < Double.parseDouble(amount)) { + return AjaxResult.error("钱包余额不足"); + } // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); @@ -222,22 +238,29 @@ public class AliPayServiceImpl implements AliPayService { model.setProductCode("TRANS_ACCOUNT_NO_PWD"); // 设置转账业务的标题 - model.setOrderTitle("测试"); + model.setOrderTitle("提现"); // 设置收款方信息 + + SysUserPayAccount sysUserPayAccount = sysUserPayAccountService + .lambdaQuery() + .eq(SysUserPayAccount::getUserId, userId) + .eq(SysUserPayAccount::getType, 0) + .one(); + if ( Objects.isNull(sysUserPayAccount)) { + return AjaxResult.error("请先绑定支付宝账号"); + } + Participant payeeInfo = new Participant(); - payeeInfo.setCertType("IDENTITY_CARD"); - payeeInfo.setCertNo("1201152******72917"); - payeeInfo.setIdentity("2088123412341234"); - payeeInfo.setName("黄龙国际有限公司"); + payeeInfo.setIdentity(sysUserPayAccount.getOpenId()); payeeInfo.setIdentityType("ALIPAY_USER_ID"); model.setPayeeInfo(payeeInfo); // 设置业务备注 - model.setRemark("201905代发"); +// model.setRemark("201905代发"); // 设置转账业务请求的扩展参数 - model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); +// model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); request.setBizModel(model); AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); @@ -245,13 +268,26 @@ public class AliPayServiceImpl implements AliPayService { if (response.isSuccess()) { System.out.println("调用成功"); + BigDecimal wallet = new BigDecimal(sysUser.getWallet().toString()); + BigDecimal amountBigDecimal = new BigDecimal(amount); + sysUser.setWallet(wallet.subtract(amountBigDecimal).doubleValue()); + sysUserService.updateUser(sysUser); + + // 添加记录 + SysUserPayAccountLog sysUserPayAccountLog = new SysUserPayAccountLog(); + sysUserPayAccountLog.setUserId(userId); + sysUserPayAccountLog.setAmount(Double.valueOf(amount)); + sysUserPayAccountLog.setAccount("支付宝"); + sysUserPayAccountLogService.save(sysUserPayAccountLog); +// response.getBody() + return AjaxResult.success("转账成功"); } else { System.out.println("调用失败"); // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); System.out.println(diagnosisUrl); + return AjaxResult.error("转账失败:" + response.getMsg()); } - return response.getBody(); } private AlipayConfig getAlipayConfig() { @@ -286,7 +322,6 @@ public class AliPayServiceImpl implements AliPayService { // 判断是否已经绑定过 SysUserPayAccount sysUserPayAccount = sysUserPayAccountService.lambdaQuery() .eq(SysUserPayAccount::getUserId, userId) - .eq(SysUserPayAccount::getOpenId, openId) .eq(SysUserPayAccount::getType, 0) .one(); if (Objects.nonNull(sysUserPayAccount)) { diff --git a/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java index 2439a6b..3332604 100644 --- a/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java +++ b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccount.java @@ -7,7 +7,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - * 消息通知 + * 用户支付账户 */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccountLog.java b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccountLog.java new file mode 100644 index 0000000..adecb74 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserPayAccountLog.java @@ -0,0 +1,32 @@ +package com.mcwl.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户提现日志 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user_pay_account_log") +public class SysUserPayAccountLog extends BaseEntity { + + @TableId + private Long id; + /** + * 提现用户 + */ + private Long userId; + /** + * 提现金额 + */ + private Double amount; + /** + * 提现账户 + */ + private String account; + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountLogMapper.java b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountLogMapper.java new file mode 100644 index 0000000..46e9fcb --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserPayAccountLogMapper.java @@ -0,0 +1,14 @@ +package com.mcwl.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.domain.SysUserPayAccountLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户提现 + */ +@Mapper +public interface SysUserPayAccountLogMapper extends BaseMapper { + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountLogService.java b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountLogService.java new file mode 100644 index 0000000..58bb170 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserPayAccountLogService.java @@ -0,0 +1,15 @@ +package com.mcwl.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.domain.SysUserPayAccountLog; + +/** + * 用户提现 服务层 + * + * @author mcwl + */ +public interface ISysUserPayAccountLogService extends IService { + + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountLogServiceImpl.java b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountLogServiceImpl.java new file mode 100644 index 0000000..4d4d756 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserPayAccountLogServiceImpl.java @@ -0,0 +1,19 @@ +package com.mcwl.system.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.system.domain.SysUserPayAccount; +import com.mcwl.system.domain.SysUserPayAccountLog; +import com.mcwl.system.mapper.SysUserPayAccountLogMapper; +import com.mcwl.system.mapper.SysUserPayAccountMapper; +import com.mcwl.system.service.ISysUserPayAccountLogService; +import com.mcwl.system.service.ISysUserPayAccountService; +import org.springframework.stereotype.Service; + +/** + * 用户提现 + */ +@Service +public class SysUserPayAccountLogServiceImpl extends ServiceImpl implements ISysUserPayAccountLogService { + + +} From 47717bae9c02101cd7240ff8351e283c44000fef Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 6 Feb 2025 17:34:43 +0800 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=8F=90=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/pay/AliPay/AliPayController.java | 11 ++++++++++- .../main/java/com/mcwl/pay/domain/OrderTradeDto.java | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) 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 9c49232..1bf4ce4 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 @@ -14,6 +14,8 @@ import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.OrderTradeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.checkerframework.checker.units.qual.min; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -42,6 +44,7 @@ import java.util.Map; @Controller @RequestMapping("/ali/pay") @Validated +@Api(tags = "支付模块") public class AliPayController extends BaseController { @Autowired @@ -61,6 +64,7 @@ public class AliPayController extends BaseController { * @param response 响应 * @throws Exception 抛出异常 */ + @ApiOperation(value = "支付宝绑定") @GetMapping("/generateQrCode") public void generateQrCode(HttpServletResponse response) throws Exception { String scope = "auth_user"; // 需要获取用户信息 @@ -103,7 +107,11 @@ public class AliPayController extends BaseController { */ @Anonymous @PostMapping("/doPay") - public void doPay(@RequestBody OrderTradeDto orderTradeDto, HttpServletResponse response) throws Exception { + @ApiOperation(value = "支付宝支付") + public void doPay(@Valid + @RequestBody + OrderTradeDto orderTradeDto, + HttpServletResponse response) throws Exception { String qrUrl = null; String type = orderTradeDto.getType(); @@ -123,6 +131,7 @@ public class AliPayController extends BaseController { @Anonymous @PostMapping("/fetch") @ResponseBody + @ApiOperation(value = "提现") public AjaxResult fetch(@Valid @NotNull(message = "提现金额不能为空") Double amount) throws Exception { diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java b/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java index 12c91d5..bd3e7c7 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/domain/OrderTradeDto.java @@ -1,27 +1,39 @@ package com.mcwl.pay.domain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; + @Data +@ApiModel(description = "订单交易信息") public class OrderTradeDto { /** * 商品ID */ + @ApiModelProperty(value = "商品ID", required = true) + @NotNull(message = "商品ID不能为空") private Integer productId; /** * 支付金额 */ + @ApiModelProperty(value = "支付金额", required = true) + @NotNull(message = "支付金额不能为空") private Double paymentAmount; /** * 订单类型 会员member 积分points */ + @ApiModelProperty(value = "订单类型 会员member 积分points", required = true) + @NotNull(message = "订单类型不能为空") private String type; /** * 活动id */ + @ApiModelProperty(value = "活动id") private Long promotionId; } From e09584800a57b4c472656dc5dd4e6be3cc39ec5b Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 6 Feb 2025 17:57:37 +0800 Subject: [PATCH 10/11] =?UTF-8?q?refactor(mcwl-pay):=20=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9D=E8=BD=AC=E8=B4=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mcwl/pay/service/impl/AliPayServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 71606e4..dd8de85 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 @@ -266,6 +266,14 @@ public class AliPayServiceImpl implements AliPayService { AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); System.out.println(response.getBody()); + if (response.getCode().equals("40004")) { + + // TODO 余额不足,发送邮件提现 + + return AjaxResult.error("系统繁忙,请稍后重试"); + } + + if (response.isSuccess()) { System.out.println("调用成功"); BigDecimal wallet = new BigDecimal(sysUser.getWallet().toString()); From e44f6b8a0f1c15a096bcce36ff5478af61c9b3b7 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Fri, 7 Feb 2025 12:29:45 +0800 Subject: [PATCH 11/11] =?UTF-8?q?feat(payment):=20=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9D=E8=BD=AC=E8=B4=A6=E9=9B=86=E6=88=90=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/config/mail.setting | 6 +++++ .../mcwl/memberCenter/MemberCenterTest.java | 12 --------- mcwl-common/pom.xml | 6 +++++ .../pay/service/impl/AliPayServiceImpl.java | 27 +++++++++---------- 4 files changed, 25 insertions(+), 26 deletions(-) create mode 100644 mcwl-admin/src/main/resources/config/mail.setting diff --git a/mcwl-admin/src/main/resources/config/mail.setting b/mcwl-admin/src/main/resources/config/mail.setting new file mode 100644 index 0000000..42f2ba8 --- /dev/null +++ b/mcwl-admin/src/main/resources/config/mail.setting @@ -0,0 +1,6 @@ +# 发件人(必须正确,否则发送失败) +from = 2119157836@qq.com +# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码) +pass = wetaiadftmidejab +# 使用SSL安全连接 +sslEnable = true diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java index 113ee70..2f7fdea 100644 --- a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java @@ -1,18 +1,6 @@ package com.mcwl.memberCenter; -import com.mcwl.McWlApplication; -import com.mcwl.common.core.domain.AjaxResult; -import com.mcwl.memberCenter.consumer.EmptyPointsRemindConsumer; -import com.mcwl.memberCenter.service.MemberLevelService; -import com.mcwl.memberCenter.service.MemberService; -import com.mcwl.memberCenter.task.UserMemberTask; -import com.mcwl.web.controller.memberCenter.MemberController; -import com.mcwl.web.controller.memberCenter.MemberLevelController; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; public class MemberCenterTest { diff --git a/mcwl-common/pom.xml b/mcwl-common/pom.xml index fce5171..fcecc28 100644 --- a/mcwl-common/pom.xml +++ b/mcwl-common/pom.xml @@ -30,6 +30,12 @@
+ + com.sun.mail + javax.mail + 1.6.2 + + com.fasterxml.jackson.core 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 dd8de85..fdba716 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,7 +1,9 @@ package com.mcwl.pay.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; 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; @@ -45,6 +47,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -205,8 +208,8 @@ public class AliPayServiceImpl implements AliPayService { /** * 支付宝转账方法 * - * @param outBizNo 外部业务单号 - * @param amount 转账金额 + * @param outBizNo 外部业务单号 + * @param amount 转账金额 * @return 返回支付宝转账响应的内容 */ @Override @@ -240,36 +243,32 @@ public class AliPayServiceImpl implements AliPayService { // 设置转账业务的标题 model.setOrderTitle("提现"); - // 设置收款方信息 - + // 查询用户支付宝账户 SysUserPayAccount sysUserPayAccount = sysUserPayAccountService .lambdaQuery() .eq(SysUserPayAccount::getUserId, userId) .eq(SysUserPayAccount::getType, 0) .one(); - if ( Objects.isNull(sysUserPayAccount)) { + if (Objects.isNull(sysUserPayAccount)) { return AjaxResult.error("请先绑定支付宝账号"); } + // 收款方信息 Participant payeeInfo = new Participant(); payeeInfo.setIdentity(sysUserPayAccount.getOpenId()); 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.getCode().equals("40004")) { - - // TODO 余额不足,发送邮件提现 + if (response.getSubCode().equals("PAYER_BALANCE_NOT_ENOUGH")) { + // 账户余额不足,发送邮件通知 + ArrayList tos = CollUtil.newArrayList("2119157836@qq.com"); + String content = String.format("账户余额不足:用户%s提现%s", sysUser.getUserName(), amount); + MailUtil.send(tos, "上海辰风互娱", content, false); return AjaxResult.error("系统繁忙,请稍后重试"); }