diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java new file mode 100644 index 00000000..477a35e2 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class PayGetWalletInfoDto { + + /** + * sm4加密后的手机号 + */ + private String signPhone; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java index 237fb61d..1b8126cc 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java @@ -5,6 +5,20 @@ import lombok.Data; @Data public class PayGetWalletInfoVo { + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 用户真实姓名 + */ + private String username; + + /** + * 用户余额(分) + */ + private int balance; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java index 48310118..4970873c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java @@ -2,16 +2,20 @@ package com.bsd.pjcloud.thirdparty.controller.pay; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.util.Map; + /** * 第三方支付日志 */ @@ -25,9 +29,10 @@ public class ThirdPayApiController { private final ThirdPayApiService thirdPayApiService; @Operation(summary = "通过手机号查询用户钱包信息", description = "通过手机号查询用户钱包信息") - @GetMapping("/{signPhone}") - public R getWalletInfo(@PathVariable("signPhone") String signPhone) { - return R.ok(thirdPayApiService.getWalletInfo(signPhone)); + @GetMapping("/user-wallet") + public R getWalletInfo(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return R.ok(thirdPayApiService.getWalletInfo(body, headers)); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java index eab9de9c..25b9ea4d 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import java.util.Map; + public interface ThirdKeyManageService extends IService { /** @@ -20,4 +22,10 @@ public interface ThirdKeyManageService extends IService { * 获取第三方key配置 */ ThirdKeyManageEntity get(ThirdKeyTypeEnum type); + + /** + * 验签并且返回配置 + */ + ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers); + } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java index 449ab9e3..0054b89e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java @@ -2,11 +2,14 @@ package com.bsd.pjcloud.thirdparty.service; import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; import com.bsd.pjcloud.thirdparty.vo.pay.PayGetWalletInfoVo; import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import java.util.Map; + public interface ThirdPayApiService { /** @@ -22,5 +25,5 @@ public interface ThirdPayApiService { /** * 根据加密的手机号查询用户钱包信息 */ - PayGetWalletInfoVo getWalletInfo(String phone); + PayGetWalletInfoVo getWalletInfo(String json, Map headers); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java index e11d7225..a018dd20 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java @@ -9,9 +9,13 @@ import com.bsd.pjcloud.thirdparty.mapper.ThirdKeyManageMapper; import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.LinkedHashMap; +import java.util.Map; + /** * 第三方密钥管理 */ @@ -52,6 +56,45 @@ public class ThirdKeyManageServiceImpl extends ServiceImpl().eq(ThirdKeyManageEntity::getBizType, type.getType())); } + /** + * 验签并且返回配置 + */ + @Override + public ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers) { + Map transitionHeader = new LinkedHashMap<>(); + for (Map.Entry entry : headers.entrySet()) { + transitionHeader.put(entry.getKey().toUpperCase(), entry.getValue()); + } + // 验签 + String appKey = transitionHeader.get("APP-KEY"); + String bizType = transitionHeader.get("BIZ-TYPE"); + String timestamp = transitionHeader.get("TIMESTAMP"); + String sign = transitionHeader.get("SIGN"); + if (!ObjectUtil.isAllNotEmpty(appKey, bizType, timestamp, sign)) { + return null; + } + // 判断bizType + ThirdKeyTypeEnum keyType = ThirdKeyTypeEnum.valueOfByType(bizType); + if (ObjectUtil.isEmpty(keyType)) { + return null; + } + // 查询配置 + ThirdKeyManageEntity keyManage = get(keyType); + if (ObjectUtil.isEmpty(keyManage)) { + return null; + } + if (ObjectUtil.notEqual(appKey, keyManage.getAppKey())) { + return null; + } + // 计算签名 + String signStr = String.format("%s%s%s%s%s", keyManage.getAppKey(), keyManage.getAppSecret(), keyManage.getBizType(), timestamp, json); + String successSignMd5 = DigestUtils.md5Hex(signStr); + if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) { + return null; + } + return keyManage; + } + /** * 第三方类型不能重复 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java index b5f2cc3b..0832e229 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java @@ -1,10 +1,14 @@ package com.bsd.pjcloud.thirdparty.service.impl.pay; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; @@ -17,6 +21,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Arrays; +import java.util.Map; /** * 第三方支付 @@ -29,7 +34,8 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { private final String TAG = "第三方支付"; - private final ThirdPayLogService thirdPayLogService; + private final ThirdKeyManageService keyManageService; + private final ThirdPayLogService payLogService; /** * 扣款 @@ -47,7 +53,7 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { logObj.setError(error); } finally { logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); - thirdPayLogService.save(logObj); + payLogService.save(logObj); } return vo; } @@ -68,7 +74,7 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { logObj.setError(error); } finally { logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); - thirdPayLogService.save(logObj); + payLogService.save(logObj); } return vo; } @@ -77,9 +83,17 @@ public class ThirdPayApiServiceImpl implements ThirdPayApiService { * 根据加密的手机号查询用户钱包信息 */ @Override - public PayGetWalletInfoVo getWalletInfo(String signPhone) { + public PayGetWalletInfoVo getWalletInfo(String json, Map headers) { + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + + return null; + } + PayGetWalletInfoDto dto = JSONUtil.toBean(json, PayGetWalletInfoDto.class); // 手机号解密 - String phone = LbRetailSignUtils.sm4Decrypt(signPhone, ""); + String phone = LbRetailSignUtils.sm4Decrypt(dto.getSignPhone(), keySetting.getFieldKey()); + return null; } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps new file mode 100644 index 00000000..07d533bc Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps differ