From bf7a78b680b0e7a931875f90106611f15c06b1f8 Mon Sep 17 00:00:00 2001
From: chengkun <2500338766@qq.com>
Date: Mon, 29 Aug 2022 09:10:19 +0800
Subject: [PATCH 1/2] =?UTF-8?q?feature1.0.0-img:=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E5=8F=8A=E7=94=A8?=
=?UTF-8?q?=E6=88=B7vip=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bnyer/common/core/utils/DateUtils.java | 20 ++++
.../com/bnyer/img/config/AlipayConfig.java | 16 +++
.../bnyer/img/constants/RedisKeyConstant.java | 5 +
.../constants/UserVipOrderStatusConstant.java | 29 ++++++
.../img/constants/UserVipTypeConstant.java | 24 +++++
.../img/controller/FhMiniController.java | 26 +++++
.../img/controller/TiktokMiniController.java | 10 ++
.../img/controller/WxMiniController.java | 26 +++++
.../com/bnyer/img/domain/UserVipRecord.java | 34 ++++++-
.../java/com/bnyer/img/dto/PayUserVipDto.java | 33 +++++++
.../img/service/UserVipRecordService.java | 15 +++
.../impl/UserVipServiceRecordImpl.java | 98 +++++++++++++++++++
.../bnyer/img/mapper/UserVipRecordMapper.xml | 8 +-
13 files changed, 341 insertions(+), 3 deletions(-)
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipOrderStatusConstant.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/PayUserVipDto.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java
diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
index a34c2a5..f84a53a 100644
--- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
+++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
@@ -8,7 +8,9 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
+import java.util.Calendar;
import java.util.Date;
+
import org.apache.commons.lang3.time.DateFormatUtils;
/**
@@ -176,4 +178,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
+
+ /**
+ * 给指定日期添加指定添加的天数 返回添加后的天数
+ *
+ * @param d 指定的日期
+ * @param day 指定添加的天数
+ * @return 添加后的天数
+ */
+ public static Date getDateAfter(Date d, int day) {
+ Calendar now = Calendar.getInstance();
+ now.setTime(d);
+ now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
+ return now.getTime();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(getDateAfter(new Date(), 365));
+ }
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java
index 09928e0..ea0d7b1 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java
@@ -27,6 +27,9 @@ public class AlipayConfig{
@Value("${alipay.privateKey}")
private String privateKey;
+ @Value("${alipay.publicKey}")
+ private String publicKey;
+
@Value("${alipay.certPath}")
private String certPath;
@@ -35,4 +38,17 @@ public class AlipayConfig{
@Value("${alipay.rootPath}")
private String rootPath;
+
+ @Value("${alipay.notifyUrl}")
+ private String notifyUrl;
+
+ @Value("${alipay.returnUrl}")
+ private String returnUrl;
+
+ @Value("${alipay.signType}")
+ private String signType;
+
+ @Value("${alipay.charset}")
+ private String charset;
+
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
index e5c7bd3..ea07ae0 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
@@ -101,4 +101,9 @@ public class RedisKeyConstant {
* 艺术家上传键
*/
public static final String CREATOR_UPLOAD_KEY="bnyer.img.creator.upload:";
+
+ /**
+ * 用户会员vip锁键
+ */
+ public static final String PAY_USER_VIP_LOCK_KEY = "bnyer.img.userVip.lock:";
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipOrderStatusConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipOrderStatusConstant.java
new file mode 100644
index 0000000..1a09232
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipOrderStatusConstant.java
@@ -0,0 +1,29 @@
+package com.bnyer.img.constants;
+
+/**
+ * 用户会员vip支付常量
+ * @author chengkun
+ * @date 2022/4/21 18:12
+ */
+public class UserVipOrderStatusConstant {
+
+ /**
+ * 待支付
+ */
+ public static final String UN_PAY = "0";
+
+ /**
+ * 已支付
+ */
+ public static final String PAYED = "1";
+
+ /**
+ * 支付失败
+ */
+ public static final String PAY_FAIL = "2";
+
+ /**
+ * 支付失败
+ */
+ public static final String PAY_EXCEPTION = "3";
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java
new file mode 100644
index 0000000..fd0fa76
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java
@@ -0,0 +1,24 @@
+package com.bnyer.img.constants;
+
+/**
+ * 用户会员vip常量
+ * @author chengkun
+ * @date 2022/4/21 18:12
+ */
+public class UserVipTypeConstant {
+
+ /**
+ * 月卡
+ */
+ public static final String MONTH_CARD = "0";
+
+ /**
+ * 季卡
+ */
+ public static final String SEASON_CARD = "1";
+
+ /**
+ * 年卡
+ */
+ public static final String YEAR_CARD = "2";
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java
index 86182b0..c3c653d 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java
@@ -64,6 +64,12 @@ public class FhMiniController extends BaseController {
@Autowired
private BzDataService bzDataService;
+ @Autowired
+ private UserVipService userVipService;
+
+ @Autowired
+ private UserVipRecordService userVipRecordService;
+
//@TokenCheck
@ApiOperation(value="查询banner列表")
@GetMapping(value = "/listBanner")
@@ -290,4 +296,24 @@ public class FhMiniController extends BaseController {
}
return AjaxResult.error();
}
+
+ //@TokenCheck
+ @ApiOperation(value="获取用户会员vip列表")
+ @GetMapping(value = "/queryUserVipList")
+ public AjaxResult queryUserVipList(){
+ return AjaxResult.success(userVipService.queryFront());
+ }
+
+ //@TokenCheck
+ @ApiOperation(value="支付购买用户会员vip")
+ @PostMapping(value = "/payUserVip")
+ public AjaxResult payUserVip(@Validated @RequestBody @ApiParam("购买会员vip对象") PayUserVipDto dto){
+ log.debug("【微信图文小程序】支付购买用户会员vip参数为:{}", JSON.toJSONString(dto));
+ boolean b = userVipRecordService.payUserVip(dto);
+ if(b){
+ return AjaxResult.success("购买支付成功!");
+ }else{
+ return AjaxResult.error("购买支付失败!");
+ }
+ }
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java
index 026a4d9..fd0ee53 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java
@@ -65,6 +65,9 @@ public class TiktokMiniController extends BaseController {
@Autowired
private BzDataService bzDataService;
+ @Autowired
+ private UserVipService userVipService;
+
//@TokenCheck
@ApiOperation(value="查询banner列表")
@GetMapping(value = "/listBanner")
@@ -293,4 +296,11 @@ public class TiktokMiniController extends BaseController {
}
return AjaxResult.error();
}
+
+ //@TokenCheck
+ @ApiOperation(value="获取用户会员vip列表")
+ @GetMapping(value = "/queryUserVipList")
+ public AjaxResult queryUserVipList(){
+ return AjaxResult.success(userVipService.queryFront());
+ }
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java
index 47dfb91..32841ce 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java
@@ -64,6 +64,12 @@ public class WxMiniController extends BaseController {
@Autowired
private BzDataService bzDataService;
+ @Autowired
+ private UserVipService userVipService;
+
+ @Autowired
+ private UserVipRecordService userVipRecordService;
+
//@TokenCheck
@ApiOperation(value="查询banner列表")
@GetMapping(value = "/listBanner")
@@ -290,4 +296,24 @@ public class WxMiniController extends BaseController {
}
return AjaxResult.error();
}
+
+ //@TokenCheck
+ @ApiOperation(value="获取用户会员vip列表")
+ @GetMapping(value = "/queryUserVipList")
+ public AjaxResult queryUserVipList(){
+ return AjaxResult.success(userVipService.queryFront());
+ }
+
+ //@TokenCheck
+ @ApiOperation(value="支付购买用户会员vip")
+ @PostMapping(value = "/payUserVip")
+ public AjaxResult payUserVip(@Validated @RequestBody @ApiParam("购买会员vip对象") PayUserVipDto dto){
+ log.debug("【微信图文小程序】支付购买用户会员vip参数为:{}", JSON.toJSONString(dto));
+ boolean b = userVipRecordService.payUserVip(dto);
+ if(b){
+ return AjaxResult.success("购买支付成功!");
+ }else{
+ return AjaxResult.error("购买支付失败!");
+ }
+ }
}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/UserVipRecord.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/UserVipRecord.java
index 3b542ca..ce81907 100644
--- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/UserVipRecord.java
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/UserVipRecord.java
@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
+import java.math.BigDecimal;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -29,6 +31,13 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="主键id")
private Long id;
+ /**
+ * 订单id
+ */
+ @TableField(value = "order_id")
+ @ApiModelProperty(value="订单id")
+ private String orderId;
+
/**
* 用户手机号
*/
@@ -47,6 +56,7 @@ public class UserVipRecord extends BaseDomain {
* 开始时间
*/
@TableField(value = "start_time")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
@@ -54,8 +64,30 @@ public class UserVipRecord extends BaseDomain {
* 到期时间
*/
@TableField(value = "end_time")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
+ /**
+ * 支付金额
+ */
+ @TableField(value = "price")
+ @ApiModelProperty(value="支付金额")
+ private BigDecimal price;
+
+ /**
+ * vip类型状态(0->月卡;1->季卡;2->年卡)
+ */
+ @TableField(value = "type")
+ @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)")
+ private String type;
+
+ /**
+ * 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)
+ */
+ @TableField(value = "status")
+ @ApiModelProperty(value="支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)")
+ private String status;
+
private static final long serialVersionUID = 1L;
-}
\ No newline at end of file
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/PayUserVipDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/PayUserVipDto.java
new file mode 100644
index 0000000..fe3d6c2
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/PayUserVipDto.java
@@ -0,0 +1,33 @@
+package com.bnyer.img.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+
+@Getter
+@Setter
+@ApiModel("用户会员vip支付接收类")
+public class PayUserVipDto implements Serializable {
+
+ @NotBlank(message = "手机号不能为空!")
+ @ApiModelProperty(value="手机号")
+ private String phone;
+
+ @NotNull(message = "用户vipId不能为空!")
+ @ApiModelProperty(value="用户vip表id")
+ private Long userVipId;
+
+ @NotBlank(message = "vip类型状态不能为空!")
+ @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)")
+ private String type;
+
+ @NotBlank(message = "支付金额不能为空!")
+ @ApiModelProperty(value="支付金额")
+ private String price;
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java
new file mode 100644
index 0000000..b00305f
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java
@@ -0,0 +1,15 @@
+package com.bnyer.img.service;
+
+import com.bnyer.img.domain.UserVipRecord;
+import com.bnyer.img.dto.PayUserVipDto;
+
+public interface UserVipRecordService {
+
+
+ /**
+ * 下单并支付会员vip
+ * @param param 用户vip参数对象
+ * @return -
+ */
+ boolean payUserVip(PayUserVipDto param);
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java
new file mode 100644
index 0000000..c03585c
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java
@@ -0,0 +1,98 @@
+package com.bnyer.img.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.bnyer.common.core.exception.ServiceException;
+import com.bnyer.common.core.utils.DateUtils;
+import com.bnyer.common.core.utils.StringUtils;
+import com.bnyer.common.core.utils.uuid.IdUtils;
+import com.bnyer.common.redis.service.RedissonService;
+import com.bnyer.img.constants.RedisKeyConstant;
+import com.bnyer.img.constants.UserVipOrderStatusConstant;
+import com.bnyer.img.constants.UserVipTypeConstant;
+import com.bnyer.img.domain.UserVip;
+import com.bnyer.img.domain.UserVipRecord;
+import com.bnyer.img.dto.PayUserVipDto;
+import com.bnyer.img.dto.UserVipPageDto;
+import com.bnyer.img.mapper.UserVipMapper;
+import com.bnyer.img.mapper.UserVipRecordMapper;
+import com.bnyer.img.service.UserVipRecordService;
+import com.bnyer.img.service.UserVipService;
+import com.bnyer.img.vo.UserVipVo;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Service
+@Slf4j
+public class UserVipServiceRecordImpl implements UserVipRecordService {
+
+ @Autowired
+ private UserVipRecordMapper userVipRecordMapper;
+
+ @Autowired
+ private RedissonService redissonService;
+
+
+ @Override
+ public boolean payUserVip(PayUserVipDto param) {
+ UserVipRecord userVipRecord = new UserVipRecord();
+ //生成订单id
+ userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr());
+ //获取分布式锁
+ RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId());
+ try{
+ if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){
+ //调用支付
+
+ //保存订单
+ userVipRecord.setCreateTime(new Date());
+ userVipRecord.setUpdateTime(new Date());
+ userVipRecord.setPrice(new BigDecimal(param.getPrice()));
+ userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY);
+ userVipRecord.setIsShow("1");
+ Date startTime = new Date();
+ userVipRecord.setStartTime(startTime);
+ if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){
+ //计算月卡(30天)的结束时间
+ userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30));
+ }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){
+ //结算季卡(90天)的结束时间
+ userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90));
+ }else{
+ //计算年卡(365天)的结束时间
+ userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365));
+ }
+ }else{
+ userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION);
+ log.error("用户会员vip支付异常,锁被占用!");
+ throw new ServiceException("系统繁忙,请稍候重试!");
+ }
+ }catch (Exception e){
+ userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL);
+ log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage());
+ throw new ServiceException("系统繁忙,请勿重复操作!");
+ }finally {
+ int insert = userVipRecordMapper.insert(userVipRecord);
+ if(insert > 0){
+ return true;
+ }
+ //释放锁
+ if(lock.isHeldByCurrentThread()){
+ lock.unlock();
+ log.info("用户会员vip支付操作执行完毕,释放锁成功!");
+ }
+ }
+ return false;
+ }
+}
diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
index d5a7036..b98c13d 100644
--- a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
+++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
@@ -5,10 +5,14 @@
+
+
+
+
@@ -16,7 +20,7 @@
- id, phone, user_vip_id, start_time, end_time, is_show, create_time, update_time,
+ id,order_id, phone,price,status, user_vip_id, start_time, end_time,type, is_show, create_time, update_time,
sort
-
\ No newline at end of file
+
From a02db2e7c1d45ff6adeb9280ed4489f40c13b374 Mon Sep 17 00:00:00 2001
From: chengkun <2500338766@qq.com>
Date: Wed, 31 Aug 2022 10:04:53 +0800
Subject: [PATCH 2/2] =?UTF-8?q?feature1.0.0-img:=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E5=8F=8A=E5=9B=9E?=
=?UTF-8?q?=E8=B0=83=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../img/controller/CommonController.java | 37 ++++++++
.../com/bnyer/img/dto/AlipayParamDto.java | 31 ++++++
.../com/bnyer/img/service/AlipayService.java | 26 +++++
.../img/service/impl/AlipayServiceImpl.java | 95 +++++++++++++++++++
4 files changed, 189 insertions(+)
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CommonController.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/AlipayParamDto.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/AlipayService.java
create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/AlipayServiceImpl.java
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CommonController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CommonController.java
new file mode 100644
index 0000000..62abab7
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CommonController.java
@@ -0,0 +1,37 @@
+package com.bnyer.img.controller;
+
+import com.bnyer.common.core.utils.StringUtils;
+import com.bnyer.common.core.web.controller.BaseController;
+import com.bnyer.common.core.web.domain.AjaxResult;
+import com.bnyer.img.service.AlipayService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Api(value = "【图文平台】公共接口",tags = "【图文平台】公共接口")
+@RestController
+@RequestMapping("/img/common")
+@Slf4j
+public class CommonController extends BaseController {
+
+ @Autowired
+ private AlipayService alipayService;
+
+ //@RequiresPermissions("system:config:list")
+ @ApiOperation(value = "支付宝回调通知")
+ @PostMapping("/alipayCallback")
+ public AjaxResult alipayCallback(@RequestBody HttpServletRequest request) {
+ String result = alipayService.alipayCallBack(request);
+ if (StringUtils.isNotBlank(result)){
+ return AjaxResult.success(result);
+ }
+ return AjaxResult.error();
+ }
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/AlipayParamDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/AlipayParamDto.java
new file mode 100644
index 0000000..7a82bb7
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/AlipayParamDto.java
@@ -0,0 +1,31 @@
+package com.bnyer.img.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("支付宝支付参数接收类")
+public class AlipayParamDto implements Serializable {
+
+ @ApiModelProperty(value="商户订单号")
+ private String outTradeNo;
+
+ @ApiModelProperty(value="订单名称")
+ private String subject;
+
+ @ApiModelProperty(value="付款金额")
+ private String totalAmount;
+
+ @ApiModelProperty(value="备注")
+ private String body;
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/AlipayService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/AlipayService.java
new file mode 100644
index 0000000..332cf23
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/AlipayService.java
@@ -0,0 +1,26 @@
+package com.bnyer.img.service;
+
+import com.bnyer.img.dto.AlipayParamDto;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author chengkun
+ * @date 2022/8/30 16:42
+ */
+public interface AlipayService {
+
+ /**
+ * 支付宝支付
+ * @param params 支付参数
+ * @return -
+ */
+ String aliPay(AlipayParamDto params);
+
+ /**
+ * 支付宝回调
+ * @param request 回调请求
+ * @return -
+ */
+ String alipayCallBack(HttpServletRequest request);
+}
diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/AlipayServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/AlipayServiceImpl.java
new file mode 100644
index 0000000..1dea344
--- /dev/null
+++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/AlipayServiceImpl.java
@@ -0,0 +1,95 @@
+package com.bnyer.img.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.bnyer.img.config.AlipayConfig;
+import com.bnyer.img.dto.AlipayParamDto;
+import com.bnyer.img.service.AlipayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * @author chengkun
+ * @date 2022/8/30 17:09
+ */
+@Service
+@Slf4j
+public class AlipayServiceImpl implements AlipayService {
+
+ @Autowired
+ private AlipayConfig alipayConfig;
+
+ @Override
+ public String aliPay(AlipayParamDto params) {
+ String result = null;
+ //1、获得初始化的AlipayClient
+ AlipayClient client = new DefaultAlipayClient(
+ alipayConfig.getGatewayUrl(),
+ alipayConfig.getAppId(),
+ alipayConfig.getPrivateKey(),
+ alipayConfig.getCharset(),
+ alipayConfig.getPublicKey(),
+ alipayConfig.getSignType());
+ //2、设置请求参数
+ AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
+ //页面跳转同步通知页面路径
+ request.setReturnUrl(alipayConfig.getReturnUrl());
+ // 服务器异步通知页面路径
+ request.setNotifyUrl(alipayConfig.getNotifyUrl());
+ //封装参数
+ request.setBizContent(JSON.toJSONString(client));
+ try {
+ //3、请求支付宝进行付款,并获取支付结果
+ result = client.pageExecute(request).getBody();
+ } catch (AlipayApiException e) {
+ log.error("支付宝支付失败!错误原因为:", e);
+ return null;
+ }
+ return result;
+ }
+
+ @Override
+ public String alipayCallBack(HttpServletRequest request) {
+ Map result = new HashMap<>();
+ Map requestParams = request.getParameterMap();
+ for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
+ String name = (String) iter.next();
+ String[] values = (String[]) requestParams.get(name);
+ String valueStr = "";
+ for (int i = 0; i < values.length; i++) {
+ valueStr = (i == values.length - 1) ? valueStr + values[i]
+ : valueStr + values[i] + ",";
+ }
+ //乱码解决,这段代码在出现乱码时使用。
+ //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
+ result.put(name, valueStr);
+ }
+
+ String outTradeNo = result.get("out_trade_no");
+ String appId = result.get("app_id");
+ String sellerId = result.get("out_trade_no");
+ String totalAmount = result.get("total_amount");
+ log.info("outTradeNo=={},appId=={},sellerId=={},totalAmount=={}",outTradeNo,appId,sellerId,totalAmount);
+ try {
+ boolean flag = AlipaySignature.rsaCheckV1(result, alipayConfig.getPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());
+ if (flag) {
+ return "success";
+ } else {
+ return "failure";
+ }
+ } catch (AlipayApiException e) {
+ e.printStackTrace();
+ return "failure";
+ }
+ }
+}