From eebaa66f4358faf7c2d508f01d271f698eb7e46e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E9=B9=8F=E8=BE=89?= <18322780655@163.com> Date: Thu, 3 Aug 2023 14:50:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B9=E7=9B=AE=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/system/service/AgencyService.java | 22 ++ .../common/system/config/Result.java | 67 ++++++ .../common/system/config/ResultCode.java | 41 ++++ .../common/system/config/ResultGenerator.java | 97 ++++++++ .../common/system/myEnum/SettleTypeEnum.java | 40 ++++ .../common/system/util/MD5Util.java | 83 +++++++ .../common/system/util/SignUtils.java | 160 +++++++++++++ .../dao/TbPlussMerchantBaseInfoMapper.java | 2 + .../TbPlussMerchantChannelStatusMapper.java | 7 + .../dao/TbPlussMerchantOrderMapper.java | 2 + .../dao/TbPlussMerchantStoreMapper.java | 5 + .../dao/TbPlussSubMercCodeYsMapper.java | 2 + .../entity/TbPlussMerchantChannelStatus.java | 10 + .../mapper/TbPlussMerchantBaseInfoMapper.xml | 4 + .../TbPlussMerchantChannelStatusMapper.xml | 17 ++ .../mapper/TbPlussMerchantOrderMapper.xml | 4 + .../mapper/TbPlussMerchantStoreMapper.xml | 14 ++ .../mapper/TbPlussSubMercCodeYsMapper.xml | 4 + newadmin/merchant-service-api/pom.xml | 3 +- newadmin/order-service/pom.xml | 33 +++ .../order/controller/OrderController.java | 4 + .../system/order/service/OrderParamCheck.java | 218 ++++++++++++++++++ .../system/order/service/OrderService.java | 82 +++++++ newadmin/pom.xml | 1 + 24 files changed, 920 insertions(+), 2 deletions(-) create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/Result.java create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultCode.java create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultGenerator.java create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/myEnum/SettleTypeEnum.java create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/MD5Util.java create mode 100644 newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/SignUtils.java create mode 100644 newadmin/order-service/pom.xml create mode 100644 newadmin/order-service/src/main/java/com/chaozhanggui/system/order/controller/OrderController.java create mode 100644 newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderParamCheck.java create mode 100644 newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderService.java diff --git a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/AgencyService.java b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/AgencyService.java index 3626add..a2a14d8 100644 --- a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/AgencyService.java +++ b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/AgencyService.java @@ -45,6 +45,8 @@ public class AgencyService { @Autowired TbPlussMerchantBackLklMapper tbPlussMerchantBackLklMapper; + @Autowired + TbPlussMerchantBaseInfoMapper tbPlussMerchantBaseInfoMapper; @@ -192,6 +194,26 @@ public class AgencyService { list1.add(hashMap); } } + Map stringObjectMap=new HashMap<>(); + TbPlussMerchantBaseInfo baseInfo=tbPlussMerchantBaseInfoMapper.selectByUserId(id); + if(ObjectUtil.isNotEmpty(baseInfo)){ + stringObjectMap.put("merchantCode",baseInfo.getMerchantcode()); + stringObjectMap.put("alias",baseInfo.getAlias()); + stringObjectMap.put("merchantType",baseInfo.getMerchanttype()); + switch (baseInfo.getMerchanttype()){ + case "1": + stringObjectMap.put("merchantTypeName","小微"); + break; + case "2": + stringObjectMap.put("merchantTypeName","个体"); + break; + case "3": + stringObjectMap.put("merchantTypeName","企业"); + break; + } + } + + it.put("merchantBaseInfo",stringObjectMap); it.put("merchantChannel",list1); } ); diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/Result.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/Result.java new file mode 100644 index 0000000..6541181 --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/Result.java @@ -0,0 +1,67 @@ +package com.chaozhanggui.common.system.config; + + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 统一API响应结果封装 + * @author DJH + */ +@Data +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class Result { + private int code; + private String message; + private T data; + private String respCode; + + private T list; + + private String totalCount; + + private String timestamp; + + public Result setCode(ResultCode resultCode) { + this.code = resultCode.code(); + return this; + } + + public Result(ResultCode resultCode, String message) { + this(resultCode, message, null); + } + + public Result(ResultCode resultCode, String message, T data) { + this.code = resultCode.code(); + this.message = message; + this.data = data; + timestamp = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + } + + public Result(int code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + timestamp = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + } + + public Result(int code, String message) { + this.code = code; + this.message = message; + timestamp = DateUtil.format(new Date(), "yyyyMMddHHmmss"); + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } + +} diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultCode.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultCode.java new file mode 100644 index 0000000..f7b1232 --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultCode.java @@ -0,0 +1,41 @@ +package com.chaozhanggui.common.system.config; + +/** + * 响应码枚举,参考HTTP状态码的语义 + */ +public enum ResultCode { + //成功 + SUCCESS(200), + //失败 + FAIL(400), + //未认证(签名错误) + UNAUTHORIZED(401), + //未认证(签名错误) + PARAM_ERROR(422), + // 403 + FORBIDDEN(403), + //接口不存在 + NOT_FOUND(404), + //服务器内部错误 + INTERNAL_SERVER_ERROR(500), + // 服务不可达 + SERVICE_UNAVAILABLE(503), + //未认证(签名错误) + NOT_TOKEN(401), + //无数据 + UNDEFINDE(201), + /** + * 交易未知 查询交易结果 + */ + TRANSUNKNOW(202); + + private final int code; + + ResultCode(int code) { + this.code = code; + } + + public int code() { + return code; + } +} diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultGenerator.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultGenerator.java new file mode 100644 index 0000000..e96dbee --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/config/ResultGenerator.java @@ -0,0 +1,97 @@ +package com.chaozhanggui.common.system.config; + +import com.alibaba.fastjson.JSONObject; + +/** + * 响应结果生成工具 + */ +public class ResultGenerator { + public static final String DEFAULT_SUCCESS_MESSAGE = "操作成功"; + public static final String DEFAULT_FAIL_MESSAGE = "操作失败!"; + + public static Result genSuccessResult() { + return new Result() + .setCode(ResultCode.SUCCESS) + .setMessage(DEFAULT_SUCCESS_MESSAGE); + } + + public static Result genUndefinedResult(String message) { + return new Result() + .setCode(ResultCode.UNDEFINDE) + .setMessage(message); + } + + public static Result genSuccessResult(String msg, T data) { + return new Result<>(ResultCode.SUCCESS, msg, data); + } + + public static Result genSuccessResult(T data) { + return new Result<>(ResultCode.SUCCESS, DEFAULT_SUCCESS_MESSAGE, data); + } + + public static Result genResult(String data) { + return new Result<>(ResultCode.SUCCESS, data); + } + + public static Result genTransunKonwResult(String message) { + return new Result<>().setCode(ResultCode.TRANSUNKNOW).setMessage(message); + } + + public static Result genTransunKonwResult(String message,T data){ + return new Result<>(ResultCode.TRANSUNKNOW, message, data); + } + + public static Result genFailResult(String message) { + return new Result<>(ResultCode.FAIL, message, null); + } + + public static Result genFailResult(String message,T data) { + return new Result<>(ResultCode.FAIL, message, data); + } + + + public static Result genFailResult(T data) { + return new Result<>(ResultCode.FAIL, DEFAULT_FAIL_MESSAGE, data); + } + + public static JSONObject genFailJsonResult(String message) { + JSONObject result = new JSONObject(); + result.put("code",ResultCode.FAIL.code()); + result.put("message",message); + result.put("data",null); + return result; + } + + public static JSONObject genSuccessJsonResult(String message,Object data) { + JSONObject result = new JSONObject(); + result.put("code",ResultCode.SUCCESS.code()); + result.put("message",message); + result.put("data",data); + return result; + } + public static JSONObject genSuccessJsonResult(Object data) { + JSONObject result = new JSONObject(); + result.put("code",ResultCode.SUCCESS.code()); + result.put("message","请求成功"); + result.put("data",data); + return result; + } + public static JSONObject genSuccessJsonPos(Object data, String appId, String requestId) { + JSONObject result = new JSONObject(); + result.put("code","0000"); + result.put("msg","操作成功"); + result.put("appId", appId); + result.put("requestId", requestId); + result.put("respData", data); + return result; + } + public static JSONObject genFailJsonPos(String msg, String appId, String requestId) { + JSONObject result = new JSONObject(); + result.put("code","400"); + result.put("msg", msg); + result.put("appId", appId); + result.put("requestId", requestId); + return result; + } + +} diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/myEnum/SettleTypeEnum.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/myEnum/SettleTypeEnum.java new file mode 100644 index 0000000..ab6b2ac --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/myEnum/SettleTypeEnum.java @@ -0,0 +1,40 @@ +package com.chaozhanggui.common.system.myEnum; + +import com.chaozhanggui.common.system.config.MsgException; +import lombok.AllArgsConstructor; +import lombok.Getter; + + +/** + * 结算类型枚举 + * @author Administrator + * @date 2021/07/12 + */ +@Getter +@AllArgsConstructor +public enum SettleTypeEnum { + + D0("D0",0,"D0实时结算"), + D1("D1",1,"D1次日结算"); + + private String code; + + private Integer value; + + private String name; + + public static boolean checkValues(String code) { + SettleTypeEnum[] settleTypeEnums = values(); + boolean flag = false; + for (SettleTypeEnum businessModeEnum : settleTypeEnums) { + if(businessModeEnum.getCode().equals(code)){ + flag = true; + } + } + if(!flag){ + MsgException.throwException("结算参数有误!"); + } + return true; + } + +} diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/MD5Util.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/MD5Util.java new file mode 100644 index 0000000..3bb22a6 --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/MD5Util.java @@ -0,0 +1,83 @@ +package com.chaozhanggui.common.system.util; + +import java.security.MessageDigest; + +public class MD5Util { + private static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) + resultSb.append(byteToHexString(b[i])); + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n += 256; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + public static String MD5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = origin; + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) + resultString = byteArrayToHexString(md.digest(resultString + .getBytes())); + else + resultString = byteArrayToHexString(md.digest(resultString + .getBytes(charsetname))); + } catch (Exception exception) { + } + return resultString; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + + /** + * MD5指纹算法 + * + * @param str + * @return + */ + public static String md5(String str) { + if (str == null) { + return null; + } + + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(str.getBytes()); + return bytesToHexString(messageDigest.digest()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** + * 将二进制转换成16进制 + * + * @param src + * @return + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + +} diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/SignUtils.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/SignUtils.java new file mode 100644 index 0000000..39a1ee2 --- /dev/null +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/SignUtils.java @@ -0,0 +1,160 @@ +package com.chaozhanggui.common.system.util; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.Map; +import java.util.TreeMap; + +/** + * 签名工具类 + */ +@Slf4j +public class SignUtils { + + /** + * 获取签名之前的源串 按照ASCII 排序 + * + * @param object + * @return + */ + public static String getSignContent(JSONObject object) { + TreeMap map = JSONObject.parseObject(JSONObject.toJSONString(object), TreeMap.class); + StringBuilder sb = new StringBuilder(); + for (Map.Entry o : map.entrySet()) { + String key = o.getKey(); + Object value = o.getValue(); + if ("sign".contains(key)) { + continue; + } + if (value != null) { + sb.append(key).append("=").append(value).append("&"); +// if(value instanceof ArrayList || value instanceof Map){ +// sb.append(key).append("=").append(JSON.toJSONString(value)).append("&"); +// }else{ +// sb.append(key).append("=").append(value).append("&"); +// } + } + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + + public static String wapGetSign(JSONObject object,String key) { + String checkSign = MD5Util.MD5Encode(getSignContent(object) + "&key=" + key, "UTF-8"); + return checkSign; + } + + /** + * 获取签名之前的源串 按照ASCII 排序 + * + * @param object + * @return + */ + public static String getYSSignContent(JSONObject object) { + String s = JSONObject.toJSONString(object); + TreeMap map = JSONObject.parseObject(s, TreeMap.class); + StringBuilder sb = new StringBuilder(); + for (Map.Entry o : map.entrySet()) { + String key = o.getKey(); + Object value = o.getValue(); + if ("sign".contains(key)) { + continue; + } + if (ObjectUtil.isNotEmpty(value)) { + sb.append(key).append("=").append(value).append("&"); + } + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + + public static String getSignContent1(JSONObject object,String appSerct) { + TreeMap map = JSONObject.parseObject(JSONObject.toJSONString(object), TreeMap.class); + StringBuilder sb = new StringBuilder(); + for (Map.Entry o : map.entrySet()) { + String key = o.getKey(); + Object value = o.getValue(); + if ("sign".contains(key)) { + continue; + } + if (ObjectUtil.isNotEmpty(value)) { + sb.append(key).append(value); + } + } + sb.append(appSerct); + return sb.toString(); + } + + public static String sha1Encrypt(String str) { + if (str == null || str.length() == 0) { + return null; + } + char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f' }; + try { + MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); + mdTemp.update(str.getBytes(StandardCharsets.UTF_8)); + + byte[] md = mdTemp.digest(); + int j = md.length; + char[] buf = new char[j * 2]; + int k = 0; + + for (byte byte0 : md) { + buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; + buf[k++] = hexDigits[byte0 & 0xf]; + } + return new String(buf); + } catch (Exception e) { + return null; + } + } + public static String HMACSHA256BYTE(String data, String key) { + String hash = ""; + try { + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] array = sha256_HMAC.doFinal(data.getBytes()); + hash = Base64.encodeBase64String(array); + } catch (Exception e) { + e.printStackTrace(); + } + return hash; + } + + public static String getSignSha256(JSONObject params, String accessKeySecret) { + return HMACSHA256BYTE(getSignContent(params),accessKeySecret); + } + + /** + * 获取圆通签名 + * @date: 2022/2/24 17:00 + * @param param: + * @param secret: + * @param method: + * @param version: + * @return java.lang.String + */ + public static String getYtSign(String param, String secret,String method,String version) { + String data = param + method + version; + String sign; + try { + byte[] signByte = DigestUtils.md5(data + secret); + sign = Base64.encodeBase64String(signByte); + } catch (Throwable e) { + log.error("加密失败.e:{}.", e.toString()); + sign = "ERROR"; + } + return sign; + } +} diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantBaseInfoMapper.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantBaseInfoMapper.java index c4ad74e..63f6834 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantBaseInfoMapper.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantBaseInfoMapper.java @@ -21,4 +21,6 @@ public interface TbPlussMerchantBaseInfoMapper { int updateByPrimaryKey(TbPlussMerchantBaseInfo record); TbPlussMerchantBaseInfo selectByUserId(String userId); + + TbPlussMerchantBaseInfo selectByMerchantcode(String merchantcode); } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantChannelStatusMapper.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantChannelStatusMapper.java index 315be7e..0b08906 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantChannelStatusMapper.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantChannelStatusMapper.java @@ -30,4 +30,11 @@ public interface TbPlussMerchantChannelStatusMapper { Map selectByUserId(@Param("userId") String userId, @Param("channel") String channel); + TbPlussMerchantChannelStatus getByMerchantCode(@Param("merchantCode") String merchantCode,@Param("channel") String channel ); + + + TbPlussMerchantChannelStatus getValidData(String merchantCode); + + + } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantOrderMapper.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantOrderMapper.java index 586fba7..b904f68 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantOrderMapper.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantOrderMapper.java @@ -27,5 +27,7 @@ public interface TbPlussMerchantOrderMapper { List selectByUserId(); + List selectByMercorderno(String mercorderno); + } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantStoreMapper.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantStoreMapper.java index 3ef5ef3..091cd12 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantStoreMapper.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussMerchantStoreMapper.java @@ -3,6 +3,7 @@ package com.chaozhanggui.dao.system.dao; import com.chaozhanggui.dao.system.entity.TbPlussMerchantStore; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; @Component @@ -19,4 +20,8 @@ public interface TbPlussMerchantStoreMapper { int updateByPrimaryKeySelective(TbPlussMerchantStore record); int updateByPrimaryKey(TbPlussMerchantStore record); + + TbPlussMerchantStore getStoreByMerchantCode(String merchantCode); + + TbPlussMerchantStore selectByIdOrMerchantCode(@Param("id") Integer id,@Param("merchantCode") String merchantCode); } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussSubMercCodeYsMapper.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussSubMercCodeYsMapper.java index 94d241f..609ad05 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussSubMercCodeYsMapper.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/dao/TbPlussSubMercCodeYsMapper.java @@ -19,4 +19,6 @@ public interface TbPlussSubMercCodeYsMapper { int updateByPrimaryKeySelective(TbPlussSubMercCodeYs record); int updateByPrimaryKey(TbPlussSubMercCodeYs record); + + TbPlussSubMercCodeYs selectByCityName(String cityName); } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/entity/TbPlussMerchantChannelStatus.java b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/entity/TbPlussMerchantChannelStatus.java index d096bcb..a40a15e 100644 --- a/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/entity/TbPlussMerchantChannelStatus.java +++ b/newadmin/dao-api/src/main/java/com/chaozhanggui/dao/system/entity/TbPlussMerchantChannelStatus.java @@ -281,4 +281,14 @@ public class TbPlussMerchantChannelStatus implements Serializable { public void setChannelName(String channelName) { this.channelName = channelName; } + + + + public boolean isPayment() { + boolean flag = false; + if ("3".equals(this.getStatus()) || "4".equals(this.getStatus()) || "6".equals(this.getStatus())) { + flag = true; + } + return flag; + } } \ No newline at end of file diff --git a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantBaseInfoMapper.xml b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantBaseInfoMapper.xml index f2d82cd..7334023 100644 --- a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantBaseInfoMapper.xml +++ b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantBaseInfoMapper.xml @@ -591,4 +591,8 @@ select * from tb_pluss_merchant_base_info where userId=#{userId} + + \ No newline at end of file diff --git a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantChannelStatusMapper.xml b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantChannelStatusMapper.xml index 0e8be81..abd3eec 100644 --- a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantChannelStatusMapper.xml +++ b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantChannelStatusMapper.xml @@ -372,4 +372,21 @@ left join tb_pluss_merchant_channel c on s.channel=c.id where b.userId=#{userId} and s.channel=#{channel} + + + + \ No newline at end of file diff --git a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantOrderMapper.xml b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantOrderMapper.xml index e1762b7..884a30a 100644 --- a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantOrderMapper.xml +++ b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantOrderMapper.xml @@ -732,4 +732,8 @@ GROUP BY d.user_id + + \ No newline at end of file diff --git a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantStoreMapper.xml b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantStoreMapper.xml index 3320337..731e4bb 100644 --- a/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantStoreMapper.xml +++ b/newadmin/dao-api/src/main/resources/mapper/TbPlussMerchantStoreMapper.xml @@ -577,4 +577,18 @@ isMarket = #{ismarket,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} + + + + \ No newline at end of file diff --git a/newadmin/dao-api/src/main/resources/mapper/TbPlussSubMercCodeYsMapper.xml b/newadmin/dao-api/src/main/resources/mapper/TbPlussSubMercCodeYsMapper.xml index cc40008..11b478c 100644 --- a/newadmin/dao-api/src/main/resources/mapper/TbPlussSubMercCodeYsMapper.xml +++ b/newadmin/dao-api/src/main/resources/mapper/TbPlussSubMercCodeYsMapper.xml @@ -103,4 +103,8 @@ remark = #{remark,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} + + \ No newline at end of file diff --git a/newadmin/merchant-service-api/pom.xml b/newadmin/merchant-service-api/pom.xml index 864640a..c659620 100644 --- a/newadmin/merchant-service-api/pom.xml +++ b/newadmin/merchant-service-api/pom.xml @@ -5,11 +5,10 @@ 4.0.0 com.chaozhanggui.system - admin-system + ysk-system 1.0.0 - org.example merchant-service-api diff --git a/newadmin/order-service/pom.xml b/newadmin/order-service/pom.xml new file mode 100644 index 0000000..5669ce0 --- /dev/null +++ b/newadmin/order-service/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.chaozhanggui.system + ysk-system + 1.0.0 + + + order-service + + + 8 + 8 + UTF-8 + + + + com.chaozhanggui.system + common-api + 1.0.0 + compile + + + com.chaozhanggui.system + dao-api + 1.0.0 + + + + \ No newline at end of file diff --git a/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/controller/OrderController.java b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/controller/OrderController.java new file mode 100644 index 0000000..278e3da --- /dev/null +++ b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/controller/OrderController.java @@ -0,0 +1,4 @@ +package com.chaozhanggui.system.order.controller; + +public class OrderController { +} diff --git a/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderParamCheck.java b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderParamCheck.java new file mode 100644 index 0000000..3ba70c6 --- /dev/null +++ b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderParamCheck.java @@ -0,0 +1,218 @@ +package com.chaozhanggui.system.order.service; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.chaozhanggui.common.system.config.MsgException; +import com.chaozhanggui.common.system.myEnum.SettleTypeEnum; +import com.chaozhanggui.common.system.util.MD5Util; +import com.chaozhanggui.common.system.util.SignUtils; +import com.chaozhanggui.dao.system.dao.*; +import com.chaozhanggui.dao.system.entity.*; +import com.github.pagehelper.util.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@Slf4j +public class OrderParamCheck { + + + private static final String KEY = "4c8d277b0f274604af68e590cc0b3e6b"; + + + @Autowired + private TbPlussMerchantStoreMapper tbPlussMerchantStoreMapper; + + @Autowired + private TbPlussMerchantBaseInfoMapper tbPlussMerchantBaseInfoMapper; + + @Autowired + private TbPlussUserInfoMapper tbPlussUserInfoMapper; + + @Autowired + private TbPlussMerchantOrderMapper tbPlussMerchantOrderMapper; + + @Autowired + private TbPlussMerchantChannelStatusMapper tbPlussMerchantChannelStatusMapper; + + + + + public String currencyParamsCheck(JSONObject jsonObject){ + Optional.ofNullable(jsonObject.getString("method")).orElseThrow(() -> new MsgException("接口方法参数不能为空")); + String mercOrderNo = jsonObject.getString("mercOrderNo"); + Optional.ofNullable(mercOrderNo).orElseThrow(() -> new MsgException("商户订单号不能为空")); + if (mercOrderNo.length() < 10 || mercOrderNo.length() > 50) { + throw new MsgException("商户订单号长度格式有误,长度介于10到50之间!"); + } + Optional.ofNullable(jsonObject.getString("sign")).orElseThrow(() -> new MsgException("缺失签名sign参数!")); + if("trans_pay".equals(jsonObject.getString("method")) || + "trans_wap_pay".equals(jsonObject.getString("method")) || + "trans_scan_pay".equals(jsonObject.getString("method"))){ + TbPlussMerchantStore store = null; + if("trans_pay".equals(jsonObject.getString("method"))){ + checSign(jsonObject,jsonObject.getString("merchantCode")); + store = checkTransPayParams(jsonObject,jsonObject.getString("merchantCode")); + }else{ + Optional.ofNullable(jsonObject.getString("merchantCode")).orElseThrow(() -> new MsgException("商户编号不能为空!")); + checSign(jsonObject,jsonObject.getString("merchantCode")); + store = checkTransPayParams(jsonObject,jsonObject.getString("merchantCode")); + } + String payData = checkMercOrder(store, jsonObject); + if(StringUtil.isNotEmpty(payData)){ + return payData; + } + + + TbPlussMerchantBaseInfo baseInfo = tbPlussMerchantBaseInfoMapper.selectByMerchantcode(store.getMerchantcode()); + Optional.ofNullable(baseInfo).orElseThrow(() -> new MsgException("当前商户暂未完成商户认证功能!")); + // 全局电子围栏和单商户电子围栏判定 + //TODO 先关闭异地支付 +// if (!commonSwitchService.allowEcdemicPay() && !store.allowEcdemicPay()) { +// // 不允许异地支付的时候需要校验ip和商户所在城市 +// try { +// merchantService.checkPayLocation(jsonObject.getString("ip"), baseInfo, jsonObject.getString("province")); +// } catch (PayRiskException e) { +// throw new MsgException(e.getMessage()); +// } +// } + TbPlussMerchantChannelStatus channel = null; + if("trans_wap_pay".equals(jsonObject.getString("method"))){ + channel = tbPlussMerchantChannelStatusMapper.getByMerchantCode(baseInfo.getMerchantcode(),"4"); + }else{ + channel = tbPlussMerchantChannelStatusMapper.getValidData(baseInfo.getMerchantcode()); + } + MsgException.checkNull(channel,"无进件信息,请先提交商户信息进行审核"); + if("4".equals(channel.getChannel()) && StringUtil.isNotEmpty(jsonObject.getString("settleType"))){ + SettleTypeEnum.checkValues(jsonObject.getString("settleType")); + channel.setSettlementtype(jsonObject.getString("settleType")); + } + MsgException.check("7".equals(channel.getStatus()),"快付审核中"); + MsgException.check(!channel.isPayment(),"进件未通过请耐心等待或联系客服"); + jsonObject.put("channel", channel); + jsonObject.put("merchant", baseInfo); + jsonObject.put("store", store); + } + return null; + } + + + + private void checSign(JSONObject jsonObject,String merchantCode) { + String sign = jsonObject.getString("sign"); + jsonObject.remove("sign"); + String md5Key = KEY; + Integer storeId = jsonObject.getInteger("storeId"); + if(ObjectUtil.isNotEmpty(storeId)){ + TbPlussMerchantStore store = tbPlussMerchantStoreMapper.selectByPrimaryKey(storeId); + MsgException.checkNull(store,"门店信息异常"); + merchantCode = store.getMerchantcode(); + } + String phone = jsonObject.getString("phone"); + Integer sId = null; + if(StringUtil.isNotEmpty(merchantCode)){ + TbPlussMerchantBaseInfo baseInfo = tbPlussMerchantBaseInfoMapper.selectByMerchantcode(merchantCode); + MsgException.checkNull(baseInfo,"商户号不存在"); + if(baseInfo != null && StringUtil.isNotEmpty(baseInfo.getMd5key())){ + md5Key = baseInfo.getMd5key(); + } + }else if(StringUtil.isNotEmpty(phone)){ + TbPlussUserInfo userInfo = tbPlussUserInfoMapper.selectByLoginName(phone); + MsgException.checkNull(userInfo,"手机号有误!"); + TbPlussMerchantBaseInfo lists = tbPlussMerchantBaseInfoMapper.selectByUserId(userInfo.getId().toString()); + if(ObjectUtil.isEmpty(lists)){ + MsgException.throwException("商户信息异常!"); + } + merchantCode = lists.getMerchantcode(); + TbPlussMerchantStore store = tbPlussMerchantStoreMapper.getStoreByMerchantCode(merchantCode); + MsgException.checkNull(store,"门店信息异常!"); + sId = store.getId(); + } + String signContent = SignUtils.getSignContent(jsonObject) + "&key=" + md5Key; + log.info("============>签名源串:{}<==============", signContent); + String ckeckSign = MD5Util.MD5Encode(signContent, "UTF-8"); + if (!sign.equalsIgnoreCase(ckeckSign)) { + log.info("============>签名校验失败,我方生成签名串:{},下游签名串:{}", ckeckSign, sign); + throw new MsgException("签名校验失败!"); + } + if(ObjectUtil.isNotEmpty(sId)){ + jsonObject.put("storeId",sId); + } + } + + + + private TbPlussMerchantStore checkTransPayParams(JSONObject jsonObject,String merchantCode) { + Integer id = jsonObject.getInteger("storeId"); + TbPlussMerchantStore store = new TbPlussMerchantStore(); + if(StringUtil.isNotEmpty(merchantCode)){ + store.setMerchantcode(merchantCode); + }else{ + store.setId(id); + } + if(StringUtil.isEmpty(merchantCode) && id == null){ + MsgException.throwException("缺失商户编号[merchantCode]参数!"); + } + TbPlussMerchantStore storeInfo = tbPlussMerchantStoreMapper.selectByIdOrMerchantCode(store.getId(),store.getMerchantcode()); + Optional.ofNullable(storeInfo).orElseThrow(() -> new MsgException("店铺数据异常!")); + String payAmt = jsonObject.getString("payAmt"); + Optional.ofNullable(payAmt).orElseThrow(() -> new MsgException("付款金额不能为空!")); + if(StringUtil.isEmpty(storeInfo.getPayecdemicswitch()) || "0".equals(storeInfo.getPayecdemicswitch())){ + String ip = jsonObject.getString("ip"); + Optional.ofNullable(ip).orElseThrow(() -> new MsgException("付款人ip地址不能为空!")); + } + if (!ObjectUtil.isValidIfNumber(payAmt)) { + throw new MsgException("交易金额格式不正确,单位(元)!"); + } + if (Double.parseDouble(payAmt) < 0.01d) { + throw new MsgException("交易金额最少为0.01!"); + } + Optional.ofNullable(jsonObject.getString("notifyUrl")) + .orElseThrow(() -> new MsgException("异步通知地址不能为空!")); + String method = jsonObject.getString("method"); + if(!"trans_scan_pay".equals(method)){ + Optional.ofNullable(jsonObject.getString("payWay")) + .orElseThrow(() -> new MsgException("支付渠道不能为空!")); + } + if(StringUtil.isEmpty(merchantCode)){ + Optional.ofNullable(jsonObject.getString("payType")) + .orElseThrow(() -> new MsgException("支付方式不能为空!")); + Optional.ofNullable(jsonObject.getString("userId")) + .orElseThrow(() -> new MsgException("付款用户不能为空!")); + } + Optional.ofNullable(jsonObject.getString("subject")) + .orElseThrow(() -> new MsgException("订单标题不能为空!")); + + return storeInfo; + } + + + + private String checkMercOrder(TbPlussMerchantStore store, JSONObject jsonObject) { + + List list = tbPlussMerchantOrderMapper.selectByMercorderno(jsonObject.getString("mercOrderNo")); + if (ObjectUtil.isNotEmpty(list)&&list.size()>0) { + TbPlussMerchantOrder order = list.get(0); + if(StringUtil.isNotEmpty(order.getPaydata())){ + StringBuilder payData = new StringBuilder(order.getPaydata()); + payData.insert(payData.length()-1,",\"orderNumber\":"+"\""+order.getOrdernumber()+"\""); + return payData.toString(); + } + throw new MsgException("订单号重复!"); + } + if ("0".equals(store.getStatus())) { + throw new MsgException("店铺已经打烊!"); + } + if ("2".equals(store.getStatus())) { + throw new MsgException("店铺已被禁用!"); + } + return null; + } + + +} diff --git a/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderService.java b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderService.java new file mode 100644 index 0000000..f51f539 --- /dev/null +++ b/newadmin/order-service/src/main/java/com/chaozhanggui/system/order/service/OrderService.java @@ -0,0 +1,82 @@ +package com.chaozhanggui.system.order.service; + + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.chaozhanggui.common.system.config.MsgException; +import com.chaozhanggui.common.system.config.ResultGenerator; +import com.chaozhanggui.dao.system.dao.TbPlussSubMercCodeYsMapper; +import com.chaozhanggui.dao.system.entity.TbPlussMerchantStore; +import com.chaozhanggui.dao.system.entity.TbPlussSubMercCodeYs; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class OrderService { + + + @Autowired + OrderParamCheck orderParamCheck; + + @Autowired + TbPlussSubMercCodeYsMapper tbPlussSubMercCodeYsMapper; + + public JSONObject pay(String json,String ip){ + Optional.ofNullable(json).orElseThrow(() -> new MsgException("请求参数为空")); + JSONObject jsonObject; + try { + jsonObject = JSONObject.parseObject(json); + } catch (JSONException e) { + throw new MsgException("JSON字符串有误,请检查!"); + } + String res = orderParamCheck.currencyParamsCheck(jsonObject); + if(ObjectUtil.isNotEmpty(res)){ + return ResultGenerator.genSuccessJsonResult("处理成功",JSONObject.parseObject(res)); + } + if(ObjectUtil.isEmpty(ip)){ + ip = jsonObject.getString("ip"); + } + jsonObject.put("ip",ip); + String cityName = jsonObject.getString("cityName"); + String provinceName = jsonObject.getString("provinceName"); + if(ObjectUtil.isNotEmpty(cityName)){ + jsonObject.put("ipAddress",provinceName + "-" + cityName); + TbPlussSubMercCodeYs ysCode = tbPlussSubMercCodeYsMapper.selectByCityName(cityName); + if(ysCode != null){ + jsonObject.put("pCode",ysCode.getPcode()); + jsonObject.put("cCode",ysCode.getCode()); + } + }else{ + if(ObjectUtil.isNotEmpty(ip)){ + DescribeIpv4LocationResponse location = ipLocationService.getLocation(ip); + if(location != null && StringUtil.isNotEmpty(location.getCity())){ + SubMercCodeYs ysCode = subMercCodeYsMapper.getSubMercCodeYsByCity(location.getCity()); + if(ysCode != null){ + jsonObject.put("pCode",ysCode.getPCode()); + jsonObject.put("cCode",ysCode.getCode()); + } + jsonObject.put("ipAddress",location.getProvince() + "-" + location.getCity()); + }else{ + String ipAddress = IpUtils.getIpLoactionAddress(location); + jsonObject.put("ipAddress",ipAddress); + } + } + } + switch (jsonObject.getString("method")) { + case "trans_query": + return tradeQuery(jsonObject); + default: + return tradePay(jsonObject); + } + + } + + + + +} diff --git a/newadmin/pom.xml b/newadmin/pom.xml index 70bb1b1..5d88498 100644 --- a/newadmin/pom.xml +++ b/newadmin/pom.xml @@ -19,6 +19,7 @@ oss-service admin merchant-service-api + order-service