扫码王业务代码

This commit is contained in:
deng
2023-05-29 11:57:03 +08:00
parent 790920f13e
commit aae4ef8b48
21 changed files with 1322 additions and 92 deletions

View File

@@ -0,0 +1,12 @@
package cn.pluss.platform.access;
import cn.pluss.platform.access.domain.ReqEntity;
import cn.pluss.platform.access.domain.RespEntity;
public interface AccessService {
boolean checkSign(ReqEntity reqEntity);
void addSign(RespEntity respEntity);
}

View File

@@ -0,0 +1,33 @@
package cn.pluss.platform.access.domain;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum CodeEnum {
SUCCESS("0000", "操作成功"),
PARAM_ERROR("0001", "参数不正确"),
SIGN_ERROR("0002", "签名校验异常"),
ORG_ID_NOT_FOUND("0003", "缺少机构ID"),
STORE_NOT_FOUND("1001", "未找到机具"),
ORDER_NOT_FOUND("2001", "未找到订单"),
ORDER_REFUND_ERROR("2002", "订单退款异常"),
REFUND_ORDER_NOT_FOUND("2003", "未找到退款订单"),
PASSWORD_NOT_INIT("2011", "安全密码未初始化请前往收银呗APP进行初始化"),
PASSWORD_ERROR("2021", "安全密码错误若忘记密码可前往收银呗APP进行重置"),
;
private final String val;
private final String desc;
}

View File

@@ -0,0 +1,44 @@
package cn.pluss.platform.access.domain;
import cn.pluss.platform.access.exception.AccessException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class ReqEntity {
private String orgId;
private String requestId;
private String version;
private String timestamp;
private String reqData;
public JSONObject initJSONData() {
if (reqData == null) {
throw new AccessException(CodeEnum.PARAM_ERROR);
}
return JSON.parseObject(reqData);
}
private String signType;
private String sign;
public static String getSignContent(ReqEntity entity) {
return "orgId=" + entity.getOrgId() + "&" +
"reqData=" + entity.getReqData() + "&" +
"requestId=" + entity.getRequestId() + "&" +
"signType=" + entity.getSignType() + "&" +
"timestamp=" + entity.getTimestamp() + "&" +
"version=" + entity.getVersion();
}
}

View File

@@ -0,0 +1,94 @@
package cn.pluss.platform.access.domain;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.ValueFilter;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
@Getter
@Setter
public class RespEntity {
private String code;
private String msg;
private String respData;
private String sign;
private String signType;
private String orgId;
private String requestId;
public RespEntity(String orgId, CodeEnum codeEnum, Object respData, String requestId) {
this(orgId, codeEnum, respData, requestId, null);
}
public RespEntity(String orgId, String code, Object respData, String requestId) {
this(orgId, code, respData, requestId, null);
}
public RespEntity(String orgId, CodeEnum codeEnum, Object respData, String requestId, String msg) {
this.code = codeEnum.getVal();
this.requestId = requestId;
if (!ObjectUtils.isEmpty(msg)) {
this.msg = msg;
} else {
this.msg = codeEnum.getDesc();
}
this.signType = "RSA";
this.respData = JSON.toJSONString(respData, (ValueFilter) (object, name, value) -> {
if (value instanceof BigDecimal) {
return ((BigDecimal) value).toPlainString();
}
if (value instanceof Double || value instanceof Float) {
return String.valueOf(value);
}
return value;
});
this.orgId = orgId;
}
public RespEntity(String orgId, String code, Object respData, String requestId, String msg) {
this.code = code;
this.requestId = requestId;
this.msg = msg;
this.signType = "RSA";
this.respData = JSON.toJSONString(respData, (ValueFilter) (object, name, value) -> {
if (value instanceof BigDecimal) {
return ((BigDecimal) value).toPlainString();
}
if (value instanceof Double || value instanceof Float) {
return String.valueOf(value);
}
return value;
});
this.orgId = orgId;
}
public static String getSignContent(RespEntity entity) {
String signContent = "code=" + entity.getCode() + "&"
+ "msg=" + entity.getMsg() + "&"
+ "orgId=" + entity.getOrgId() + "&"
+ "requestId=" + entity.getRequestId() + "&";
if (entity.getRespData() != null) {
signContent += "respData=" + entity.getRespData() + "&";
}
signContent += "signType=" + entity.getSignType();
return signContent;
}
}

