package com.learn.seller.controller;
import com.learn.entity.Order;
import com.learn.seller.params.OrderParam;
import com.learn.seller.service.OrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 订单相关
*/
@RestController
@RequestMapping("/order")
public class OrderController {
static Logger LOG = LoggerFactory.getLogger(OrderController.class);
@Autowired
private OrderService orderService;
/**
* 下单
*
* @param param
* @return
*/
@RequestMapping(value = "/apply", method = RequestMethod.POST)
public Order apply(@RequestHeader String authId,@RequestHeader String sign, @RequestBody OrderParam param) {
LOG.info("申购请求:{}", param);
Order order = new Order();
BeanUtils.copyProperties(param,order);
order = orderService.apply(order);
LOG.info("申购结果:{}", order);
return order;
}
}
package com.learn.seller.sign;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.learn.util.JsonUtil;
/**
* 签名明文
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder(alphabetic = true)
public interface SignText {
default String toText(){
return JsonUtil.toJson(this);
}
}
package com.learn.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.util.Date;
/**
* 订单
*/
@Entity(name = "order_t")
public class Order {
@Id
private String orderId;
//渠道id
private String chanId;
private String chanUserId;
/**
* @see com.learn.entity.enums.OrderType
*/
private String orderType;
private String productId;
private BigDecimal amount;
private String outerOrderId;
/**
* @see com.learn.entity.enums.OrderStatus
*/
private String orderStatus;
private String memo;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date createAt;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date updateAt;
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getChanUserId() {
return chanUserId;
}
public void setChanUserId(String chanUserId) {
this.chanUserId = chanUserId;
}
public String getOrderType() {
return orderType;
}
public void setOrderType(String orderType) {
this.orderType = orderType;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public String getOuterOrderId() {
return outerOrderId;
}
public void setOuterOrderId(String outerOrderId) {
this.outerOrderId = outerOrderId;
}
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this.createAt = createAt;
}
public Date getUpdateAt() {
return updateAt;
}
public void setUpdateAt(Date updateAt) {
this.updateAt = updateAt;
}
}
package com.learn.seller.params;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.learn.seller.sign.SignText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 下单请求参数
*/
public class OrderParam implements SignText{
//渠道id
private String chanId;
private String chanUserId;
private String productId;
private BigDecimal amount;
private String outerOrderId;
private String memo;
@JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
private Date createAt;
public String getChanId() {
return chanId;
}
public void setChanId(String chanId) {
this.chanId = chanId;
}
public String getChanUserId() {
return chanUserId;
}
public void setChanUserId(String chanUserId) {
this.chanUserId = chanUserId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public String getOuterOrderId() {
return outerOrderId;
}
public void setOuterOrderId(String outerOrderId) {
this.outerOrderId = outerOrderId;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public Date getCreateAt() {
return createAt;
}
public void setCreateAt(Date createAt) {
this.createAt = createAt;
}
}
package com.learn.seller.sign;
import com.learn.seller.service.SignService;
import com.learn.util.RSAUtil;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
/**
* 验签aop
*/
@Component
@Aspect
public class SignAop {
@Autowired
private SignService signService;
@Before(value = "execution(* com.learn.seller.controller.*.*(..)) && args(authId,sign,text,..)")
public void verify(String authId,String sign,SignText text){
String publicKey = signService.getPublicKey(authId);
Assert.isTrue(RSAUtil.verify(text.toText(),sign,publicKey),"验签失败");
}
}
package com.learn.seller.service;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 签名服务
*/
@Service
public class SignService {
static Map<String,String> PUBLIC_KEYS = new HashMap<>();
static {
PUBLIC_KEYS.put("1000","MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDovNC1bzzZ3lu//xLUIud8a8Fu\n" +
"bvgXVxFu7Z3jbBjc3thot8gIrpZt951MkdfcUK091kHiDmwiAnMkDJvZI1Y9cWcF\n" +
"gyKjczR1iDusUTPMGwHkligBx4ocVyoREz8mC0JliSnn8OKhutvnegyFsDI5lVuV\n" +
"ZyFQPGbzvXtYIJ+cBwIDAQAB");
}
/**
* 根据授权编号获取公钥
* @param authId
* @return
*/
public String getPublicKey(String authId){
return PUBLIC_KEYS.get(authId);
}
}