diff --git a/payment-base-app/payment-base-app.iml b/payment-base-app/payment-base-app.iml
index 77af3c2..a2bbd1d 100644
--- a/payment-base-app/payment-base-app.iml
+++ b/payment-base-app/payment-base-app.iml
@@ -141,6 +141,8 @@
+
+
@@ -168,17 +170,9 @@
+
-
-
-
-
-
-
-
-
-
diff --git a/payment-base-app/pom.xml b/payment-base-app/pom.xml
index d408ada..4c291d9 100644
--- a/payment-base-app/pom.xml
+++ b/payment-base-app/pom.xml
@@ -151,42 +151,17 @@
-
+
commons-httpclient
commons-httpclient
3.1
-
- commons-logging
- commons-logging
- 1.1
-
-
- commons-codec
- commons-codec
- 1.3
-
commons-lang
commons-lang
2.3
-
- bcprov-ext-jdk15on
- bcprov-ext-jdk15on
- 1.4.6
-
-
- hiiposm_engine_simple
- hiiposm_engine_simple
- 2.3.4
-
-
- securityAPI-client
- securityAPI-client
- 1.0.0
-
@@ -252,27 +227,4 @@
-
-
-
- maven-public
- maven-public
- http://maven.hnrr.com.cn/repository/maven-public/
-
- true
-
-
-
-
-
- nexus-releases
- maven-releases
- http://maven.hnrr.com.cn/repository/maven-releases/
-
-
- nexus-snapshots
- maven-snapshots
- http://maven.hnrr.com.cn/repository/maven-snapshots/
-
-
\ No newline at end of file
diff --git a/payment-base-app/src/main/java/com/base/springcloud/aspect/annotation/LoginRequired.java b/payment-base-app/src/main/java/com/base/springcloud/aspect/annotation/LoginRequired.java
new file mode 100644
index 0000000..b6439c9
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/aspect/annotation/LoginRequired.java
@@ -0,0 +1,11 @@
+package com.base.springcloud.aspect.annotation;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.METHOD)
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginRequired {
+ // 部门 ture - 获取部门信息
+ boolean department() default false;
+}
\ No newline at end of file
diff --git a/payment-base-app/src/main/java/com/base/springcloud/aspect/aspect/WebMvcConfiguration.java b/payment-base-app/src/main/java/com/base/springcloud/aspect/aspect/WebMvcConfiguration.java
deleted file mode 100644
index 182c36c..0000000
--- a/payment-base-app/src/main/java/com/base/springcloud/aspect/aspect/WebMvcConfiguration.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.base.springcloud.aspect.aspect;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-/**
- * Spring Boot 2.0 解决跨域问题
- *
- * @Author qinfeng
- *
- */
-@Configuration
-public class WebMvcConfiguration implements WebMvcConfigurer {
-
-
- @Override
- public void addCorsMappings(CorsRegistry registry){
- // 设置允许跨域的路由
- registry.addMapping("/**")
- // 设置允许跨域请求的域名------------修改此行
- .allowedOrigins("*")
- // 是否允许证书(cookies)
- .allowCredentials(true)
- // 设置允许的方法
- .allowedMethods("*")
- // 跨域允许时间
- .maxAge(3600);
- }
-
-
-}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/aspect/config/PayConfigurer.java b/payment-base-app/src/main/java/com/base/springcloud/aspect/config/PayConfigurer.java
new file mode 100644
index 0000000..93af01f
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/aspect/config/PayConfigurer.java
@@ -0,0 +1,25 @@
+package com.base.springcloud.aspect.config;
+
+import com.base.springcloud.aspect.interceptor.PayInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+public class PayConfigurer implements WebMvcConfigurer {
+
+ @Autowired
+ private PayInterceptor payInterceptor;
+
+ // 拦截器请求 :'/merchant/**','/payment/**'
+ @Override
+ public void addInterceptors(InterceptorRegistry registry){
+ registry.addInterceptor(payInterceptor).addPathPatterns("/merchant/**","/payment/**");
+ }
+
+ // 跨域配置
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**").allowCredentials(true).allowedOrigins("*").allowedMethods("GET", "PUT", "DELETE", "POST", "OPTIONS").maxAge(3600);
+ }
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/RedisConfig.java b/payment-base-app/src/main/java/com/base/springcloud/aspect/config/RedisConfig.java
similarity index 94%
rename from payment-base-app/src/main/java/com/base/springcloud/constant/RedisConfig.java
rename to payment-base-app/src/main/java/com/base/springcloud/aspect/config/RedisConfig.java
index da09b29..266771b 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/constant/RedisConfig.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/aspect/config/RedisConfig.java
@@ -1,6 +1,7 @@
-package com.base.springcloud.constant;
+package com.base.springcloud.aspect.config;
+import com.base.springcloud.constant.FastJson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/payment-base-app/src/main/java/com/base/springcloud/aspect/interceptor/PayInterceptor.java b/payment-base-app/src/main/java/com/base/springcloud/aspect/interceptor/PayInterceptor.java
new file mode 100644
index 0000000..4a98d85
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/aspect/interceptor/PayInterceptor.java
@@ -0,0 +1,52 @@
+package com.base.springcloud.aspect.interceptor;
+
+import com.base.springcloud.aspect.annotation.LoginRequired;
+import com.base.springcloud.util.TokenUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class PayInterceptor implements HandlerInterceptor {
+
+ @Autowired
+ private TokenUtils tokenUtils;
+
+ // 在业务处理器处理请求之前被调用
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ LoginRequired loginRequired;
+ // 根据注解拦截请求
+ if (handler instanceof HandlerMethod) {
+ loginRequired = ((HandlerMethod)handler).getMethodAnnotation(LoginRequired.class);
+ } else {
+ return true;
+ }
+ // 说明此方法没有LoginRequired注解
+ if (loginRequired == null)
+ return true;
+ // token数据验证
+ tokenUtils.verifyToken(request);
+ // 部门信息获取
+ if(loginRequired.department())
+ tokenUtils.departmentInfo(request);
+ return true;
+ }
+
+ // 在业务处理器处理请求执行完成后
+ @Override
+ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView){
+
+ };
+
+ // 在DispatcherServlet完全处理完请求后被调用
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex){
+
+ }
+}
\ No newline at end of file
diff --git a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java
index 3bdefa1..8d54311 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/bo/RefundBO.java
@@ -9,24 +9,21 @@ import java.math.BigDecimal;
@Data
public class RefundBO extends MchConfigEntity implements Serializable {
- // 销售退款单据号
- private String billRefundNo;
+ // 退款单据编号
+ private String billId;
- // 原交易订单号即支付订单号
+ // 原订单编号
private String origOrderNo;
- // 原订单金额
- private BigDecimal orderAmount;
-
// 退款订单号
private String refundNo;
+ // 退款原因
+ private String reason;
+
// 退款金额
private BigDecimal refundAmount;
// 退款通知地址
private String notifyUrl;
-
- // 退款原因
- private String reason;
}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java
index 5f5c173..0683403 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/constant/ErrorConstant.java
@@ -3,11 +3,16 @@ package com.base.springcloud.constant;
public enum ErrorConstant {
SUECCESS("RBS00000","交易成功!"),
- NULL_OBJ("RBS00001","参数异常!"),
- MCH_ID_PARAM_ERR("RBS00002","商户支付配置异常!"),
- BILL_AMOUNT_ERR("RBS00003","销售单合计结算金额异常!"),
- BILL_INVALID("RBS00004","无效销售单据!"),
- BILL_WRITE_OFF_FAIL("RBS00005","销售单据核销失败!");
+ INVALID_TOKEN("RBS00001","无效TOKEN!"),
+ ILLEGAL_TOKEN("RBS00002","非法TOKEN!"),
+ NULL_OBJ("RBS00003","参数异常!"),
+ MCH_ID_PARAM_ERR("RBS00004","商户支付配置异常!"),
+ BILL_AMOUNT_ERR("RBS00005","销售单合计结算金额异常!"),
+ BILL_INVALID("RBS00006","无效销售单据!"),
+ BILL_WRITE_OFF_FAIL("RBS00007","销售单据核销失败!"),
+ USER_ERROR("RBS00008","请核对用户信息!"),
+ USER_LOCKING("RBS00009","账号已被锁定,请联系管理员!"),
+ TOKEN_EXPIRATION_DATE("RBS00010","TOKEN已失效,请重新登录!");
private String code;
private String message;
diff --git a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java
index f70767e..9c4c511 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/constant/PaymentConstant.java
@@ -2,38 +2,19 @@ package com.base.springcloud.constant;
public interface PaymentConstant {
- String CHARACTER_SET = "00"; // 字符集默认 : 00 - GBK
- String CALLBACK_URL = "www.baidu.com"; // 页面通知地址
- String NOTIFY_URL = "www.baidu.com"; // 后台通知地址
- String SIGN_TYPE = "RSA"; // 签名类型
+ String TOKEN_PREFIX = "prefix_user_token_"; // TOKEN前缀
String WAIT = "W"; // 等待付款
- String SUECCESS = "S"; // 支付成功
String WX_SUCCESS = "SUCCESS"; // 微信支付成功状态
- String REFUND = "R"; // 退款成功
- String CANCLE = "C"; // 撤销
-
- String WEC = "WEC"; // 微信
- String QRCWC = "QRCWC";
-
- String AL = "AL"; // 支付宝
- String QRCAL = "QRCAL";
-
- String CP = "CP"; // 云闪付
- String QRCCP = "QRCCP";
-
- String HB = "HB"; // 和包
- String QRCHB = "QRCHB";
String NATIVE = "Native"; // Native支付
String H5 = "H5"; // H5支付
String JSAPI = "Jsapi"; // JSAPI支付
- String ORDER_QUEUE = "order_queue"; // 订单队列
String ORDER_LOCK_PREFIX = "ORDER_KEY:"; // 订单锁前缀
String DEFAULT_MCH_ID = "1537100771"; // 默认商户ID
- String METHOD_GET = "GET"; // GET请求
- String METHOD_POST = "POST"; // POST请求
String WX_ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/";
+
+
}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java b/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java
index ebd9f44..2f0a482 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/controller/PaymentController.java
@@ -1,10 +1,13 @@
package com.base.springcloud.controller;
+import com.base.springcloud.aspect.annotation.LoginRequired;
+import com.base.springcloud.base.CommonResult;
import com.base.springcloud.base.ReportResult;
import com.base.springcloud.bo.OrderBO;
-import com.base.springcloud.constant.PaymentConstant;
-import com.base.springcloud.dto.NativePlaceOrderDTO;
+import com.base.springcloud.bo.RefundBO;
+import com.base.springcloud.constant.ErrorConstant;
import com.base.springcloud.service.PaymentService;
+import com.base.springcloud.service.RefundService;
import com.base.springcloud.util.ParameterUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -15,9 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import java.util.ArrayList;
-import java.util.List;
-
@RestController
@Slf4j
@Api(tags="支付管理")
@@ -30,11 +30,23 @@ public class PaymentController {
@Autowired
private PaymentService paymentService;
+ @Autowired
+ private RefundService refundService;
+
@ApiOperation(value = "native下单", notes = "微信native下单")
+ @LoginRequired(department=true)
@GetMapping("/nativePlaceOrder")
public ReportResult nativePlaceOrder(@RequestParam String salesBillId) {
OrderBO orderBO = parameterUtil.nativePlaceOrderBefore(salesBillId);
String codeUrl = paymentService.placeOrder(orderBO);
return new ReportResult(parameterUtil.nativePlaceOrderAfter(codeUrl));
}
+
+ @ApiOperation(value = "退款", notes = "微信退款")
+ @GetMapping("/refund")
+ public CommonResult refund(@RequestParam String billId) {
+ RefundBO refundBO = parameterUtil.refundBefore(billId);
+ refundService.refund(refundBO);
+ return new CommonResult(ErrorConstant.SUECCESS.getCode(), ErrorConstant.SUECCESS.getMessage(),null);
+ }
}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/dao/UserMapper.java b/payment-base-app/src/main/java/com/base/springcloud/dao/UserMapper.java
new file mode 100644
index 0000000..e73d836
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/dao/UserMapper.java
@@ -0,0 +1,22 @@
+package com.base.springcloud.dao;
+
+import com.base.springcloud.entity.User;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserMapper {
+ int deleteByPrimaryKey(String id);
+
+ int insert(User record);
+
+ int insertSelective(User record);
+
+ User selectByPrimaryKey(String id);
+
+ int updateByPrimaryKeySelective(User record);
+
+ int updateByPrimaryKey(User record);
+
+ User getUser(@Param("userName") String userName);
+}
\ No newline at end of file
diff --git a/payment-base-app/src/main/java/com/base/springcloud/entity/User.java b/payment-base-app/src/main/java/com/base/springcloud/entity/User.java
new file mode 100644
index 0000000..d928051
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/entity/User.java
@@ -0,0 +1,62 @@
+package com.base.springcloud.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class User {
+ private String id;
+
+ private String userName;
+
+ private String realName;
+
+ private String password;
+
+ private String salt;
+
+ private String avatar;
+
+ private Date birthday;
+
+ private Integer sex;
+
+ private String email ;
+
+ private String phone;
+
+ private String orgCode;
+
+ private Integer status;
+
+ private Integer delFlag;
+
+ private String thirdId;
+
+ private String thirdType;
+
+ private Integer activitiSync;
+
+ private String workNo;
+
+ private String post;
+
+ private String telephone;
+
+ private String createBy;
+
+ private Date createTime;
+
+ private String updateBy;
+
+ private Date updateTime;
+
+ private Integer userIdentity;
+
+ private String departIds;
+
+ private String ctCompanyId;
+
+ private Integer accountType;
+}
\ No newline at end of file
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java b/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java
new file mode 100644
index 0000000..406467c
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/RefundService.java
@@ -0,0 +1,12 @@
+package com.base.springcloud.service;
+
+import com.base.springcloud.bo.RefundBO;
+
+public interface RefundService {
+
+ /**
+ * 退款
+ * @param refundBO
+ */
+ void refund(RefundBO refundBO);
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/UserService.java b/payment-base-app/src/main/java/com/base/springcloud/service/UserService.java
new file mode 100644
index 0000000..8c4ef06
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/UserService.java
@@ -0,0 +1,19 @@
+package com.base.springcloud.service;
+
+import com.base.springcloud.entity.User;
+
+public interface UserService {
+
+ /**
+ * 获取用户信息
+ * @param userName
+ */
+ User getUser(String userName);
+
+ /**
+ * TOKEN有效期校验
+ * @param token
+ * @param user
+ */
+ void TokenValidity(String token, User user);
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java b/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java
index e564616..ac39dce 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/WecPaymentService.java
@@ -3,17 +3,9 @@ package com.base.springcloud.service;
import com.base.springcloud.bo.CodePayBO;
import com.base.springcloud.bo.OrderBO;
import com.base.springcloud.bo.RefundBO;
-import com.base.springcloud.entity.Order;
public interface WecPaymentService {
- /**
- * Native支付
- * @param orderBO
- * @return
- */
- String nativePay(OrderBO orderBO);
-
/**
* 微信Native支付
* @param orderBO
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java
index 042b8b3..c942013 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/MerchantServiceImp.java
@@ -12,7 +12,7 @@ import com.base.springcloud.util.FtpUtil;
import com.base.springcloud.wxsdk.MyConfig;
import com.base.springcloud.wxsdk.WXPay;
import com.base.springcloud.wxsdk.WXPayUtil;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java
new file mode 100644
index 0000000..f368b0b
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/RefundServiceImp.java
@@ -0,0 +1,14 @@
+package com.base.springcloud.service.imp;
+
+import com.base.springcloud.bo.RefundBO;
+import com.base.springcloud.service.RefundService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RefundServiceImp implements RefundService {
+
+ @Override
+ public void refund(RefundBO refundBO) {
+
+ }
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/UserServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/UserServiceImp.java
new file mode 100644
index 0000000..bfd9939
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/UserServiceImp.java
@@ -0,0 +1,64 @@
+package com.base.springcloud.service.imp;
+
+import com.base.springcloud.aspect.annotation.BusinessException;
+import com.base.springcloud.constant.ErrorConstant;
+import com.base.springcloud.constant.PaymentConstant;
+import com.base.springcloud.dao.UserMapper;
+import com.base.springcloud.entity.User;
+import com.base.springcloud.service.UserService;
+import com.base.springcloud.util.JwtUtil;
+import com.base.springcloud.util.RedisUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class UserServiceImp implements UserService {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Autowired
+ private RedisUtil redisService;
+
+ /**
+ * 获取用户信息
+ * @param userName
+ * @return
+ */
+ @Override
+ @Cacheable(cacheNames="cache:pay:user", key="#userName")
+ public User getUser(String userName) {
+ User user = userMapper.getUser(userName);
+ if(!Optional.ofNullable(user).isPresent()){
+ throw new BusinessException(ErrorConstant.USER_ERROR);
+ }
+ // 判断用户状态
+ if (user.getStatus() != 1) {
+ throw new BusinessException(ErrorConstant.USER_LOCKING);
+ }
+ return user;
+ }
+
+ /**
+ * TOKEN有效期校验
+ * @param token
+ * @param user
+ */
+ @Override
+ public void TokenValidity(String token, User user) {
+ String redisToken = String.valueOf(redisService.get(PaymentConstant.TOKEN_PREFIX + token));
+ if(StringUtils.isBlank(redisToken))
+ throw new BusinessException(ErrorConstant.TOKEN_EXPIRATION_DATE);
+ if(!JwtUtil.verify(redisToken, user.getUserName(), user.getPassword()))
+ throw new BusinessException(ErrorConstant.ILLEGAL_TOKEN);
+ String newAuthorization = JwtUtil.sign(user.getUserName(), user.getPassword());
+ // 设置Toekn缓存有效时间
+ redisService.set(PaymentConstant.TOKEN_PREFIX + token, newAuthorization);
+ redisService.expire(PaymentConstant.TOKEN_PREFIX + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
+
+ }
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java
index d79c04a..787a44e 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/service/imp/WecPaymentServiceImp.java
@@ -13,13 +13,7 @@ import com.base.springcloud.service.WecPaymentService;
import com.base.springcloud.util.DateUtil;
import com.base.springcloud.util.DecimalUtil;
import com.base.springcloud.wxsdk.WxpayUtils;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.hisun.iposm.HiCASignUtil2;
-import com.hisun.iposm.HiiposmUtil;
import lombok.SneakyThrows;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.text.StrBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@@ -32,103 +26,6 @@ public class WecPaymentServiceImp implements WecPaymentService {
Logger logger = LoggerFactory.getLogger(WecPaymentServiceImp.class);
- /**
- * Native支付
- *
- * @param orderBO
- * @return
- */
- @Override
- public String nativePay(OrderBO orderBO) {
- String res = "";
- HiiposmUtil util = new HiiposmUtil();
- String merchantId = orderBO.getMchId();
- String privateKey = orderBO.getMchPrivateKey();
- String req_url = "https://ipos.10086.cn/cps/cmpayService";
- String type = "AggregPayAmt";
- String version = "1.0.0";
- String deviceInfo = "sb001";
- String spbillCreateIp = "8.8.8.8";
- String storeBrand = "RBS-MD";
- String cityBranchNm = "RBS-PP";
- String createDate = DateUtil.getYearMonthDay2();
- String amount = DecimalUtil.multiple(orderBO.getSaleBill().getTotalAmount(),100).setScale(0, BigDecimal.ROUND_DOWN).toPlainString();
-
- // 签名数据
- Order order = orderBO.getOrder();
- StringBuilder signDate = new StringBuilder();
- signDate.append(PaymentConstant.CHARACTER_SET);
- signDate.append(PaymentConstant.CALLBACK_URL);
- signDate.append(PaymentConstant.NOTIFY_URL);
- signDate.append(merchantId);
- signDate.append(order.getRequestNo());
- signDate.append(PaymentConstant.SIGN_TYPE);
- signDate.append(type);
- signDate.append(version);
- signDate.append(amount);
- signDate.append(createDate);
- switch (order.getOrderType()) {
- case PaymentConstant.HB:
- signDate.append(PaymentConstant.QRCHB);
- break;
- case PaymentConstant.WEC:
- signDate.append(PaymentConstant.QRCWC);
- break;
- case PaymentConstant.AL:
- signDate.append(PaymentConstant.QRCAL);
- break;
- case PaymentConstant.CP:
- signDate.append(PaymentConstant.QRCCP);
- break;
- }
- signDate.append(order.getOrderNo());
- signDate.append(order.getGoodName());
- signDate.append(order.getReserved());
- logger.warn("signData:{}", signDate.toString());
- try {
- HiCASignUtil2 rsa = new HiCASignUtil2(privateKey, "111");
- StrBuilder requestParam = new StrBuilder();
- requestParam.append("hmac=").append(rsa.sign(signDate.toString()));
- requestParam.append("&characterSet=").append(PaymentConstant.CHARACTER_SET);
- requestParam.append("&callbackUrl=").append(PaymentConstant.CALLBACK_URL);
- requestParam.append("¬ifyUrl=").append(PaymentConstant.NOTIFY_URL);
- requestParam.append("&merchantId=").append(merchantId);
- requestParam.append("&requestId=").append(order.getRequestNo());
- requestParam.append("&signType=").append(PaymentConstant.SIGN_TYPE);
- requestParam.append("&type=").append(type);
- requestParam.append("&version=").append(version);
- requestParam.append("&amount=").append(amount);
- requestParam.append("&orderDate=").append(createDate);
- requestParam.append("&payWay=");
- switch (order.getOrderType()) {
- case PaymentConstant.HB:
- requestParam.append(PaymentConstant.QRCHB);
- break;
- case PaymentConstant.WEC:
- requestParam.append(PaymentConstant.QRCWC);
- break;
- case PaymentConstant.AL:
- requestParam.append(PaymentConstant.QRCAL);
- break;
- case PaymentConstant.CP:
- requestParam.append(PaymentConstant.QRCCP);
- break;
- }
- requestParam.append("&orderId=").append(order.getOrderNo());
- requestParam.append("&productName=").append(order.getGoodName());
- requestParam.append("&reserved1=").append(order.getReserved());
- requestParam.append("&deviceInfo=").append(deviceInfo);
- requestParam.append("&spbillCreateIp=").append(spbillCreateIp);
- requestParam.append("&storeBrand=").append(storeBrand);
- requestParam.append("&cityBranchNm=").append(cityBranchNm);
- res = util.sendAndRecv(req_url, requestParam.toString(), PaymentConstant.CHARACTER_SET);
- logger.info("Native支付下单参数响应: {}" , res);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return StringUtils.isNotBlank(res) ? util.getValue(res, "sessionId") : "";
- }
-
/**
* 微信Native支付
* @param orderBO
@@ -167,7 +64,7 @@ public class WecPaymentServiceImp implements WecPaymentService {
wxpayRefundVo.setTransaction_id(refundBO.getOrigOrderNo());
wxpayRefundVo.setReason(refundBO.getReason());
WxpayRefundVo.WxRefundAmountVo wxRefundAmountVo = new WxpayRefundVo.WxRefundAmountVo();
- wxRefundAmountVo.setTotal(refundBO.getOrderAmount());
+ wxRefundAmountVo.setTotal(refundBO.getRefundAmount());
wxRefundAmountVo.setRefund(refundBO.getRefundAmount());
wxpayRefundVo.setNotify_url(refundBO.getNotifyUrl());
wxpayRefundVo.setOut_refund_no(refundBO.getRefundNo());
diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/JwtUtil.java b/payment-base-app/src/main/java/com/base/springcloud/util/JwtUtil.java
new file mode 100644
index 0000000..c6cc916
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/util/JwtUtil.java
@@ -0,0 +1,101 @@
+package com.base.springcloud.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+
+import java.util.Date;
+
+/**
+ * @Author Scott
+ * @Date 2018-07-12 14:23
+ * @Desc JWT工具类
+ **/
+public class JwtUtil {
+
+ /**
+ * Token过期时间30分钟(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准)
+ */
+ public static final long EXPIRE_TIME = 30 * 60 * 1000;
+
+ /**
+ * 校验token是否正确
+ *
+ * @param token 密钥
+ * @param secret 用户的密码
+ * @return 是否正确
+ */
+ public static boolean verify(String token, String username, String secret) {
+ try {
+ // 根据密码生成JWT效验器
+ Algorithm algorithm = Algorithm.HMAC256(secret);
+ JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+ // 效验TOKEN
+ DecodedJWT jwt = verifier.verify(token);
+ return true;
+ } catch (Exception exception) {
+ return false;
+ }
+ }
+
+ /**
+ * 获得token中的信息无需secret解密也能获得
+ *
+ * @return token中包含的用户名
+ */
+ public static String getUsername(String token) {
+ try {
+ DecodedJWT jwt = JWT.decode(token);
+ return jwt.getClaim("username").asString();
+ } catch (JWTDecodeException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获得token中的信息无需secret解密也能获得
+ *
+ * @return token中包含的用户名
+ */
+ public static String getPlatform(String token) {
+ try {
+ DecodedJWT jwt = JWT.decode(token);
+ return jwt.getClaim("platform").asString();
+ } catch (JWTDecodeException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 生成签名,5min后过期
+ *
+ * @param username 用户名
+ * @param secret 用户的密码
+ * @return 加密的token
+ */
+ public static String sign(String username, String secret) {
+ Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+ Algorithm algorithm = Algorithm.HMAC256(secret);
+ // 附带username信息
+ return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
+
+ }
+
+ /**
+ * 生成签名,5min后过期
+ *
+ * @param username 用户名
+ * @param secret 用户的密码
+ * @return 加密的token
+ */
+ public static String sign(String username, String secret,String platform) {
+ Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+ Algorithm algorithm = Algorithm.HMAC256(secret);
+ // 附带username信息
+ return JWT.create().withClaim("username", username).withClaim("platform",platform).withExpiresAt(date).sign(algorithm);
+ }
+
+
+}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java b/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java
index f7de1ab..63de9f2 100644
--- a/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java
+++ b/payment-base-app/src/main/java/com/base/springcloud/util/ParameterUtil.java
@@ -1,9 +1,10 @@
package com.base.springcloud.util;
import com.base.springcloud.bo.OrderBO;
+import com.base.springcloud.bo.RefundBO;
import com.base.springcloud.constant.PaymentConstant;
import com.base.springcloud.dto.NativePlaceOrderDTO;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@@ -13,7 +14,7 @@ import java.util.List;
public class ParameterUtil {
/**
- * native下单入场设置
+ * native下单入参设置
* @param billId
* @return
*/
@@ -39,4 +40,15 @@ public class ParameterUtil {
nativePlaceOrderDTOList.add(nativePlaceOrderDTO);
return nativePlaceOrderDTOList;
}
+
+ /**
+ * 退款入参设置
+ * @param billId
+ * @return
+ */
+ public RefundBO refundBefore(String billId) {
+ RefundBO refundBO = new RefundBO();
+ refundBO.setBillId(billId);
+ return refundBO;
+ }
}
diff --git a/payment-base-app/src/main/java/com/base/springcloud/util/RedisUtil.java b/payment-base-app/src/main/java/com/base/springcloud/util/RedisUtil.java
new file mode 100644
index 0000000..8481024
--- /dev/null
+++ b/payment-base-app/src/main/java/com/base/springcloud/util/RedisUtil.java
@@ -0,0 +1,568 @@
+package com.base.springcloud.util;
+
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redis 工具类
+ * @Author Scott
+ *
+ */
+@Component
+public class RedisUtil {
+
+ @Resource
+ private RedisTemplate redisTemplate;
+
+ /**
+ * 指定缓存失效时间
+ *
+ * @param key 键
+ * @param time 时间(秒)
+ * @return
+ */
+ public boolean expire(String key, long time) {
+ try {
+ if (time > 0) {
+ redisTemplate.expire(key, time, TimeUnit.SECONDS);
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 根据key 获取过期时间
+ *
+ * @param key 键 不能为null
+ * @return 时间(秒) 返回0代表为永久有效
+ */
+ public long getExpire(String key) {
+ return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+ }
+
+ /**
+ * 判断key是否存在
+ *
+ * @param key 键
+ * @return true 存在 false不存在
+ */
+ public boolean hasKey(String key) {
+ try {
+ return redisTemplate.hasKey(key);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 删除缓存
+ *
+ * @param key 可以传一个值 或多个
+ */
+ @SuppressWarnings("unchecked")
+ public void del(String... key) {
+ if (key != null && key.length > 0) {
+ if (key.length == 1) {
+ redisTemplate.delete(key[0]);
+ } else {
+ redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));
+ }
+ }
+ }
+
+ // ============================String=============================
+ /**
+ * 普通缓存获取
+ *
+ * @param key 键
+ * @return 值
+ */
+ public Object get(String key) {
+ return key == null ? null : redisTemplate.opsForValue().get(key);
+ }
+
+ /**
+ * 普通缓存放入
+ *
+ * @param key 键
+ * @param value 值
+ * @return true成功 false失败
+ */
+ public boolean set(String key, Object value) {
+ try {
+ redisTemplate.opsForValue().set(key, value);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ /**
+ * 普通缓存放入并设置时间
+ *
+ * @param key 键
+ * @param value 值
+ * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
+ * @return true成功 false 失败
+ */
+ public boolean set(String key, Object value, long time) {
+ try {
+ if (time > 0) {
+ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+ } else {
+ set(key, value);
+ }
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 递增
+ *
+ * @param key 键
+ * @return
+ */
+ public long incr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递增因子必须大于0");
+ }
+ return redisTemplate.opsForValue().increment(key, delta);
+ }
+
+ /**
+ * 递减
+ *
+ * @param key 键
+ * @return
+ */
+ public long decr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递减因子必须大于0");
+ }
+ return redisTemplate.opsForValue().increment(key, -delta);
+ }
+
+ // ================================Map=================================
+ /**
+ * HashGet
+ *
+ * @param key 键 不能为null
+ * @param item 项 不能为null
+ * @return 值
+ */
+ public Object hget(String key, String item) {
+ return redisTemplate.opsForHash().get(key, item);
+ }
+
+ /**
+ * 获取hashKey对应的所有键值
+ *
+ * @param key 键
+ * @return 对应的多个键值
+ */
+ public Map