View File

@@ -0,0 +1,24 @@
package cn.pluss.platform.access.exception;
import cn.pluss.platform.access.domain.CodeEnum;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.util.ObjectUtils;
@NoArgsConstructor
@Getter
@Setter
public class AccessException extends RuntimeException {
private String code;
public AccessException(CodeEnum codeEnum, String msg) {
super(ObjectUtils.isEmpty(msg)? codeEnum.getDesc(): msg);
this.code = codeEnum.getVal();
}
public AccessException(CodeEnum codeEnum) {
this(codeEnum, null);
}
}

View File

@@ -0,0 +1,23 @@
package cn.pluss.platform.access.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
public interface AccessBizService {
Object machineStoreInfo(String snNo);
Object scanPay(JSONObject param);
Object orderStatus(String orderNum, String mercOrderNo);
Object refund(JSONObject param);
<T> List<T> refundList(JSONObject param);
Page<Object> orderList(JSONObject param);
Object dataAnalysis(JSONObject param);
}

View File

@@ -0,0 +1,504 @@
package cn.pluss.platform.access.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.pluss.platform.access.domain.CodeEnum;
import cn.pluss.platform.access.exception.AccessException;
import cn.pluss.platform.access.service.AccessBizService;
import cn.pluss.platform.api.ResultGenerator;
import cn.pluss.platform.deviceStock.DeviceStockService;
import cn.pluss.platform.dto.MerChantOrderDTO;
import cn.pluss.platform.entity.*;
import cn.pluss.platform.mapper.MerchantChannelStatusMapper;
import cn.pluss.platform.merchant.MerchantBaseInfoService;
import cn.pluss.platform.merchantOrder.MerchantOrderService;
import cn.pluss.platform.merchantStore.MerchantStoreService;
import cn.pluss.platform.pay.ApiPayService;
import cn.pluss.platform.pay.PayService;
import cn.pluss.platform.refundOrder.MerchantRefundOrderService;
import cn.pluss.platform.ryx.pay.RyxPayService;
import cn.pluss.platform.sxf.pay.SxfPayService;
import cn.pluss.platform.userInfo.UserInfoService;
import cn.pluss.platform.util.StringUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class AccessBizServiceImpl implements AccessBizService {
@Autowired
private DeviceStockService deviceStockService;
@Autowired
private MerchantBaseInfoService mbiService;
@Autowired
private MerchantOrderService orderService;
@Autowired
private MerchantStoreService merchantStoreService;
@Resource
private MerchantChannelStatusMapper mcsMapper;
@Autowired
private SxfPayService sxfPayService;
@Autowired
private RyxPayService ryxPayService;
@Autowired
@Qualifier("ysPayOldService")
private PayService ysPayOldService;
@Autowired
private ApiPayService apiPayService;
@Autowired
private UserInfoService userInfoService;
@Autowired
private MerchantRefundOrderService refundOrderService;
@Autowired
private HttpServletRequest request;
private MerchantBaseInfo getByDeviceNo(String deviceNo) {
DeviceStock deviceStock = deviceStockService.getDevicebyNo(deviceNo);
if (deviceStock == null) {
deviceStock = deviceStockService.getDeviceBySnNo(deviceNo);
}
if (deviceStock == null || !"3".equals(deviceStock.getStatus())) {
throw new AccessException(CodeEnum.STORE_NOT_FOUND);
}
MerchantBaseInfo mbi = mbiService.getById(deviceStock.getActMercId());
if (mbi == null) {
throw new AccessException(CodeEnum.STORE_NOT_FOUND);
}
return mbi;
}
@Override
public Object machineStoreInfo(String deviceNo) {
JSONObject result = new JSONObject();
DeviceStock deviceStock = deviceStockService.getDevicebyNo(deviceNo);
if (deviceStock == null) {
deviceStock = deviceStockService.getDeviceBySnNo(deviceNo);
}
// 未入库
result.put("status", "-3");
result.put("remark", "机具未入库");
if (deviceStock == null) {
return result;
}
// 未绑定商户
result.put("status", "-2");
result.put("remark", "未绑定商户");
if (!"3".equals(deviceStock.getStatus())) {
return result;
} else {
result.put("status", "-1");
result.put("remark", "未获取到商户信息");
}
String actMercId = deviceStock.getActMercId();
if (ObjectUtils.isEmpty(actMercId)) {
return result;
}
MerchantBaseInfo mbi = mbiService.getById(actMercId);
if (mbi == null) {
return result;
}
// 已绑定商户
result.put("status", "1");
result.put("remark", "商户信息获取成功");
result.put("merchantName", mbi.getMerchantName());
result.put("alias", mbi.getAlias());
return result;
}
@Override
public Object scanPay(JSONObject param) {
String authCode = param.getString("authCode");
BigDecimal consumeFee = param.getBigDecimal("consumeFee");
String type = param.getString("type");
String deviceNo = param.getString("deviceNo");
String remark = param.getString("remark");
String mercOrderNo = param.getString("mercOrderNo");
// 必传参数
if (ObjectUtils.isEmpty(authCode)
|| ObjectUtils.isEmpty(consumeFee)
|| ObjectUtils.isEmpty(type)
|| ObjectUtils.isEmpty(deviceNo)) {
throw new AccessException(CodeEnum.PARAM_ERROR);
}
MerchantBaseInfo mbi = getByDeviceNo(deviceNo);
MerchantStore merchantStore = merchantStoreService.getStoreByMerchantCode(mbi.getMerchantCode());
MerChantOrderDTO dto = new MerChantOrderDTO();
dto.setType(type);
dto.setConsumeFee(consumeFee.doubleValue());
dto.setAuthCode(authCode);
dto.setUserId(mbi.getUserId());
dto.setDeviceNo(deviceNo);
dto.setStoreId(merchantStore.getStoreId());
dto.setMerchantCode(mbi.getMerchantCode());
dto.setRemark(remark);
dto.setMercOrderNo(mercOrderNo);
return orderService.toActivePayV2(dto, request);
}
@Override
public Object orderStatus(String orderNum, String mercOrderNo) {
// 校验参数是否完整
if (ObjectUtils.isEmpty(orderNum) && ObjectUtils.isEmpty(mercOrderNo)) {
return ResultGenerator.genFailResult("订单号不能为空");
}
QueryWrapper<MerchantOrder> queryWrapper = new QueryWrapper<MerchantOrder>()
.eq(!ObjectUtils.isEmpty(orderNum), "orderNumber", orderNum)
.eq(!ObjectUtils.isEmpty(mercOrderNo), "mercOrderNo", mercOrderNo);
MerchantOrder order = orderService.getOne(queryWrapper);
if (order == null) {
throw new AccessException(CodeEnum.ORDER_NOT_FOUND);
}
//支付成功
if ("1".equals(order.getStatus())) {
JSONObject result = new JSONObject();
result.put("status", "1");
result.put("orderNumber", order.getOrderNumber());
result.put("mercOrderNo", order.getMercOrderNo());
result.put("transTime", DateUtil.format(order.getCreateDt(), DatePattern.NORM_DATETIME_FORMAT));
result.put("consumeFee", order.getConsumeFee());
result.put("payType", order.getPayTypeCode());
return result;
}
String aisleSwitch = order.getAisleSwitch();
MerchantChannelStatus channel = null;
switch (aisleSwitch) {
case "2":
channel = mcsMapper.getByMerchantCode(order.getMerchantCode(), 1);
break;
default:
channel = mcsMapper.getByMerchantCode(order.getMerchantCode(), Integer.valueOf(aisleSwitch));
break;
}
if (channel != null) {
JSONObject result = null;
switch (channel.getChannel()) {
case 1:
result = sxfPayService.tradeQuery(order, channel.getMerchantId());
break;
case 3:
result = ryxPayService.tradeQuery(order, channel.getMerchantId());
break;
case 4:
result = ysPayOldService.tradeQuery(order, channel.getMerchantId());
break;
}
if (result != null) {
orderService.updateOrderStatus(result, order);
String status = result.getString("payStatus");
if ("1".equals(status)) {
order.setStatus("1");
}
}
}
JSONObject result = new JSONObject();
result.put("status", order.getStatus());
result.put("orderNumber", order.getOrderNumber());
result.put("mercOrderNo", order.getMercOrderNo());
result.put("transTime", DateUtil.format(order.getCreateDt(), DatePattern.NORM_DATETIME_FORMAT));
result.put("consumeFee", order.getConsumeFee());
result.put("payType", order.getPayTypeCode());
return result;
}
@Override
public Object refund(JSONObject param) {
String deviceNo = param.getString("deviceNo");
String orderNumber = param.getString("orderNumber");
param.put("thirdSendNo", param.getString("channelTransNo"));
BigDecimal refundAmt = param.getBigDecimal("refundAmt");
String refundFlag = param.getString("refundFlag");
// String pwd = param.getString("pwd");
MerchantBaseInfo mbi = getByDeviceNo(deviceNo);
// UserInfo userInfo = userInfoService.getById(mbi.getUserId());
// if (ObjectUtils.isEmpty(pwd)) {
// throw new AccessException(CodeEnum.PARAM_ERROR, "安全密码不能为空");
// }
// String payPassword = userInfo.getPayPassword();
// if (payPassword == null) {
// throw new AccessException(CodeEnum.PASSWORD_NOT_INIT);
// }
//
// if (!payPassword.equalsIgnoreCase(MD5Util.MD5Encode(pwd, "utf-8"))) {
// throw new AccessException(CodeEnum.PASSWORD_ERROR);
// }
param.put("merchant", mbi);
if (!"1".equals(refundFlag)) {
if (ObjectUtils.isEmpty(refundAmt)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "未选择全额退款时,退款金额不能为空");
}
if (!StringUtil.isNumber(param.getString("refundAmt"))) {
throw new AccessException(CodeEnum.PARAM_ERROR, "退款金额格式有误,小数点保留后两位");
}
}
try {
JSONObject jsonObject = apiPayService.apiRefundPay(param);
jsonObject.remove("sign");
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
throw new AccessException(CodeEnum.ORDER_REFUND_ERROR, e.getMessage());
}
}
@Override
public List<JSONObject> refundList(JSONObject param) {
String deviceNo = param.getString("deviceNo");
String orderNumber = param.getString("orderNumber");
String mercOrderNo = param.getString("mercOrderNo");
String thirdTransNo = param.getString("thirdTransNo");
String channelTransNo = param.getString("channelTransNo");
String refundNo = param.getString("refundNo");
String mercRefundNo = param.getString("mercRefundNo");
if (ObjectUtils.isEmpty(deviceNo)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "缺少设备编号");
}
if (ObjectUtils.isEmpty(orderNumber)
&& ObjectUtils.isEmpty(mercOrderNo)
&& ObjectUtils.isEmpty(thirdTransNo)
&& ObjectUtils.isEmpty(channelTransNo)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "缺少原交易订单号");
}
MerchantBaseInfo mbi = getByDeviceNo(deviceNo);
LambdaQueryWrapper<MerchantRefundOrder> qWrapper = Wrappers.lambdaQuery();
qWrapper.eq(!ObjectUtils.isEmpty(orderNumber), MerchantRefundOrder::getOrderNumber, orderNumber);
qWrapper.eq(!ObjectUtils.isEmpty(refundNo), MerchantRefundOrder::getRefundNo, refundNo);
qWrapper.eq(MerchantRefundOrder::getMerchantCode, mbi.getMerchantCode());
qWrapper.eq(!ObjectUtils.isEmpty(mercRefundNo), MerchantRefundOrder::getMercRefundNo, mercRefundNo);
qWrapper.orderByDesc(MerchantRefundOrder::getRefundTime);
List<MerchantRefundOrder> refundOrderList = refundOrderService.list(qWrapper);
if (CollectionUtil.isEmpty(refundOrderList)) {
throw new AccessException(CodeEnum.REFUND_ORDER_NOT_FOUND);
}
List<JSONObject> result = new ArrayList<>();
for (MerchantRefundOrder item : refundOrderList) {
JSONObject jsonItem = new JSONObject();
jsonItem.put("orderNumber", item.getOrderNumber());
jsonItem.put("refundNo", item.getRefundNo());
jsonItem.put("mercRefundNo", item.getMercRefundNo());
jsonItem.put("refundTime", DateUtil.format(item.getRefundTime(), DatePattern.NORM_DATETIME_PATTERN));
jsonItem.put("status", item.getStatus());
jsonItem.put("oPayAmt", item.getPayAmt());
jsonItem.put("refundAmt", item.getRefundAmt());
jsonItem.put("payType", item.getPayTypeCode());
result.add(jsonItem);
}
return result;
}
@Override
public Page<Object> orderList(JSONObject param) {
String deviceNo = param.getString("deviceNo");
Integer page = param.getInteger("page");
Integer size = param.getInteger("size");
String date = param.getString("date");
// 1: 日; 2: 月
String type = param.getString("type");
Map<String, Object> condition = new HashMap<>();
condition.put("createDate", date);
condition.put("snNo", deviceNo);
List<String> statusList = CollectionUtil.list(false, "1", "2", "6");
IPage<MerchantOrder> pageInfo = new Page<>(page, size);
if (ObjectUtils.isEmpty(type)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "类型不能为空");
}
if (!ArrayUtil.contains(new String[]{"1", "2"}, type)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "类型只能为1(日)或者2(月)");
}
if (ObjectUtils.isEmpty(date)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "日期不能为空");
}
if (ObjectUtils.isEmpty(page)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "页码不能为空");
}
if (ObjectUtils.isEmpty(size)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "页长不能为空");
}
if (size > 1000) {
throw new AccessException(CodeEnum.PARAM_ERROR, "查询单次不能超过1000条");
}
MerchantBaseInfo mbi = getByDeviceNo(deviceNo);
condition.put("merchantCode", mbi.getMerchantCode());
orderService.pageData(pageInfo, condition, statusList);
Page<Object> resultPage = new Page<>(page, size);
resultPage.setTotal(pageInfo.getTotal());
List<Object> result = new ArrayList<>();
for (MerchantOrder item : pageInfo.getRecords()) {
JSONObject orderItem = new JSONObject();
orderItem.put("orderNumber", item.getOrderNumber());
orderItem.put("consumeFee", item.getConsumeFee());
orderItem.put("status", item.getStatus());
orderItem.put("alias", item.getMerchantName());
orderItem.put("channelTransNo", item.getThirdSendNo());
orderItem.put("thirdTransNo", item.getThirdTransNo());
orderItem.put("transTime", DateUtil.format(item.getTransDt(), DatePattern.NORM_DATETIME_FORMAT));
if (item.getStatus().equals("2")) {
orderItem.put("refundAmt", item.getRefundAmt());
orderItem.put("refundTime", DateUtil.format(item.getUpdateTime(), DatePattern.NORM_DATETIME_FORMAT));
}
orderItem.put("payType", item.getPayTypeCode());
result.add(orderItem);
}
resultPage.setPages(pageInfo.getPages());
resultPage.setRecords(result);
return resultPage;
}
@Override
public Object dataAnalysis(JSONObject param) {
String deviceNo = param.getString("deviceNo");
MerchantBaseInfo mbi = getByDeviceNo(deviceNo);
String type = param.getString("type");
String date = param.getString("date");
JSONObject result = new JSONObject();
if (ObjectUtils.isEmpty(type)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "类型不能为空");
}
if (!ArrayUtil.contains(new String[]{"1", "2"}, type)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "类型只能为1(日)或者2(月)");
}
if (ObjectUtils.isEmpty(date)) {
throw new AccessException(CodeEnum.PARAM_ERROR, "日期不能为空");
}
LambdaQueryWrapper<MerchantOrder> qWrapper = Wrappers.lambdaQuery();
qWrapper.likeRight(MerchantOrder::getCreateDate, date)
.eq(MerchantOrder::getMerchantCode, mbi.getMerchantCode())
.eq(MerchantOrder::getSnNo, deviceNo)
.eq(MerchantOrder::getStatus, "1");
int transCount = orderService.count(qWrapper);
result.put("transCount", transCount);
qWrapper.clear();
qWrapper.likeRight(MerchantOrder::getCreateDate, date)
.eq(MerchantOrder::getMerchantCode, mbi.getMerchantCode())
.eq(MerchantOrder::getSnNo, deviceNo)
.eq(MerchantOrder::getStatus, "2");
int refundCount = orderService.count(qWrapper);
result.put("refundCount", refundCount);
QueryWrapper<MerchantOrder> qWrapper2 = Wrappers.query();
qWrapper2.likeRight("createDate", date)
.eq("merchantCode", mbi.getMerchantCode())
.eq("snNo", deviceNo)
.eq("status", "1")
.select("SUM(consumeFee) transFee");
BigDecimal transFee = orderService.getObj(qWrapper2, (SFunction<Object, BigDecimal>) o -> {
if (o == null) {
return BigDecimal.ZERO;
}
if (o instanceof BigDecimal) {
return (BigDecimal) o;
}
return new BigDecimal(o.toString());
});
if (transFee == null) {
transFee = BigDecimal.ZERO;
}
result.put("transFee", transFee);
BigDecimal refundFee = orderService.getRefundAmt(mbi.getMerchantCode(), deviceNo, date);
if (refundFee == null) {
refundFee = BigDecimal.ZERO;
}
result.put("refundFee", refundFee);
return result;
}
}

