feat:第三方支付接口

This commit is contained in:
dzc committed 2025-04-30 17:31:51 +08:00
1 parent 970bae2ddb
commit 26de11e567
8 files changed
+109 -9

No files matched your search

@@ -0,0 +1,13 @@
package com.bsd.pjcloud.thirdparty.dto.pay;
import lombok.Data;
@Data
public class PayGetWalletInfoDto {
/**
* sm4加密后的手机号
*/
private String signPhone;
}
@@ -5,6 +5,20 @@ import lombok.Data;
@Data
public class PayGetWalletInfoVo {
/**
* sm4加密后的手机号
*/
private String signPhone;
/**
* 用户真实姓名
*/
private String username;
/**
* 用户余额(分)
*/
private int balance;
}
@@ -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<String> httpEntity, @RequestHeader Map<String, String> headers) {
String body = httpEntity.getBody();
return R.ok(thirdPayApiService.getWalletInfo(body, headers));
}
@@ -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<ThirdKeyManageEntity> {
/**
@@ -20,4 +22,10 @@ public interface ThirdKeyManageService extends IService<ThirdKeyManageEntity> {
* 获取第三方key配置
*/
ThirdKeyManageEntity get(ThirdKeyTypeEnum type);
/**
* 验签并且返回配置
*/
ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map<String, String> headers);
}
@@ -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<String, String> headers);
}
@@ -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<ThirdKeyManageMapper,
return baseMapper.selectOne(new LambdaQueryWrapper<ThirdKeyManageEntity>().eq(ThirdKeyManageEntity::getBizType, type.getType()));
}
/**
* 验签并且返回配置
*/
@Override
public ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map<String, String> headers) {
Map<String, String> transitionHeader = new LinkedHashMap<>();
for (Map.Entry<String, String> 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;
}
/**
* 第三方类型不能重复
*/
@@ -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<String, String> 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;
}
}