将 alien-store 服务中 app 端商户的身份信息验证接口 /alienStore/ali/getIdInfo 迁移到新的 alien-store-platform 服务中,实现 web 端商户的身份证二要素核验功能。
/alienStore/ali/getIdInfoname:姓名idCard:身份证号appType:端区分(0:用户, 1:商家)/merchantAuth/verifyIdInfoname:姓名idCard:身份证号appType:端区分(0:用户, 1:商家),默认值为1采用业务逻辑复用 + 代码独立的方式:
AliApiUtil,避免依赖 alien-store 服务┌─────────────────────────────────────────┐
│ alien-store-platform (Web端商户平台) │
├─────────────────────────────────────────┤
│ Controller: MerchantAuthController │
│ ↓ │
│ Service: MerchantAuthService │
│ ↓ │
│ Util: AliApiUtil (支付宝API工具) │
│ ↓ │
│ Mapper: LifeUserMapper/StoreUserMapper │
│ ↓ │
│ Database: MySQL │
└─────────────────────────────────────────┘
1. 接收请求参数(name, idCard, appType)
↓
2. 根据 appType 查询数据库
├─ appType=0:查询 life_user 表
└─ appType=1:查询 store_user 表
↓
3. 判断是否已实名认证
├─ 已认证 → 返回"该身份证已实名认证过"
└─ 未认证 → 继续下一步
↓
4. 调用支付宝二要素核验接口
├─ 验证通过 → 返回"身份验证成功"
└─ 验证失败 → 返回"身份证号与姓名不一致"
| 文件路径 | 说明 | 代码行数 |
|---|---|---|
controller/MerchantAuthController.java |
Web端商户身份验证控制器 | ~40行 |
service/MerchantAuthService.java |
商户身份验证服务接口 | ~20行 |
service/impl/MerchantAuthServiceImpl.java |
商户身份验证服务实现 | ~60行 |
util/AliApiUtil.java |
支付宝API工具类 | ~150行 |
README_MERCHANT_AUTH.md |
接口配置说明文档 | - |
@GetMapping("/verifyIdInfo")
public R<String> verifyIdInfo(
@RequestParam("name") String name,
@RequestParam("idCard") String idCard,
@RequestParam("appType") Integer appType
) {
log.info("MerchantAuthController.verifyIdInfo?name={}&idCard={}&appType={}",
name, idCard, appType);
return merchantAuthService.verifyIdInfo(name, idCard, appType);
}
@Override
public R<String> verifyIdInfo(String name, String idCard, Integer appType) {
// 1. 查询是否已实名认证
int size;
if (appType == 0) {
// 用户端
LambdaQueryWrapper<LifeUser> userWrapper = new LambdaQueryWrapper<>();
userWrapper.eq(LifeUser::getIdCard, idCard)
.eq(LifeUser::getRealName, name);
size = lifeUserMapper.selectCount(userWrapper);
} else {
// 商家端
LambdaQueryWrapper<StoreUser> storeWrapper = new LambdaQueryWrapper<>();
storeWrapper.eq(StoreUser::getIdCard, idCard)
.eq(StoreUser::getName, name);
size = storeUserMapper.selectCount(storeWrapper);
}
if (size > 0) {
return R.fail("该身份证已实名认证过");
}
// 2. 调用支付宝身份验证接口
if (aliApiUtil.verifyIdCard(name, idCard)) {
return R.success("身份验证成功");
}
return R.fail("身份证号与姓名不一致,请检查后重新填写");
}
public boolean verifyIdCard(String name, String idCard) {
try {
AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig());
DatadigitalFincloudGeneralsaasTwometaCheckRequest request =
new DatadigitalFincloudGeneralsaasTwometaCheckRequest();
DatadigitalFincloudGeneralsaasTwometaCheckModel model =
new DatadigitalFincloudGeneralsaasTwometaCheckModel();
model.setOuterBizNo("id_" + createOrderNo());
model.setCertName(name);
model.setCertNo(idCard);
model.setCertType("IDENTITY_CARD");
request.setBizModel(model);
DatadigitalFincloudGeneralsaasTwometaCheckResponse response =
alipayClient.certificateExecute(request);
JSONObject jsonObject = JSONObject.parseObject(response.getBody())
.getJSONObject("datadigital_fincloud_generalsaas_twometa_check_response");
return response.isSuccess()
&& "Success".equals(jsonObject.getString("msg"))
&& "T".equals(jsonObject.getString("match"));
} catch (AlipayApiException e) {
log.error("AliApiUtil.verifyIdCard ERROR Msg={}", e.getErrMsg());
return false;
}
}
需要在 Nacos 配置中心的 alien-store-platform.yml 中添加支付宝配置:
app:
business:
appId: ${your_app_id}
appPrivateKey: ${your_private_key}
appPublicKey: ${your_public_key}
win:
appCertPath: D:/certs/appCertPublicKey.crt
alipayPublicCertPath: D:/certs/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: D:/certs/alipayRootCert.crt
linux:
appCertPath: /usr/local/certs/appCertPublicKey.crt
alipayPublicCertPath: /usr/local/certs/alipayCertPublicKey_RSA2.crt
alipayRootCertPath: /usr/local/certs/alipayRootCert.crt
alien-store-platform 已包含的依赖:
alipay-sdk-java:支付宝 SDKalien-entity:实体和 Mapper 共享alien-util:工具类共享mybatis-plus:数据库操作测试用例 1:未认证用户的身份验证
curl -X GET "http://localhost:8080/merchantAuth/verifyIdInfo?name=张三&idCard=110101199001011234&appType=1"
预期响应:
{
"code": 200,
"success": true,
"msg": "身份验证成功",
"data": "身份验证成功"
}
测试用例 2:已认证用户的重复验证
curl -X GET "http://localhost:8080/merchantAuth/verifyIdInfo?name=李四&idCard=110101199001011235&appType=1"
预期响应(假设该用户已认证):
{
"code": 500,
"success": false,
"msg": "该身份证已实名认证过",
"data": null
}
测试用例 3:身份证和姓名不匹配
curl -X GET "http://localhost:8080/merchantAuth/verifyIdInfo?name=王五&idCard=110101199001011236&appType=1"
预期响应:
{
"code": 500,
"success": false,
"msg": "身份证号与姓名不一致,请检查后重新填写",
"data": null
}
访问 Swagger UI:http://localhost:8080/doc.html
在 "web端商户身份验证管理" 分组下找到 "身份证二要素核验" 接口进行测试。
| 对比项 | 原接口(alien-store) | 新接口(alien-store-platform) |
|---|---|---|
| 接口路径 | /ali/getIdInfo |
/merchantAuth/verifyIdInfo |
| 服务名称 | alien-store | alien-store-platform |
| 服务定位 | app端商户 | web端商户 |
| 业务逻辑 | 完全一致 | 完全一致 |
| 代码实现 | AliApi.java | AliApiUtil.java |
| 依赖关系 | 自包含 | 独立实现 |
| Swagger分组 | 二期-阿里接口 | web端商户身份验证管理 |
| 错误场景 | 返回信息 | 处理建议 |
|---|---|---|
| 该身份证已认证 | "该身份证已实名认证过" | 提示用户该身份证已被使用 |
| 身份证姓名不匹配 | "身份证号与姓名不一致,请检查后重新填写" | 提示用户核对信息 |
| 支付宝接口异常 | "身份证号与姓名不一致,请检查后重新填写" | 检查支付宝配置和证书 |
| 数据库连接异常 | 系统异常 | 检查数据库配置 |
本次开发成功将 app 端商户的身份验证接口迁移到 web 端商户平台,实现了业务逻辑的复用和代码的独立性。新接口遵循项目规范,具有良好的可维护性和扩展性。
开发完成时间:2025-01-xx
开发人员:AI Assistant
代码审查状态:待审查
测试状态:待测试
部署状态:待部署