View File

@@ -0,0 +1,43 @@
package cn.pluss.platform.access.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.SignUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import cn.pluss.platform.access.AccessService;
import cn.pluss.platform.access.domain.ReqEntity;
import cn.pluss.platform.access.domain.RespEntity;
import cn.pluss.platform.entity.AccessChannelCipherCode;
import cn.pluss.platform.mapper.AccessChannelCipherCodeMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
@Service
public class AccessServiceImpl implements AccessService {
@Resource
private AccessChannelCipherCodeMapper acccMapper;
@Override
public boolean checkSign(ReqEntity reqEntity) {
AccessChannelCipherCode accc = acccMapper.selectAllByOrgId(reqEntity.getOrgId());
String orgPubKey = accc.getOrgPubKey();
Sign sign = SignUtil.sign(SignAlgorithm.SHA256withRSA, null, orgPubKey);
String signContent = ReqEntity.getSignContent(reqEntity);
return sign.verify(signContent.getBytes(StandardCharsets.UTF_8), Base64.decode(reqEntity.getSign()));
}
@Override
public void addSign(RespEntity respEntity) {
String signContent = RespEntity.getSignContent(respEntity);
AccessChannelCipherCode accc = acccMapper.selectAllByOrgId(respEntity.getOrgId());
Sign sign = SignUtil.sign(SignAlgorithm.SHA256withRSA, accc.getPriKey(), null);
byte[] signBytes = sign.sign(signContent);
respEntity.setSign(Base64.encode(signBytes));
}
}

