Browse Source

add charge api

huodongdong 7 years ago
parent
commit
a71b1653d0

+ 19 - 28
rankin-api-web/src/main/java/cn/rankin/apiweb/intercepter/LoginInterceptor.java

@@ -1,8 +1,6 @@
 package cn.rankin.apiweb.intercepter;
 
 import cn.rankin.apiweb.code.ApiWebCode;
-import cn.rankin.apiweb.security.JwsToken;
-import cn.rankin.apiweb.security.JwsTokenService;
 import cn.rankin.apiweb.vo.DeviceUserVo;
 import cn.rankin.common.utils.api.model.BaseCode;
 import cn.rankin.common.utils.constant.RedisKey;
@@ -12,6 +10,7 @@ import com.alibaba.fastjson.JSON;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.NamedThreadLocal;
 import org.springframework.http.HttpMethod;
 import org.springframework.stereotype.Component;
@@ -21,6 +20,8 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
 
 @Component
 public class LoginInterceptor implements HandlerInterceptor {
@@ -33,17 +34,15 @@ public class LoginInterceptor implements HandlerInterceptor {
 
     private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime");
 
-    private static final long REFRESH_INTERVAL = 2 * 60 * 60 * 1000;
-
-    @Autowired
-    RedisService<String, Object> redisService;
-
     @Autowired
-    private JwsTokenService jwsTokenService;
+    private RedisService<String, Object> redisService;
 
     // 忽略options请求,默认为true
     private boolean ignoreOptions = true;
 
+    @Value("${'${request.header.ignore_path}'.split(',')}")
+    private List<String> ignorePaths = new ArrayList<>();
+
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 
@@ -59,39 +58,31 @@ public class LoginInterceptor implements HandlerInterceptor {
         startTimeThreadLocal.set(System.currentTimeMillis());//线程绑定变量(该数据只有当前请求的线程可见)
 
         //登录请求不拦截
-        String url = request.getServletPath();
-        if (url.equals("/login") || url.equals("/login/")) {
+        String path = request.getServletPath();
+        if (ignorePaths.contains(path)) {
+            logger.info("url: {} not intercepted!");
             return true;
         }
 
-        String token = request.getHeader("Authentication");
-        logger.info("请求开始  url={}  token={}", url, token);
-        if (StringUtils.isEmpty(token)) {
-            return false;
-        }
+        String uid = request.getHeader("uid");
+        String eid = request.getHeader("eid");
+        String sign = request.getHeader("sign");
+        String requestId = request.getHeader("requestId");
+        logger.info("request start, requestId={}, path={}, uid={}, eid={}, sign={}", requestId, path, uid, eid, sign);
 
-        JwsToken jwsToken = jwsTokenService.parse(token);
-        if (jwsToken == null) {
+        if (StringUtils.isEmpty(uid) || StringUtils.isEmpty(sign)) {
             return false;
         }
 
-        String userName = jwsToken.getUserName();
-
         //因为缓存了用户id和设备id
-        DeviceUserVo du = (DeviceUserVo) redisService.get(String.format(LOGIN_TOKEN_FORMAT_KEY, userName));
+        DeviceUserVo du = (DeviceUserVo) redisService.get(String.format(LOGIN_TOKEN_FORMAT_KEY, uid));
         if (null == du) {
-            logger.error("验证 token 异常:  token={}", JSON.toJSONString(jwsToken));
+            logger.error("check header failed, not exists!");
             request.setAttribute(ERROR_LOGIN_HEADER, "ERROR_TOKEN");
             responseOutWithJson(request, response);
             return false;
-        }else if (!jwsToken.getDeviceId().equals(du.getDevice())) {
-            logger.error("device not match, token={}", JSON.toJSONString(jwsToken));
-            request.setAttribute(ERROR_LOGIN_HEADER, "NOT_MATCH");
-            responseOutWithJson(request, response);
-            return false;
         }
-        //查询到结果 如果存在 token 对应的 vo
-        // 1.判断 如果有效期小于 2小时
+
         logger.info("token check success: {}", JSON.toJSONString(du));
 
         return true;

+ 0 - 23
rankin-api-web/src/main/java/cn/rankin/apiweb/security/JwsToken.java

@@ -1,23 +0,0 @@
-package cn.rankin.apiweb.security;
-
-import lombok.Data;
-import org.apache.commons.lang.StringUtils;
-
-import java.io.Serializable;
-
-@Data
-public class JwsToken implements Serializable {
-
-    private String userName;
-
-    private String deviceId;
-
-    private String sign;
-
-    public boolean isRight() {
-        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(deviceId)) {
-            return false;
-        }
-        return true;
-    }
-}

+ 0 - 55
rankin-api-web/src/main/java/cn/rankin/apiweb/security/JwsTokenService.java

@@ -1,55 +0,0 @@
-package cn.rankin.apiweb.security;
-
-import cn.rankin.common.utils.util.ListUtil;
-import com.alibaba.fastjson.JSON;
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
-import org.apache.commons.lang.StringUtils;
-import org.springframework.security.crypto.util.EncodingUtils;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.List;
-
-/**
- * @author Jonsy
- *
- */
-@Component
-public class JwsTokenService implements Serializable {
-
-    private static final String SEPARATER = "\\.";
-
-    private static final String ENCODING = "UTF-8";
-
-    public final Base64.Decoder decoder = Base64.getDecoder();
-
-    public JwsToken parse(String token) {
-        String[] parts = token.split(SEPARATER);
-        if (parts.length != 2) {
-            return null;
-        }
-
-        String payload = new String(decoder.decode(parts[0]));
-        JwsToken jwsToken = JSON.parseObject(payload, JwsToken.class);
-        if (!jwsToken.isRight()) {
-            return null;
-        }
-
-        String sign = new String(decoder.decode(parts[1]));
-        if (StringUtils.isEmpty(sign)) {
-            return null;
-        }
-
-        jwsToken.setSign(sign);
-
-        return jwsToken;
-    }
-
-    public static void main(String[] args) {
-        JwsToken jwsToken = new JwsTokenService().parse("eyJ1c2VyTmFtZSI6Imh1b2RvbmciLCJkZXZpY2VJZCI6ImpsanNsZGppZXgwMDIzamMifQ==.OTB1M2prYzd1amU=");
-    }
-}

+ 3 - 3
rankin-api-web/src/main/java/cn/rankin/apiweb/vo/DeviceUserVo.java

@@ -15,12 +15,12 @@ public class DeviceUserVo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     //设备信息
-    private String device;
+    private String deviceId;
 
     //用户信息
-    private String code;
+    private String eid;
 
-    private String userId;
+    private String uid;
 
     private String avatar;
 

+ 30 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/MoneyController.java

@@ -0,0 +1,30 @@
+package cn.rankin.cmsweb.controller.trade;
+
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.trade.order.PayingService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.constant.Constant;
+import cn.rankin.data.api.trade.dto.ChargeDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/money")
+public class MoneyController {
+
+    @Autowired
+    private PayingService payingService;
+
+    @RequestMapping(value = "/charge", method = RequestMethod.POST)
+    public APIResult<Boolean> charge(@NeedUser UserDetails user, @RequestBody ChargeDTO chargeDTO) {
+        if (user.getId().equals(Constant.ROOT_ID)) {
+            return APIResult.error(CmsWebAPICode.ACCESS_DENIED);
+        }
+        return payingService.charge(chargeDTO);
+    }
+}

+ 1 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderService.java

@@ -86,7 +86,7 @@ public class OrderService {
         payDTO.setReceiptId(order.getId());
         payDTO.setMerchantId(merchantId);
 
-        APIResult<Boolean> payAPIResult = payingService.buy(payDTO);
+        APIResult<Boolean> payAPIResult = payingService.pay(payDTO);
         if (!payAPIResult.getSuccess()) {
             log.error("扣款失败, orderId={}, {}", orderId, payAPIResult.getMessage());
             return APIResult.error(new BaseCode(payAPIResult.getCode(), payAPIResult.getMessage()));

+ 6 - 2
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/PayingService.java

@@ -1,6 +1,7 @@
 package cn.rankin.cmsweb.service.trade.order;
 
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.dto.ChargeDTO;
 import cn.rankin.data.api.user.dto.PayDTO;
 import org.springframework.cloud.netflix.feign.FeignClient;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -10,6 +11,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @FeignClient(name = "${service.user.name}")
 public interface PayingService {
 
-    @RequestMapping(value = "/pay/buy", method = RequestMethod.POST)
-    APIResult<Boolean> buy(@RequestBody PayDTO payDTO);
+    @RequestMapping(value = "/money/pay", method = RequestMethod.POST)
+    APIResult<Boolean> pay(@RequestBody PayDTO payDTO);
+
+    @RequestMapping(value = "/money/charge", method = RequestMethod.POST)
+    APIResult<Boolean> charge(@RequestBody ChargeDTO chargeDTO);
 }

+ 2 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/Constant.java

@@ -2,6 +2,8 @@ package cn.rankin.common.utils.constant;
 
 public class Constant {
 
+    public final static String ROOT_ID = "1";
+
     public final static String APP_CODE = "1502";
 
     public final static String MRegEx = "^\\d{4}$";

+ 1 - 1
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/LedgerTypeEnum.java

@@ -1,7 +1,7 @@
 package cn.rankin.common.utils.enums;
 
 public enum LedgerTypeEnum {
-    COURSE("购买课程");
+    COURSE("购买课程"), CHARGE("充值");
 
     String name;
 

+ 18 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/ChargeDTO.java

@@ -0,0 +1,18 @@
+package cn.rankin.data.api.trade.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ToString
+public class ChargeDTO implements Serializable {
+
+    private String merchantId;
+
+    private BigDecimal quantity;
+
+    private String note;
+}

+ 10 - 4
rankin-user-service/src/main/java/cn/rankin/userservice/controller/PayController.java

@@ -1,21 +1,27 @@
 package cn.rankin.userservice.controller;
 
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.dto.ChargeDTO;
 import cn.rankin.data.api.user.dto.PayDTO;
 import cn.rankin.userservice.service.PayingService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
-@RequestMapping(value = "/pay")
+@RequestMapping(value = "/money")
 public class PayController {
 
     @Autowired
     private PayingService payingService;
 
-    @RequestMapping(value = "/buy", method = RequestMethod.POST)
-    public APIResult<Boolean> buy(@RequestBody PayDTO payDTO) {
-        return payingService.buy(payDTO.getMerchantId(), payDTO.getQuantity(), payDTO.getType(), payDTO.getReceiptId(), payDTO.getNote());
+    @RequestMapping(value = "/pay", method = RequestMethod.POST)
+    public APIResult<Boolean> pay(@RequestBody PayDTO payDTO) {
+        return payingService.pay(payDTO.getMerchantId(), payDTO.getQuantity(), payDTO.getType(), payDTO.getReceiptId(), payDTO.getNote());
+    }
+
+    @RequestMapping(value = "/charge", method = RequestMethod.POST)
+    public APIResult<Boolean> charge(@RequestBody ChargeDTO chargeDTO) {
+        return payingService.charge(chargeDTO.getMerchantId(), chargeDTO.getQuantity(), chargeDTO.getNote());
     }
 
 }

+ 2 - 2
rankin-user-service/src/main/java/cn/rankin/userservice/repository/MerchantRepository.java

@@ -26,6 +26,6 @@ public interface MerchantRepository  extends BasicJpaRepository<Merchant, String
     int updateStatusById(@Param("id") String id, @Param("status") BaseStatusEnum status);
 
 	@Modifying
-    @Query(value = "update Merchant m set m.balance = m.balance - ?2 where m.balance - ?2 > 0 and m.id = ?1")
-    Integer buy(String merchantId, BigDecimal quantity);
+    @Query(value = "update Merchant m set m.balance = m.balance + ?2 where m.balance - ?2 > 0 and m.id = ?1")
+    Integer updateBalance(String merchantId, BigDecimal quantity);
 }

+ 11 - 2
rankin-user-service/src/main/java/cn/rankin/userservice/service/PayingService.java

@@ -21,8 +21,12 @@ public class PayingService {
     @Autowired
     private LedgerService ledgerService;
 
+    public APIResult<Boolean> pay(String merchantId, BigDecimal quantity, LedgerTypeEnum type, String receiptId, String note) {
+        return this.change(merchantId, quantity.negate(), type, receiptId, note);
+    }
+
     @Transactional
-    public APIResult<Boolean> buy(String merchantId, BigDecimal quantity, LedgerTypeEnum type, String receiptId, String note) {
+    public APIResult<Boolean> change(String merchantId, BigDecimal quantity, LedgerTypeEnum type, String receiptId, String note) {
         Merchant merchant = merchantRepository.find(merchantId);
         if (merchant == null || !merchant.getStatus().equals(BaseStatusEnum.NORMAL)) {
             return APIResult.error(UserServiceAPICode.NOT_EXISTS);
@@ -32,7 +36,7 @@ public class PayingService {
             return APIResult.error(UserServiceAPICode.MONEY_NOT_ENOUGH);
         }
 
-        Integer count = merchantRepository.buy(merchantId, quantity);
+        Integer count = merchantRepository.updateBalance(merchantId, quantity);
         if (count <= 0) {
             return APIResult.error(UserServiceAPICode.PAY_FAILED);
         }
@@ -42,4 +46,9 @@ public class PayingService {
 
         return APIResult.ok();
     }
+
+    @Transactional
+    public APIResult<Boolean> charge(String merchantId, BigDecimal quantity, String note) {
+        return this.change(merchantId, quantity, LedgerTypeEnum.CHARGE, null, note);
+    }
 }