View File

@@ -31,6 +31,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@@ -65,6 +66,9 @@ public class AliScanCodeDeviceServiceImpl implements AliDeviceService {
@Resource
private MerchantChannelStatusService channelService;
@Resource
private HttpServletRequest request;
@Override
public RespDeviceEntity getDeviceStatusV1(String deviceNo) {
if(StringUtil.isEmpty(deviceNo)){
@@ -139,7 +143,7 @@ public class AliScanCodeDeviceServiceImpl implements AliDeviceService {
dto.setDeviceNo(entity.getCode());
dto.setRemark(entity.getRemark());
try {
Result<Object> mapResult = merchantOrderService.toActivePay(dto);
Result<Object> mapResult = merchantOrderService.toActivePay(dto, request);
Object data = mapResult.getData();
if (ResultCode.TRANSUNKNOW.code() == mapResult.getCode()) {
return RespDeviceEntity.await(mapResult.getMessage(),((Map)data).get("orderNumber"));

View File

@@ -9,9 +9,11 @@ import cn.pluss.platform.mapper.MerchantOrderMapper;
import cn.pluss.platform.vo.*;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -21,6 +23,14 @@ import java.util.Map;
*/
public interface MerchantOrderService extends IService<MerchantOrder> {
default Page<MerchantOrder> pageData(IPage<MerchantOrder> page, Map<String, Object> map, List<String> statusList) {
return ((MerchantOrderMapper) getBaseMapper()).page(page, map, statusList);
}
default BigDecimal getRefundAmt(String merchantCode, String snNo, String date) {
return ((MerchantOrderMapper) getBaseMapper()).selectRefundAmt(merchantCode, snNo, date);
}
default MerchantOrder queryMerchantOrder(MerchantOrder merchantOrder) {
return getBaseMapper().selectOne(new QueryWrapper<>(merchantOrder));
}
@@ -261,7 +271,15 @@ public interface MerchantOrderService extends IService<MerchantOrder> {
* @param merchantOrderDTO ignored
* @return ignored
*/
Result<Object> toActivePay(MerChantOrderDTO merchantOrderDTO);
Result<Object> toActivePay(MerChantOrderDTO merchantOrderDTO, HttpServletRequest request);
/**
* 扫用户二维码支付
*
* @param merchantOrderDTO ignored
* @return ignored
*/
JSONObject toActivePayV2(MerChantOrderDTO merchantOrderDTO, HttpServletRequest request);
/**
* 主扫会员卡支付
@@ -275,7 +293,7 @@ public interface MerchantOrderService extends IService<MerchantOrder> {
* @param memberRechargeDTO ignored
* @return ignored
*/
Result<Map<String, Object>> toMemberRecharge(MemberRechargeDTO memberRechargeDTO);
Result<Map<String, Object>> toMemberRecharge(MemberRechargeDTO memberRechargeDTO, HttpServletRequest request);
/**
* 退款

View File

@@ -18,6 +18,7 @@ import cn.pluss.platform.entitiy.SettleTypeEnum;
import cn.pluss.platform.entity.*;
import cn.pluss.platform.enums.UserRoleEnum;
import cn.pluss.platform.exception.MsgException;
import cn.pluss.platform.ipLocation.IpLocationService;
import cn.pluss.platform.mapper.*;
import cn.pluss.platform.memberOrder.MemberOrderService;
import cn.pluss.platform.merchant.MerchantCashPlaceService;
@@ -81,6 +82,7 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
@@ -98,6 +100,10 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
@Autowired
private GeneralPushUtil generalPushUtil;
@Lazy
@Resource
private IpLocationService ipLocationService;
@Setter(onMethod_ = {@Autowired})
private MerchantOrderVOMapper merchantOrderVOMapper;
@@ -439,7 +445,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
BigDecimal todayConsumeFee = BigDecimal.ZERO;
int orderCount = 0;// 今日订单数量
Integer fanCount = 0;// 今日粉丝数量
LambdaQueryWrapper<MerchantOrder> queryWrapperTotal = Wrappers.lambdaQuery();
Date dayBegin = DateUtils.getDayBegin();
@@ -684,7 +690,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
*
* @param
* @return
*
*
* @author Administrator
* @since JDK 1.8
*/
@@ -771,7 +777,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
@Override
public Result<Object> toActivePay(MerChantOrderDTO dto) {
public Result<Object> toActivePay(MerChantOrderDTO dto, HttpServletRequest request) {
//校验参数
checkActivePayParamsMap(dto);
//组装订单参数
@@ -786,11 +792,42 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
result.put("message", "交易成功");
return ResultGenerator.genSuccessResult("支付成功", result);
}else{
MerchantOrder order = getMerchantOrder(dto, dto.getConsumeFee(), "1","1");
MerchantOrder order = getMerchantOrder(dto, dto.getConsumeFee(), "1","1", request);
return activePay(order, dto);
}
}
@Override
public JSONObject toActivePayV2(MerChantOrderDTO dto, HttpServletRequest request) {
//校验参数
checkActivePayParamsMap(dto);
//组装订单参数
if (StringUtils.isNotEmpty(dto.getType()) && "3".equals(dto.getType())) {
MerchantMemberCode menberCode = dto.getMercMenberCode();
MerchantMenber menber = merchantMenberMapper.getByCardNo(menberCode.getCardNo());
MemberScanPayDTO memberScanPayDTO = new MemberScanPayDTO(dto, menber);
MemberScanVO vo = getMemberPayOrder(memberScanPayDTO, menber);
JSONObject result = new JSONObject();
result.put("orderNumber", vo.getOrderNumber());
result.put("consumeFee", vo.getConsumeFee());
result.put("status", "1");
return result;
} else {
MerchantOrder order = getMerchantOrder(dto, dto.getConsumeFee(), "1", "1", request);
Result<Object> objectResult = activePay(order, dto);
JSONObject result = new JSONObject();
result.put("orderNumber", order.getOrderNumber());
result.put("consumeFee", order.getConsumeFee());
result.put("status", order.getStatus());
result.put("remark", objectResult.getMessage());
return result;
}
}
/**
* 主扫会员卡支付
*
@@ -814,11 +851,11 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
*/
@Override
@Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)
public Result<Map<String, Object>> toMemberRecharge(MemberRechargeDTO dto) {
public Result<Map<String, Object>> toMemberRecharge(MemberRechargeDTO dto, HttpServletRequest req) {
// 校验参数
checkActivePayParamsMap(dto);
MerchantOrder order = getMerchantOrder(dto, Double.parseDouble(dto.getRechargeMoney()), "1","5");
MerchantOrder order = getMerchantOrder(dto, Double.parseDouble(dto.getRechargeMoney()), "1","5", req);
QueryWrapper<MerchantMenber> menberWrapper = new QueryWrapper<MerchantMenber>()
.eq("phone", dto.getPhone()).eq("merchantCode", dto.getMerchantCode()).eq("storeId", dto.getStoreId());
@@ -1218,7 +1255,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
/**
* merchantIncome:(添加收益记录). <br/>
*
*
*
* @author Administrator
* @since JDK 1.8
*/
@@ -1244,7 +1281,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
* @param orderType 订单类型 5 APP扫码充值
* @return
*/
private MerchantOrder getMerchantOrder(MerChantOrderDTO dto, Double amt, String type,String orderType) {
private MerchantOrder getMerchantOrder(MerChantOrderDTO dto, Double amt, String type,String orderType, HttpServletRequest request) {
MerchantOrder merchantOrder = new MerchantOrder();
MerchantCashPlaceStaff cashPlaceStaff = new MerchantCashPlaceStaff();
@@ -1305,6 +1342,12 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
}else{
merchantOrder.setSettlementType(SettleTypeEnum.D1.getValue());
}
//主扫记录商户交易ip 不一定准确
String ip = IpUtils.getIpAddr(request);
merchantOrder.setIp(ip);
String ipAddress = IpUtils.getIpLoactionAddress(ipLocationService.getLocation(ip));
merchantOrder.setIpAddress(ipAddress);
return merchantOrder;
}

View File

@@ -29,6 +29,8 @@ public interface ApiPayService {
*/
Result<Object> refundQuery(JSONObject params);
JSONObject apiRefundPay(JSONObject params);
/**
* @description:api退款
* @date: 2021/11/22 10:48

View File

@@ -801,11 +801,11 @@ public class ApiPayServiceImpl implements ApiPayService {
}
return ResultGenerator.genFailResult("订单号有误,退款订单不存在!");
}
/**
* @description:api退款功能
* @date: 2021/11/22 10:49
* @param params:
* @param params:
* @return cn.pluss.platform.api.Result<com.alibaba.fastjson.JSONObject>
*/
@Override
@@ -844,7 +844,7 @@ public class ApiPayServiceImpl implements ApiPayService {
}
//退款操作
private JSONObject apiRefundPay(JSONObject params) {
public JSONObject apiRefundPay(JSONObject params) {
MerchantBaseInfo merchant = params.getObject("merchant", MerchantBaseInfo.class);
String refundReason = StringUtil.isEmpty(params.getString("refundReason")) ? "订单退款" : params.getString("refundReason");
String mercOrderNo = params.getString("mercOrderNo");