Ver código fonte

阿里云验证码合并冲突

30262728@qq.com 1 semana atrás
pai
commit
b4f64d5194
35 arquivos alterados com 369 adições e 148 exclusões
  1. 20 5
      qnfhq-api/pom.xml
  2. 62 0
      qnfhq-api/src/main/java/com/qnfhq/aliyun/CaptchaConfig.java
  3. 2 3
      qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java
  4. 2 2
      qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java
  5. 14 28
      qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java
  6. 3 1
      qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/SendEmailCodeDTO.java
  7. 3 1
      qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/SendPhoneCodeDTO.java
  8. 17 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/VerifyIntelligentCaptchaDTO.java
  9. 17 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/setting/CaptchaSetting.java
  10. 2 0
      qnfhq-api/src/main/java/com/qnfhq/modules/user/enums/SettingEnum.java
  11. 30 3
      qnfhq-api/src/main/java/com/qnfhq/modules/user/service/AppUserService.java
  12. 78 51
      qnfhq-api/src/main/java/com/qnfhq/modules/user/service/impl/AppUserServiceImpl.java
  13. 8 3
      qnfhq-api/src/main/resources/i18n/messages.properties
  14. 9 4
      qnfhq-api/src/main/resources/i18n/messages_de.properties
  15. 2 0
      qnfhq-api/src/main/resources/i18n/messages_en.properties
  16. 9 4
      qnfhq-api/src/main/resources/i18n/messages_es.properties
  17. 9 4
      qnfhq-api/src/main/resources/i18n/messages_fr.properties
  18. 8 2
      qnfhq-api/src/main/resources/i18n/messages_ja.properties
  19. 8 3
      qnfhq-api/src/main/resources/i18n/messages_ko.properties
  20. 9 4
      qnfhq-api/src/main/resources/i18n/messages_th.properties
  21. 8 3
      qnfhq-api/src/main/resources/i18n/messages_tw.properties
  22. 9 4
      qnfhq-api/src/main/resources/i18n/messages_vi.properties
  23. 3 1
      qnfhq-api/src/main/resources/i18n/messages_zh.properties
  24. 4 3
      qnfhq-api/src/main/resources/i18n/validation.properties
  25. 4 3
      qnfhq-api/src/main/resources/i18n/validation_de.properties
  26. 2 1
      qnfhq-api/src/main/resources/i18n/validation_en.properties
  27. 3 2
      qnfhq-api/src/main/resources/i18n/validation_es.properties
  28. 4 3
      qnfhq-api/src/main/resources/i18n/validation_fr.properties
  29. 3 2
      qnfhq-api/src/main/resources/i18n/validation_ja.properties
  30. 3 2
      qnfhq-api/src/main/resources/i18n/validation_ko.properties
  31. 2 1
      qnfhq-api/src/main/resources/i18n/validation_th.properties
  32. 3 2
      qnfhq-api/src/main/resources/i18n/validation_tw.properties
  33. 2 2
      qnfhq-api/src/main/resources/i18n/validation_vi.properties
  34. 2 1
      qnfhq-api/src/main/resources/i18n/validation_zh.properties
  35. 5 0
      qnfhq-common/src/main/java/com/qnfhq/common/exception/ErrorCode.java

+ 20 - 5
qnfhq-api/pom.xml

@@ -15,6 +15,8 @@
         <freemarker.version>2.3.34</freemarker.version>
         <aliyun.sms.version>4.1.1</aliyun.sms.version>
         <redisson.version>3.52.0</redisson.version>
+        <fastjson.version>2.0.60</fastjson.version>
+        <aliyun.captcha.version>1.1.4</aliyun.captcha.version>
     </properties>
 	<dependencies>
 		<dependency>
@@ -75,13 +77,26 @@
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
-            <version>2.0.60</version>
+            <version>${fastjson.version}</version>
         </dependency>
 
-<!--        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-websocket</artifactId>
-        </dependency>-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>captcha20230305</artifactId>
+            <version>${aliyun.captcha.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+            <version>7.2.27</version>
+            <scope>compile</scope>
+        </dependency>
+
+
+        <!--        <dependency>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-websocket</artifactId>
+                </dependency>-->
 	</dependencies>
 
 	<build>

+ 62 - 0
qnfhq-api/src/main/java/com/qnfhq/aliyun/CaptchaConfig.java

@@ -0,0 +1,62 @@
+package com.qnfhq.aliyun;
+
+import com.alibaba.fastjson2.JSON;
+import com.aliyun.captcha20230305.models.VerifyIntelligentCaptchaResponse;
+import com.aliyun.tea.TeaException;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class CaptchaConfig {
+
+    public static com.aliyun.captcha20230305.Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
+
+        com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                .setCredential(credential)
+                .setAccessKeyId(accessKeyId)
+                .setAccessKeySecret(accessKeySecret)
+                .setType("access_key");
+
+        config.endpoint = endpoint;
+        return new com.aliyun.captcha20230305.Client(config);
+    }
+
+
+    /**
+     * 智能验证
+     * @param accessKeyId
+     * @param accessKeySecret
+     * @param sceneId
+     * @param verifyParam
+     * @return
+     */
+    public static VerifyIntelligentCaptchaResponse verifyIntelligentCaptcha(String accessKeyId, String accessKeySecret, String sceneId,
+                                                  String endpoint, String verifyParam) {
+        com.aliyun.captcha20230305.Client client = null;
+        try {
+            client = createClient(accessKeyId, accessKeySecret, endpoint);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        com.aliyun.captcha20230305.models.VerifyIntelligentCaptchaRequest verifyIntelligentCaptchaRequest = new com.aliyun.captcha20230305.models.VerifyIntelligentCaptchaRequest()
+                .setCaptchaVerifyParam(verifyParam)
+                .setSceneId(sceneId);
+        try {
+             return client.verifyIntelligentCaptchaWithOptions(verifyIntelligentCaptchaRequest,
+                    new com.aliyun.teautil.models.RuntimeOptions());
+        } catch (TeaException error) {
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            log.error(error.getMessage(),error);
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            log.error(error.getMessage(), error);
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+
+}

+ 2 - 3
qnfhq-api/src/main/java/com/qnfhq/config/SaTokenConfigure.java

@@ -28,14 +28,13 @@ public class SaTokenConfigure {
     public SaServletFilter getSaServletFilter() {
         return new SaServletFilter()
 
-                // 指定 拦截路由 与 放行路由 todo 测试过鉴权
+                // 指定 拦截路由 与 放行路由
                 .addInclude("/**")
 //                .addExclude("/**")
                 .addExclude(
                         "/user/register",
                         "/user/login",
-                        "/user/captcha",
-                        "/user/checkCaptcha",
+                        "/user/verifyIntelligentCaptcha",
                         "/user/sendEmailCode",
                         "/user/sendMobileCode",
                         "/user/resetPwdPhone",

+ 2 - 2
qnfhq-api/src/main/java/com/qnfhq/modules/c2c/controller/C2cOrderController.java

@@ -143,7 +143,7 @@ public class C2cOrderController extends ApiBaseController {
             tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode());
             List<AppAssetEntity> assetList = appAssetService.selectList(tAppAsset);
             if(assetList==null || assetList.size()==0) {
-                AppUserEntity user = appUserService.getUserByUserId(loginUserId);
+                AppUserEntity user = appUserService.getById(loginUserId);
                 appUserService.initAppUserAsset(user);
                 return error(MessageUtils.message("c2c.order.availableAmount.buzu"));//您的可用资产不足
             }
@@ -196,7 +196,7 @@ public class C2cOrderController extends ApiBaseController {
             tAppAsset.setType(AssetEnum.PLATFORM_ASSETS.getCode());
             List<AppAssetEntity> assetList = appAssetService.selectList(tAppAsset);
             if(assetList==null || assetList.size()==0) {
-                AppUserEntity user = appUserService.getUserByUserId(loginUserId);
+                AppUserEntity user = appUserService.getById(loginUserId);
                 appUserService.initAppUserAsset(user);
                 return error(MessageUtils.message("c2c.order.availableAmount.buzu"));//您的可用资产不足
             }

+ 14 - 28
qnfhq-api/src/main/java/com/qnfhq/modules/user/controller/ApiAppUserController.java

@@ -1,11 +1,7 @@
 package com.qnfhq.modules.user.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.lang.Validator;
-import cn.hutool.core.map.MapUtil;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.qnfhq.common.exception.ErrorCode;
-import com.qnfhq.common.exception.RenException;
 import com.qnfhq.common.utils.MessageUtils;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.common.validator.AssertUtils;
@@ -80,7 +76,7 @@ public class ApiAppUserController {
         if(StpUtil.isLogin()) {
             Long userId = StpUtil.getLoginIdAsLong();
             logger.info("userId = {}", userId);
-            AppUserEntity user = appUserService.getUserByUserId(userId);
+            AppUserEntity user = appUserService.getById(userId);
 
             result.setMsg("success");
             result.setData(user);
@@ -98,8 +94,8 @@ public class ApiAppUserController {
         if(StpUtil.isLogin()) {
             Long userId = StpUtil.getLoginIdAsLong();
             StpUtil.logout(userId);
-            AppUserEntity one = appUserService.getUserByUserId(userId);
-            appuserLoginLogService.insertAppActionLog(one, "用户退出", "0", request);
+            AppUserEntity user = appUserService.getById(userId);
+            appuserLoginLogService.insertAppActionLog(user, "用户退出", "0", request);
         }
         return new Result();
     }
@@ -112,7 +108,7 @@ public class ApiAppUserController {
 
         ValidatorUtils.validateEntity(sendCodeDTO);
 
-        return appUserService.sendEmailCode(sendCodeDTO.getCodeType(),sendCodeDTO.getEmail());
+        return appUserService.sendEmailCode(sendCodeDTO.getUuid(),sendCodeDTO.getCodeType(),sendCodeDTO.getEmail());
 
     }
 
@@ -121,26 +117,7 @@ public class ApiAppUserController {
     @PostMapping("/sendMobileCode")
     public Result sendMobileCode (@RequestBody SendPhoneCodeDTO codeDTO){
         ValidatorUtils.validateEntity(codeDTO);
-        return appUserService.sendMobileCode(codeDTO.getCodeType(),codeDTO.getPhone(),codeDTO.getZone());
-    }
-
-
-    @GetMapping("/captcha")
-    @Operation(summary = "获取图形验证码")
-    @Parameter(in = ParameterIn.QUERY, ref = "string", name = "uuid", required = true)
-    public void captcha(HttpServletResponse response, String uuid) throws IOException {
-        //唯一标识不能为空
-        AssertUtils.isBlank(uuid, ErrorCode.IDENTIFIER_NOT_NULL);
-        //生成验证码
-        captchaService.create(response, uuid);
-    }
-
-
-    @PostMapping("/checkCaptcha")
-    @Operation(summary = "验证图形验证码")
-    public Result checkCaptcha(@RequestBody CheckCaptchaDTO dto, HttpServletRequest request) {
-        ValidatorUtils.validateEntity(dto);
-        return appUserService.checkCaptcha(dto,request);
+        return appUserService.sendMobileCode(codeDTO.getUuid(),codeDTO.getCodeType(),codeDTO.getPhone(),codeDTO.getZone());
     }
 
 
@@ -174,4 +151,13 @@ public class ApiAppUserController {
         ValidatorUtils.validateEntity(dto);
         return appUserService.resetPwdByPhone(dto.getZone(),dto.getPhone(),dto.getNewPwd());
     }
+
+
+    @Operation(summary = "阿里云智能验证码")
+    @PostMapping("/verifyIntelligentCaptcha")
+    public Result verifyIntelligentCaptcha (@RequestBody VerifyIntelligentCaptchaDTO dto){
+        ValidatorUtils.validateEntity(dto);
+        return appUserService.verifyIntelligentCaptcha(dto.getVerifyParam());
+    }
+
 }

+ 3 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/SendEmailCodeDTO.java

@@ -18,5 +18,7 @@ public class SendEmailCodeDTO {
     @NotBlank(message="{NotBlank.email}")//邮箱不能为空
     private String email;
 
-
+    @Schema(title = "唯一标识")
+    @NotBlank(message="{NotBlank.uuid}")//唯一标识不能为空
+    private String uuid;
 }

+ 3 - 1
qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/SendPhoneCodeDTO.java

@@ -20,5 +20,7 @@ public class SendPhoneCodeDTO {
     @NotBlank(message="{NotBlank.zone}")//区号不能为空
     private String zone;
 
-
+    @Schema(title = "唯一标识")
+    @NotBlank(message="{NotBlank.uuid}")//唯一标识不能为空
+    private String uuid;
 }

+ 17 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/VerifyIntelligentCaptchaDTO.java

@@ -0,0 +1,17 @@
+package com.qnfhq.modules.user.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+
+@Data
+@Schema(title = "阿里云智能验证码表单")
+public class VerifyIntelligentCaptchaDTO {
+
+    @Schema(title = "验证码参数")
+    @NotBlank(message="{NotBlank.verifyParam}")//验证码参数不能为空
+    private String verifyParam;
+
+
+}

+ 17 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/user/dto/setting/CaptchaSetting.java

@@ -0,0 +1,17 @@
+package com.qnfhq.modules.user.dto.setting;
+
+import lombok.Data;
+
+/**
+ * 验证码配置
+ */
+@Data
+public class CaptchaSetting {
+
+
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String sceneId;
+    private String endpoint;//"captcha.cn-shanghai.aliyuncs.com"
+
+}

+ 2 - 0
qnfhq-api/src/main/java/com/qnfhq/modules/user/enums/SettingEnum.java

@@ -99,5 +99,7 @@ public enum SettingEnum {
     REFUSE_SUBMIT,
     //广告配置
     AD_SETTING,
+    //验证码配置
+    CAPTCHA_SETTING,
     ;
 }

+ 30 - 3
qnfhq-api/src/main/java/com/qnfhq/modules/user/service/AppUserService.java

@@ -3,7 +3,6 @@ package com.qnfhq.modules.user.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qnfhq.common.utils.Result;
 import com.qnfhq.modules.user.dto.*;
-import com.qnfhq.modules.user.entity.AppUserDetailEntity;
 import com.qnfhq.modules.user.entity.AppUserEntity;
 import jakarta.servlet.http.HttpServletRequest;
 
@@ -67,12 +66,40 @@ public interface AppUserService extends IService<AppUserEntity> {
      */
     public Result sendMobileCode(String uuid,String codeType,String phone,String zone);
 
-    Result checkCaptcha(CheckCaptchaDTO dto, HttpServletRequest request);
-
+    /**
+     * 验证码校验
+     * @param codeType
+     * @param zone
+     * @param phone
+     * @param code
+     * @return
+     */
     Result checkPhoneCode(String codeType,String zone,String phone,String code);
 
+    /**
+     * 验证码校验
+     * @param codeType
+     * @param email
+     * @param code
+     * @return
+     */
     Result checkEmailCode(String codeType,String email,String code);
+
+    /**
+     * 重置密码
+     * @param email
+     * @param pwd
+     * @return
+     */
     Result resetPwdByEmail(String email,String pwd);
+
+    /**
+     * 重置密码
+     * @param zone
+     * @param phone
+     * @param pwd
+     * @return
+     */
     Result resetPwdByPhone(String zone,String phone,String pwd);
 
     /**

+ 78 - 51
qnfhq-api/src/main/java/com/qnfhq/modules/user/service/impl/AppUserServiceImpl.java

@@ -5,8 +5,11 @@ import cn.hutool.core.lang.Validator;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.aliyun.captcha20230305.models.VerifyIntelligentCaptchaResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.qnfhq.aliyun.CaptchaConfig;
+import com.qnfhq.common.exception.ErrorCode;
 import com.qnfhq.common.exception.RenException;
 import com.qnfhq.common.redis.RedisUtils;
 import com.qnfhq.common.utils.DateUtils;
@@ -18,6 +21,7 @@ import com.qnfhq.modules.user.dao.AppUserDao;
 import com.qnfhq.modules.user.dao.AppUserDetailDao;
 import com.qnfhq.modules.user.dto.*;
 import com.qnfhq.modules.user.dto.setting.AssetSymbolSetting;
+import com.qnfhq.modules.user.dto.setting.CaptchaSetting;
 import com.qnfhq.modules.user.entity.AppAssetEntity;
 import com.qnfhq.modules.user.entity.AppUserDetailEntity;
 import com.qnfhq.modules.user.entity.AppUserEntity;
@@ -35,11 +39,9 @@ import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
-
 import lombok.AllArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -73,8 +75,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
     @Resource
     private SmsSendService smsSendService;
 
-    @Resource
-    private CaptchaService captchaService;
 
     @Resource
     private AppUserDetailDao appUserDetailDao;
@@ -84,7 +84,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         return getOne(new LambdaQueryWrapper<AppUserEntity>()
                 .eq(AppUserEntity::getEmail, email)
                 .eq(AppUserEntity::getStatus, UserStatus.OK.getCode())
-                .last(" limit 1")
         );
     }
 
@@ -94,21 +93,15 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
                 .eq(AppUserEntity::getPhone, mobile)
                 .eq(AppUserEntity::getZone, zone)
                 .eq(AppUserEntity::getStatus, UserStatus.OK.getCode())
-                .last(" limit 1")
         );
     }
 
-    @Override
-    public AppUserEntity getUserByUserId(Long userId) {
-        return getById(userId);
-    }
 
     @Override
     public AppUserEntity getUserByActiveCode(String activeCode) {
         return getOne(new LambdaQueryWrapper<AppUserEntity>()
                 .eq(AppUserEntity::getActiveCode, activeCode)
                 .eq(AppUserEntity::getStatus, UserStatus.OK.getCode())
-                .last(" limit 1")
         );
     }
 
@@ -211,7 +204,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         appUserEntity.setUid(uuid);
         appUserEntity.setCreateTime(new Date());
         appUserEntity.setUpdateTime(new Date());
-        if (save(appUserEntity)) {
+        if (!save(appUserEntity)) {
             throw new RenException(MessageUtils.message("user.register.fail"));//注册失败
         }
 
@@ -236,10 +229,6 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Result login(AppLoginDTO dto, HttpServletRequest request) {
-        //图形验证码 要改滑动码
-        //if(!captchaService.validate(dto.getUuid(), dto.getCode())) {
-        //    throw new RenException(MessageUtils.message("appUser.login.code.err"));//验证码错误
-        //}
 
         //账号密码失败重试次数
         checkPwdErrTryTimes(dto.getLoginName());
@@ -341,7 +330,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
      * @return
      */
     @Override
-    public Result sendEmailCode(String codeType, String email) {
+    public Result sendEmailCode(String uuid, String codeType, String email) {
+        //阿里云滑动验证码
+        checkIntelligentCaptcha(uuid);
 
         if (!EmailUtils.checkEmail(email)) {
             throw new RenException(MessageUtils.message("user.register.email.format"));//邮箱格式不正确
@@ -379,7 +370,9 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
      * @return
      */
     @Override
-    public Result sendMobileCode(String codeType, String phone, String zone) {
+    public Result sendMobileCode(String uuid, String codeType, String phone, String zone) {
+        //阿里云滑动验证码
+        checkIntelligentCaptcha(uuid);
 
         if (StringUtils.isEmpty(phone)) {
             throw new RenException(MessageUtils.message("phone_code_empty"));//手机号不能为空!
@@ -457,21 +450,22 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
     public Result resetPwdByPhone(String zone, String phone, String newPwd) {
         Result result = new Result();
         String codeType = "FIND_PASSWORD";
-        //校验手机验证码
-        final String phoneCodeResultKey = String.format("%s%s%s%s%s", CachePrefix.SMS_CODE.getPrefix(), UserCodeTypeEnum.valueOf(codeType).name(), zone, phone, ":result");
-        verifyResult(phoneCodeResultKey);
+
 
         //密码强度检测
         PasswordStrengthValidator.validatePasswordStrength(newPwd);
-        //更新密码
+
         AppUserEntity appUser = getUserByMobile(phone, zone);
         if (Objects.isNull(appUser)) {
             throw new RenException(MessageUtils.message("user.not.exist"));//用户不存在
         }
-
+        //校验手机验证码
+        final String phoneCodeResultKey = String.format("%s%s%s%s%s", CachePrefix.SMS_CODE.getPrefix(), UserCodeTypeEnum.valueOf(codeType).name(), zone, phone, ":result");
+        verifyResult(phoneCodeResultKey);
+        //校验邮箱验证码
         final String emailCodeResultKey = String.format("%s%s%s%s", CachePrefix.EMAIL_CODE.getPrefix(), UserCodeTypeEnum.valueOf(codeType).name(), appUser.getEmail(), ":result");
         verifyResult(emailCodeResultKey);
-
+        //更新密码
         appUser.setLoginPassword(PasswordUtils.encode(newPwd));
         appUser.setTransferOutTime(DateUtils.addDays(new Date(), 1));
         updateById(appUser);
@@ -479,7 +473,10 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
 
     }
 
-
+    /**
+     * 校验手机或邮箱验证码是否通过
+     * @param codeResultKey
+     */
     private void verifyResult(String codeResultKey) {
         Object codeResult = redisUtils.get(codeResultKey);
         if (Objects.isNull(codeResult) || (int) codeResult != 1) {
@@ -488,6 +485,16 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         redisUtils.delete(codeResultKey);
     }
 
+    /**
+     * 验证码智能验证是否通过
+     */
+    private void checkIntelligentCaptcha(String uuid) {
+        Object codeResult = redisUtils.get(uuid);
+        if (Objects.isNull(codeResult) || (int) codeResult != 1) {
+            throw new RenException(ErrorCode.AUTH_ALIYUN_CAPTCHA);//智能验证码校验失败
+        }
+    }
+
 
 
 
@@ -546,31 +553,23 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         return pwdFailTimes;
     }
 
-
-    @Override
-    public Result checkCaptcha(CheckCaptchaDTO dto, HttpServletRequest request) {
-        if (!captchaService.validate(dto.getUuid(), dto.getCode())) {
-            throw new RenException(MessageUtils.message("appUser.login.code.err"));//验证码错误
-        }
-        Result result = new Result();
-        return result;
-    }
-
     @Override
     public Result checkPhoneCode(String codeType, String zone, String phone, String code) {
         //校验手机验证码
         final String phoneCodeKey = String.format("%s%s%s%s", CachePrefix.SMS_CODE.getPrefix(), UserCodeTypeEnum.valueOf(codeType).name(), zone, phone);
         checkCode(phoneCodeKey, code);
 
-        AppUserEntity user = getUserByMobile(phone, zone);
-        if (Objects.isNull(user)) {
-            throw new RenException(MessageUtils.message("user.not.exist"));//用户不存在
-        }
-        Map data = MapUtil.of("phone", user.getPhone());
-        data.put("zone", user.getZone());
-        data.put("email", user.getEmail());
         Result result = new Result();
-        result.setData(data);
+        if(!codeType.equals(UserCodeTypeEnum.REGISTER.name())) {
+            AppUserEntity user = getUserByMobile(phone, zone);
+            if (Objects.isNull(user)) {
+                throw new RenException(MessageUtils.message("user.not.exist"));//用户不存在
+            }
+            Map data = MapUtil.of("phone", user.getPhone());
+            data.put("zone", user.getZone());
+            data.put("email", user.getEmail());
+            result.setData(data);
+        }
         return result;
     }
 
@@ -581,15 +580,17 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         final String emailCodeKey = String.format("%s%s%s", CachePrefix.EMAIL_CODE.getPrefix(), UserCodeTypeEnum.valueOf(codeType).name(), email);
         checkCode(emailCodeKey, code);
 
-        AppUserEntity user = getUserByEmail(email);
-        if (Objects.isNull(user)) {
-            throw new RenException(MessageUtils.message("user.not.exist"));//用户不存在
-        }
-        Map data = MapUtil.of("phone", user.getPhone());
-        data.put("zone", user.getZone());
-        data.put("email", user.getEmail());
         Result result = new Result();
-        result.setData(data);
+        if(!codeType.equals(UserCodeTypeEnum.REGISTER.name())) {
+            AppUserEntity user = getUserByEmail(email);
+            if (Objects.isNull(user)) {
+                throw new RenException(MessageUtils.message("user.not.exist"));//用户不存在
+            }
+            Map data = MapUtil.of("phone", user.getPhone());
+            data.put("zone", user.getZone());
+            data.put("email", user.getEmail());
+            result.setData(data);
+        }
         return result;
     }
 
@@ -618,4 +619,30 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserDao, AppUserEntity> i
         final String checkCodeResult = String.format("%s%s", cacheKey, ":result");
         redisUtils.set(checkCodeResult, 1, ApiConstant.CHECK_EXPIRE);
     }
+
+    @Override
+    public Result verifyIntelligentCaptcha(String verifyParam) {
+        SettingEntity setting = settingService.getSetting(SettingEnum.CAPTCHA_SETTING.name());
+        CaptchaSetting captchaSetting = JSONUtil.toBean(setting.getSettingValue(), CaptchaSetting.class);
+        VerifyIntelligentCaptchaResponse response = CaptchaConfig.verifyIntelligentCaptcha(captchaSetting.getAccessKeyId(), captchaSetting.getAccessKeySecret(),
+                captchaSetting.getSceneId(),captchaSetting.getEndpoint(), verifyParam);
+        if(response==null) {
+            throw new RenException(MessageUtils.message("user.verifyIntelligentCaptcha.err"));//验证码校验接口报错
+        }
+        if(response.statusCode == 200 && response.body.success) {
+            //设置验证通过
+            final String uuid = UUID.randomUUID().toString();
+            redisUtils.set(uuid, 1, ApiConstant.CHECK_EXPIRE);
+
+            Map data = MapUtil.of("verifyResult", response.body.result.verifyResult);
+            data.put("uuid", uuid);
+            return new Result().ok(data);
+        } else {
+            return new Result().error(response.body.message);
+        }
+    }
+
+
+
+
 }

+ 8 - 3
qnfhq-api/src/main/resources/i18n/messages.properties

@@ -92,8 +92,6 @@ c2c.order.param.adid=Nombor iklan tidak sah
 c2c.order.param.adid.invalid=Iklan tidak boleh digunakan
 c2c.order.direction.invalid=Nilai parameter direction tidak betul
 c2c.order.buyer.seller.must.different=Pembeli dan penjual tidak boleh menjadi pengguna yang sama
-c2c.order.param.tranAmt.min=Jumlah transaksi mesti lebih besar daripada had minimum
-c2c.order.param.tranAmt.max=Jumlah transaksi mesti kurang daripada had maksimum
 c2c.order.update.asset.fail=Gagal mengemas kini aset penjual
 c2c.order.not.exist=Nombor pesanan tidak sah
 c2c.order.status.end.not.cancel=Pesanan telah selesai dan tidak boleh dibatalkan
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=Aset boleh guna anda tidak mencukupi
 c2c.order.not.seller=Anda bukan penjual
 c2c.userReceipt.id.invalid=Nombor tidak sah
 c2c.order.complainId.orderId.all.empty=Nombor rayuan dan nombor pesanan tidak boleh kosong serentak
-
+c2c.order.param.tranAmt.min=Jumlah mesti lebih besar daripada had minimum iklan  
+c2c.order.param.tranAmt.max=Jumlah mesti kurang daripada had maksimum iklan  
+c2c.order.param.tranAmt.over.avail=Jumlah transaksi melebihi kuantiti iklan yang tersedia  
+c2c.msg.receptId.notexists=Penerima tidak wujud  
+c2c.msg.msgType.err=Jenis mesej salah  
+c2c.msg.receptId.err=Tidak boleh menghantar mesej kepada diri sendiri  
+user.verifyIntelligentCaptcha.err=Ralat pada antara muka pengesahan captcha pintar  
+609=Pengesahan captcha pintar gagal

+ 9 - 4
qnfhq-api/src/main/resources/i18n/messages_de.properties

@@ -91,9 +91,7 @@ c2c.order.availableAmount.insufficient=Ihr verf\u00fcgbares Verm\u00f6gen muss g
 c2c.order.param.adid=Ung\u00fcltige Anzeigen-ID  
 c2c.order.param.adid.invalid=Anzeige ist nicht mehr verf\u00fcgbar  
 c2c.order.direction.invalid=Der Parameterwert f\u00fcr direction ist nicht korrekt  
-c2c.order.buyer.seller.must.different=K\u00e4ufer und Verk\u00e4ufer d\u00fcrfen nicht der gleiche Benutzer sein  
-c2c.order.param.tranAmt.min=Der Transaktionsbetrag muss gr\u00f6\u00dfer als das Mindestlimit sein  
-c2c.order.param.tranAmt.max=Der Transaktionsbetrag muss kleiner als das H\u00f6chstlimit sein  
+c2c.order.buyer.seller.must.different=K\u00e4ufer und Verk\u00e4ufer d\u00fcrfen nicht der gleiche Benutzer sein
 c2c.order.update.asset.fail=Aktualisierung des Verk\u00e4uferverm\u00f6gens fehlgeschlagen  
 c2c.order.not.exist=Ung\u00fcltige Bestellnummer  
 c2c.order.status.end.not.cancel=Die Bestellung ist abgeschlossen und kann nicht storniert werden  
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=Ihr verf\u00fcgbares Guthaben ist unzureichend
 c2c.order.not.seller=Sie sind kein Verk\u00e4ufer
 c2c.userReceipt.id.invalid=Ung\u00fcltige Nummer
 c2c.order.complainId.orderId.all.empty=Beschwerde- und Bestellnummer d\u00fcrfen nicht beide leer sein
-
+c2c.order.param.tranAmt.min=Der Betrag muss gr\u00f6\u00dfer als das minimale Anzeigenlimit sein  
+c2c.order.param.tranAmt.max=Der Betrag muss kleiner als das maximale Anzeigenlimit sein  
+c2c.order.param.tranAmt.over.avail=Der Transaktionsbetrag \u00fcbersteigt die verf\u00fcgbare Menge der Anzeige  
+c2c.msg.receptId.notexists=Empf\u00e4nger existiert nicht  
+c2c.msg.msgType.err=Fehler beim Nachrichtentyp  
+c2c.msg.receptId.err=Sie k\u00f6nnen sich selbst keine Nachricht senden  
+user.verifyIntelligentCaptcha.err=Fehler bei der \u00dcberpr\u00fcfung des Captcha-Interfaces  
+609=Intelligente Captcha-\u00dcberpr\u00fcfung fehlgeschlagen

+ 2 - 0
qnfhq-api/src/main/resources/i18n/messages_en.properties

@@ -135,3 +135,5 @@ c2c.order.param.tranAmt.over.avail=The transaction amount exceeds the available
 c2c.msg.receptId.notexists=Recipient does not exist
 c2c.msg.msgType.err=Message type error
 c2c.msg.receptId.err=Cannot send message to yourself
+user.verifyIntelligentCaptcha.err=Verification code validation interface error
+609 = Intelligent CAPTCHA verification failed

+ 9 - 4
qnfhq-api/src/main/resources/i18n/messages_es.properties

@@ -91,9 +91,7 @@ c2c.order.availableAmount.insufficient=Su activo disponible debe ser mayor que l
 c2c.order.param.adid=El n\u00famero de anuncio no es v\u00e1lido  
 c2c.order.param.adid.invalid=El anuncio ya no est\u00e1 disponible  
 c2c.order.direction.invalid=El valor del par\u00e1metro direction no es correcto  
-c2c.order.buyer.seller.must.different=El comprador y el vendedor no pueden ser el mismo usuario  
-c2c.order.param.tranAmt.min=El monto de la transacci\u00f3n debe ser mayor que el l\u00edmite m\u00ednimo  
-c2c.order.param.tranAmt.max=El monto de la transacci\u00f3n debe ser menor que el l\u00edmite m\u00e1ximo  
+c2c.order.buyer.seller.must.different=El comprador y el vendedor no pueden ser el mismo usuario
 c2c.order.update.asset.fail=Error al actualizar los activos del vendedor  
 c2c.order.not.exist=El n\u00famero de orden no es v\u00e1lido  
 c2c.order.status.end.not.cancel=La orden ha finalizado y no puede ser cancelada  
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=Sus activos disponibles son insuficientes
 c2c.order.not.seller=Usted no es el vendedor  
 c2c.userReceipt.id.invalid=Identificaci\u00f3n no v\u00e1lida  
 c2c.order.complainId.orderId.all.empty=El n\u00famero de apelaci\u00f3n y el n\u00famero de pedido no pueden estar ambos vac\u00edos
-
+c2c.order.param.tranAmt.min=El monto debe ser mayor que el l\u00edmite m\u00ednimo del anuncio  
+c2c.order.param.tranAmt.max=El monto debe ser menor que el l\u00edmite m\u00e1ximo del anuncio  
+c2c.order.param.tranAmt.over.avail=El monto de la transacci\u00f3n supera la cantidad disponible del anuncio  
+c2c.msg.receptId.notexists=El destinatario no existe  
+c2c.msg.msgType.err=Error en el tipo de mensaje  
+c2c.msg.receptId.err=No puedes enviarte mensajes a ti mismo  
+user.verifyIntelligentCaptcha.err=Error en la interfaz de verificaci\u00f3n del captcha  
+609=Fallo en la verificaci\u00f3n del captcha inteligente

+ 9 - 4
qnfhq-api/src/main/resources/i18n/messages_fr.properties

@@ -91,9 +91,7 @@ c2c.order.availableAmount.insufficient=Votre actif disponible doit \u00eatre sup
 c2c.order.param.adid=Num\u00e9ro d'annonce invalide  
 c2c.order.param.adid.invalid=L'annonce n'est plus disponible  
 c2c.order.direction.invalid=La valeur du param\u00e8tre direction est incorrecte  
-c2c.order.buyer.seller.must.different=L'acheteur et le vendeur ne peuvent pas \u00eatre le m\u00eame utilisateur  
-c2c.order.param.tranAmt.min=Le montant de la transaction doit \u00eatre sup\u00e9rieur au minimum autoris\u00e9  
-c2c.order.param.tranAmt.max=Le montant de la transaction doit \u00eatre inf\u00e9rieur au maximum autoris\u00e9  
+c2c.order.buyer.seller.must.different=L'acheteur et le vendeur ne peuvent pas \u00eatre le m\u00eame utilisateur
 c2c.order.update.asset.fail=\u00c9chec de la mise \u00e0 jour des actifs du vendeur  
 c2c.order.not.exist=Num\u00e9ro de commande invalide  
 c2c.order.status.end.not.cancel=La commande est termin\u00e9e et ne peut pas \u00eatre annul\u00e9e  
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=Vos actifs disponibles sont insuffisants
 c2c.order.not.seller=Vous n'\u00eates pas le vendeur  
 c2c.userReceipt.id.invalid=Num\u00e9ro invalide  
 c2c.order.complainId.orderId.all.empty=Le num\u00e9ro de r\u00e9clamation et le num\u00e9ro de commande ne peuvent pas \u00eatre tous deux vides
-
+c2c.order.param.tranAmt.min=Le montant doit \u00eatre sup\u00e9rieur au montant minimum de l'annonce
+c2c.order.param.tranAmt.max=Le montant doit \u00eatre inf\u00e9rieur au montant maximum de l'annonce
+c2c.order.param.tranAmt.over.avail=Le montant de la transaction d\u00e9passe la quantit\u00e9 disponible de l'annonce
+c2c.msg.receptId.notexists=Le destinataire n'existe pas
+c2c.msg.msgType.err=Type de message incorrect
+c2c.msg.receptId.err=Vous ne pouvez pas vous envoyer un message \u00e0 vous-m\u00eame
+user.verifyIntelligentCaptcha.err=Erreur lors de la v\u00e9rification du captcha
+609=\u00c9chec de la v\u00e9rification du captcha intelligent

+ 8 - 2
qnfhq-api/src/main/resources/i18n/messages_ja.properties

@@ -92,8 +92,6 @@ c2c.order.param.adid=\u5e83\u544a\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
 c2c.order.param.adid.invalid=\u5e83\u544a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093
 c2c.order.direction.invalid=\u30d1\u30e9\u30e1\u30fc\u30bfdirection\u306e\u5024\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093
 c2c.order.buyer.seller.must.different=\u8cb7\u3044\u624b\u3068\u58f2\u308a\u624b\u306f\u540c\u4e00\u30e6\u30fc\u30b6\u30fc\u3067\u3042\u3063\u3066\u306f\u306a\u308a\u307e\u305b\u3093
-c2c.order.param.tranAmt.min=\u53d6\u5f15\u91d1\u984d\u306f\u6700\u5c0f\u9650\u5ea6\u984d\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
-c2c.order.param.tranAmt.max=\u53d6\u5f15\u91d1\u984d\u306f\u6700\u5927\u9650\u5ea6\u984d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
 c2c.order.update.asset.fail=\u58f2\u308a\u624b\u306e\u8cc7\u7523\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 c2c.order.not.exist=\u6ce8\u6587\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
 c2c.order.status.end.not.cancel=\u6ce8\u6587\u306f\u7d42\u4e86\u3057\u3066\u304a\u308a\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093
@@ -131,4 +129,12 @@ c2c.order.availableAmount.buzu=\u5229\u7528\u53ef\u80fd\u306a\u8cc7\u7523\u304c\
 c2c.order.not.seller=\u3042\u306a\u305f\u306f\u58f2\u308a\u624b\u3067\u306f\u3042\u308a\u307e\u305b\u3093
 c2c.userReceipt.id.invalid=\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059
 c2c.order.complainId.orderId.all.empty=\u7533\u8a34\u756a\u53f7\u3068\u6ce8\u6587\u756a\u53f7\u306e\u4e21\u65b9\u3092\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+c2c.order.param.tranAmt.min=\u91d1\u984d\u306f\u5e83\u544a\u306e\u6700\u5c0f\u9650\u5ea6\u984d\u3088\u308a\u5927\u304d\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.param.tranAmt.max=\u91d1\u984d\u306f\u5e83\u544a\u306e\u6700\u5927\u9650\u5ea6\u984d\u3088\u308a\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+c2c.order.param.tranAmt.over.avail=\u53d6\u5f15\u91d1\u984d\u304c\u5e83\u544a\u306e\u5229\u7528\u53ef\u80fd\u6570\u91cf\u3092\u8d85\u3048\u3066\u3044\u307e\u3059
+c2c.msg.receptId.notexists=\u53d7\u4fe1\u8005\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+c2c.msg.msgType.err=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u304c\u9593\u9055\u3063\u3066\u3044\u307e\u3059
+c2c.msg.receptId.err=\u81ea\u5206\u81ea\u8eab\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+user.verifyIntelligentCaptcha.err=\u8a8d\u8a3c\u30b3\u30fc\u30c9\u691c\u8a3c\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+609=\u30a4\u30f3\u30c6\u30ea\u30b8\u30a7\u30f3\u30c8\u8a8d\u8a3c\u30b3\u30fc\u30c9\u306e\u691c\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f
 

+ 8 - 3
qnfhq-api/src/main/resources/i18n/messages_ko.properties

@@ -92,8 +92,6 @@ c2c.order.param.adid=\uad11\uace0 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \u
 c2c.order.param.adid.invalid=\uad11\uace0\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 c2c.order.direction.invalid=\ud30c\ub77c\ubbf8\ud130 direction \uac12\uc774 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
 c2c.order.buyer.seller.must.different=\uad6c\ub9e4\uc790\uc640 \ud310\ub9e4\uc790\ub294 \ub3d9\uc77c\ud55c \uc0ac\uc6a9\uc790\uac00 \ub420 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
-c2c.order.param.tranAmt.min=\uac70\ub798 \uae08\uc561\uc740 \ucd5c\uc18c \ud55c\ub3c4\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
-c2c.order.param.tranAmt.max=\uac70\ub798 \uae08\uc561\uc740 \ucd5c\ub300 \ud55c\ub3c4\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
 c2c.order.update.asset.fail=\ud310\ub9e4\uc790 \uc790\uc0b0 \uc5c5\ub370\uc774\ud2b8 \uc2e4\ud328
 c2c.order.not.exist=\uc8fc\ubb38 \ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
 c2c.order.status.end.not.cancel=\uc8fc\ubb38\uc774 \uc885\ub8cc\ub418\uc5b4 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc790\uc0b0\uc77
 c2c.order.not.seller=\ub2f9\uc2e0\uc740 \ud310\ub9e4\uc790\uac00 \uc544\ub2d9\ub2c8\ub2e4
 c2c.userReceipt.id.invalid=\ubc88\ud638\uac00 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
 c2c.order.complainId.orderId.all.empty=\uc2e0\uccad \ubc88\ud638\uc640 \uc8fc\ubb38 \ubc88\ud638\ub294 \ubaa8\ub450 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
-
+c2c.order.param.tranAmt.min=\uae08\uc561\uc740 \uad11\uace0 \ucd5c\uc18c \ud55c\ub3c4\ubcf4\ub2e4 \ucee4\uc57c \ud569\ub2c8\ub2e4
+c2c.order.param.tranAmt.max=\uae08\uc561\uc740 \uad11\uace0 \ucd5c\ub300 \ud55c\ub3c4\ubcf4\ub2e4 \uc791\uc544\uc57c \ud569\ub2c8\ub2e4
+c2c.order.param.tranAmt.over.avail=\uac70\ub798 \uae08\uc561\uc774 \uad11\uace0 \uc0ac\uc6a9 \uac00\ub2a5 \uc218\ub7c9\uc744 \ucd08\uacfc\ud588\uc2b5\ub2c8\ub2e4
+c2c.msg.receptId.notexists=\uc218\uc2e0\uc790\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4
+c2c.msg.msgType.err=\uba54\uc2dc\uc9c0 \uc720\ud615 \uc624\ub958
+c2c.msg.receptId.err=\uc790\uae30 \uc790\uc2e0\uc5d0\uac8c \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+user.verifyIntelligentCaptcha.err=\uc778\uc99d \ucf54\ub4dc \uac80\uc99d \uc778\ud130\ud398\uc774\uc2a4 \uc624\ub958
+609=\uc9c0\ub2a5\ud615 \uc778\uc99d \ucf54\ub4dc \uac80\uc99d \uc2e4\ud328

+ 9 - 4
qnfhq-api/src/main/resources/i18n/messages_th.properties

@@ -91,9 +91,7 @@ c2c.order.availableAmount.insufficient=\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1
 c2c.order.param.adid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e42\u0e06\u0e29\u0e13\u0e32\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
 c2c.order.param.adid.invalid=\u0e42\u0e06\u0e29\u0e13\u0e32\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49  
 c2c.order.direction.invalid=\u0e04\u0e48\u0e32\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c direction \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
-c2c.order.buyer.seller.must.different=\u0e1c\u0e39\u0e49\u0e0b\u0e37\u0e49\u0e2d\u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e19\u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19  
-c2c.order.param.tranAmt.min=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33  
-c2c.order.param.tranAmt.max=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14  
+c2c.order.buyer.seller.must.different=\u0e1c\u0e39\u0e49\u0e0b\u0e37\u0e49\u0e2d\u0e41\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e04\u0e19\u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19
 c2c.order.update.asset.fail=\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e4c\u0e02\u0e2d\u0e07\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27  
 c2c.order.not.exist=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07  
 c2c.order.status.end.not.cancel=\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e2a\u0e34\u0e49\u0e19\u0e2a\u0e38\u0e14\u0e41\u0e25\u0e49\u0e27 \u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01\u0e44\u0e14\u0e49  
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=\u0e2a\u0e34\u0e19\u0e17\u0e23\u0e31\u0e1e\u0e22\
 c2c.order.not.seller=\u0e04\u0e38\u0e13\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e1c\u0e39\u0e49\u0e02\u0e32\u0e22
 c2c.userReceipt.id.invalid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07
 c2c.order.complainId.orderId.all.empty=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e23\u0e49\u0e2d\u0e07\u0e40\u0e23\u0e35\u0e22\u0e19\u0e41\u0e25\u0e30\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e04\u0e33\u0e2a\u0e31\u0e48\u0e07\u0e0b\u0e37\u0e49\u0e2d\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e27\u0e49\u0e19\u0e27\u0e48\u0e32\u0e07\u0e44\u0e14\u0e49\u0e17\u0e31\u0e49\u0e07\u0e04\u0e39\u0e48
-
+c2c.order.param.tranAmt.min=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e15\u0e48\u0e33\u0e02\u0e2d\u0e07\u0e42\u0e06\u0e29\u0e13\u0e32
+c2c.order.param.tranAmt.max=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e01\u0e27\u0e48\u0e32\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14\u0e02\u0e2d\u0e07\u0e42\u0e06\u0e29\u0e13\u0e32
+c2c.order.param.tranAmt.over.avail=\u0e08\u0e33\u0e19\u0e27\u0e19\u0e40\u0e07\u0e34\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e17\u0e33\u0e18\u0e38\u0e23\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e34\u0e19\u0e08\u0e33\u0e19\u0e27\u0e19\u0e17\u0e35\u0e48\u0e42\u0e06\u0e29\u0e13\u0e32\u0e21\u0e35\u0e2d\u0e22\u0e39\u0e48
+c2c.msg.receptId.notexists=\u0e1c\u0e39\u0e49\u0e23\u0e31\u0e1a\u0e44\u0e21\u0e48\u0e1e\u0e1a
+c2c.msg.msgType.err=\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14
+c2c.msg.receptId.err=\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e2a\u0e48\u0e07\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e16\u0e36\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07\u0e44\u0e14\u0e49
+user.verifyIntelligentCaptcha.err=\u0e40\u0e01\u0e34\u0e14\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e43\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19
+609=\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e2d\u0e31\u0e08\u0e09\u0e23\u0e34\u0e22\u0e30\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27

+ 8 - 3
qnfhq-api/src/main/resources/i18n/messages_tw.properties

@@ -92,8 +92,6 @@ c2c.order.param.adid=\u5ee3\u544a\u7de8\u865f\u7121\u6548
 c2c.order.param.adid.invalid=\u5ee3\u544a\u5df2\u4e0d\u53ef\u7528
 c2c.order.direction.invalid=\u53c3\u6578direction\u503c\u4e0d\u6b63\u78ba
 c2c.order.buyer.seller.must.different=\u8cb7\u5bb6\u548c\u8ce3\u5bb6\u4e0d\u80fd\u662f\u540c\u4e00\u500b\u7528\u6236
-c2c.order.param.tranAmt.min=\u4ea4\u6613\u91d1\u984d\u5fc5\u9808\u5927\u65bc\u6700\u5c0f\u9650\u984d
-c2c.order.param.tranAmt.max=\u4ea4\u6613\u91d1\u984d\u5fc5\u9808\u5c0f\u65bc\u6700\u5927\u9650\u984d
 c2c.order.update.asset.fail=\u66f4\u65b0\u8ce3\u5bb6\u8cc7\u7522\u5931\u6557
 c2c.order.not.exist=\u8a02\u55ae\u7de8\u865f\u7121\u6548
 c2c.order.status.end.not.cancel=\u8a02\u55ae\u5df2\u7d50\u675f\u4e0d\u80fd\u53d6\u6d88
@@ -131,4 +129,11 @@ c2c.order.availableAmount.buzu=\u60a8\u7684\u53ef\u7528\u8cc7\u7522\u4e0d\u8db3
 c2c.order.not.seller=\u60a8\u4e0d\u662f\u8ce3\u5bb6
 c2c.userReceipt.id.invalid=\u7de8\u865f\u7121\u6548
 c2c.order.complainId.orderId.all.empty=\u7533\u8a34\u7de8\u865f\u3001\u8a02\u55ae\u7de8\u865f\u4e0d\u80fd\u90fd\u70ba\u7a7a
-
+c2c.order.param.tranAmt.min=\u91d1\u984d\u5fc5\u9808\u5927\u65bc\u5ee3\u544a\u6700\u5c0f\u9650\u984d
+c2c.order.param.tranAmt.max=\u91d1\u984d\u5fc5\u9808\u5c0f\u65bc\u5ee3\u544a\u6700\u5927\u9650\u984d
+c2c.order.param.tranAmt.over.avail=\u4ea4\u6613\u91d1\u984d\u8d85\u904e\u5ee3\u544a\u53ef\u7528\u6578\u91cf
+c2c.msg.receptId.notexists=\u63a5\u6536\u4eba\u4e0d\u5b58\u5728
+c2c.msg.msgType.err=\u6d88\u606f\u985e\u578b\u932f\u8aa4
+c2c.msg.receptId.err=\u4e0d\u80fd\u7d66\u81ea\u5df1\u767c\u6d88\u606f
+user.verifyIntelligentCaptcha.err=\u9a57\u8b49\u78bc\u6821\u9a57\u63a5\u53e3\u5831\u932f
+609=\u667a\u80fd\u9a57\u8b49\u78bc\u6821\u9a57\u5931\u6557

+ 9 - 4
qnfhq-api/src/main/resources/i18n/messages_vi.properties

@@ -90,9 +90,7 @@ c2c.order.availableAmount.insufficient=T\u00e0i s\u1ea3n kh\u1ea3 d\u1ee5ng c\u1
 c2c.order.param.adid=M\u00e3 qu\u1ea3ng c\u00e1o kh\u00f4ng h\u1ee3p l\u1ec7  
 c2c.order.param.adid.invalid=Qu\u1ea3ng c\u00e1o kh\u00f4ng c\u00f2n kh\u1ea3 d\u1ee5ng  
 c2c.order.direction.invalid=Gi\u00e1 tr\u1ecb tham s\u1ed1 direction kh\u00f4ng ch\u00ednh x\u00e1c  
-c2c.order.buyer.seller.must.different=Ng\u01b0\u1eddi mua v\u00e0 ng\u01b0\u1eddi b\u00e1n kh\u00f4ng th\u1ec3 l\u00e0 c\u00f9ng m\u1ed9t ng\u01b0\u1eddi d\u00f9ng  
-c2c.order.param.tranAmt.min=S\u1ed1 ti\u1ec1n giao d\u1ecbch ph\u1ea3i l\u1edbn h\u01a1n gi\u1edbi h\u1ea1n t\u1ed1i thi\u1ec3u  
-c2c.order.param.tranAmt.max=S\u1ed1 ti\u1ec1n giao d\u1ecbch ph\u1ea3i nh\u1ecf h\u01a1n gi\u1edbi h\u1ea1n t\u1ed1i \u0111a  
+c2c.order.buyer.seller.must.different=Ng\u01b0\u1eddi mua v\u00e0 ng\u01b0\u1eddi b\u00e1n kh\u00f4ng th\u1ec3 l\u00e0 c\u00f9ng m\u1ed9t ng\u01b0\u1eddi d\u00f9ng
 c2c.order.update.asset.fail=C\u1eadp nh\u1eadt t\u00e0i s\u1ea3n ng\u01b0\u1eddi b\u00e1n th\u1ea5t b\u1ea1i  
 c2c.order.not.exist=M\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng h\u1ee3p l\u1ec7  
 c2c.order.status.end.not.cancel=\u0110\u01a1n h\u00e0ng \u0111\u00e3 k\u1ebft th\u00fac kh\u00f4ng th\u1ec3 h\u1ee7y  
@@ -130,4 +128,11 @@ c2c.order.availableAmount.buzu=T\u00e0i s\u1ea3n kh\u1ea3 d\u1ee5ng c\u1ee7a b\u
 c2c.order.not.seller=B\u1ea1n kh\u00f4ng ph\u1ea3i l\u00e0 ng\u01b0\u1eddi b\u00e1n  
 c2c.userReceipt.id.invalid=M\u00e3 kh\u00f4ng h\u1ee3p l\u1ec7  
 c2c.order.complainId.orderId.all.empty=M\u00e3 khi\u1ebfu n\u1ea1i v\u00e0 m\u00e3 \u0111\u01a1n h\u00e0ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng c\u00f9ng l\u00fac
-
+c2c.order.param.tranAmt.min=S\u1ed1 ti\u1ec1n ph\u1ea3i l\u1edbn h\u01a1n h\u1ea1n m\u1ee9c t\u1ed1i thi\u1ec3u c\u1ee7a qu\u1ea3ng c\u00e1o  
+c2c.order.param.tranAmt.max=S\u1ed1 ti\u1ec1n ph\u1ea3i nh\u1ecf h\u01a1n h\u1ea1n m\u1ee9c t\u1ed1i \u0111a c\u1ee7a qu\u1ea3ng c\u00e1o  
+c2c.order.param.tranAmt.over.avail=S\u1ed1 ti\u1ec1n giao d\u1ecbch v\u01b0\u1ee3t qu\u00e1 s\u1ed1 l\u01b0\u1ee3ng c\u00f3 s\u1eb5n c\u1ee7a qu\u1ea3ng c\u00e1o  
+c2c.msg.receptId.notexists=Ng\u01b0\u1eddi nh\u1eadn kh\u00f4ng t\u1ed3n t\u1ea1i  
+c2c.msg.msgType.err=Lo\u1ea1i tin nh\u1eafn sai  
+c2c.msg.receptId.err=Kh\u00f4ng th\u1ec3 g\u1eedi tin nh\u1eafn cho ch\u00ednh m\u00ecnh  
+user.verifyIntelligentCaptcha.err=L\u1ed7i giao di\u1ec7n ki\u1ec3m tra m\u00e3 x\u00e1c nh\u1eadn  
+609=Ki\u1ec3m tra m\u00e3 x\u00e1c nh\u1eadn th\u00f4ng minh th\u1ea5t b\u1ea1i

+ 3 - 1
qnfhq-api/src/main/resources/i18n/messages_zh.properties

@@ -136,4 +136,6 @@ c2c.order.param.tranAmt.max=\u91d1\u989d\u5fc5\u987b\u5c0f\u4e8e\u5e7f\u544a\u67
 c2c.order.param.tranAmt.over.avail=\u4ea4\u6613\u91d1\u989d\u8d85\u8fc7\u5e7f\u544a\u53ef\u7528\u6570\u91cf
 c2c.msg.receptId.notexists=\u63a5\u6536\u4eba\u4e0d\u5b58\u5728
 c2c.msg.msgType.err=\u6d88\u606f\u7c7b\u578b\u9519\u8bef
-c2c.msg.receptId.err=\u4e0d\u80fd\u7ed9\u81ea\u5df1\u53d1\u6d88\u606f
+c2c.msg.receptId.err=\u4e0d\u80fd\u7ed9\u81ea\u5df1\u53d1\u6d88\u606f
+user.verifyIntelligentCaptcha.err=\u9a8c\u8bc1\u7801\u6821\u9a8c\u63a5\u53e3\u62a5\u9519
+609=\u667a\u80fd\u9a8c\u8bc1\u7801\u6821\u9a8c\u5931\u8d25

+ 4 - 3
qnfhq-api/src/main/resources/i18n/validation.properties

@@ -42,6 +42,7 @@ NotBlank.senderId=Pengirim tidak boleh kosong
 NotBlank.recipientId=Penerima tidak boleh kosong  
 NotBlank.content=Kandungan mesej tidak boleh kosong  
 NotBlank.msgType=Jenis mesej tidak boleh kosong  
-NotNull.ownerUid=ID pengguna tidak boleh kosong  
-NotNull.otherUid=ID pihak lain tidak boleh kosong
-Length.content=Kandungan mesej tidak boleh melebihi 1000 panjang
+NotNull.ownerUid=ID pengguna tidak boleh kosong
+NotNull.otherUid=Nombor pihak lain tidak boleh kosong
+Length.content=Kandungan mesej tidak boleh melebihi 1000 aksara
+NotBlank.verifyParam=Parameter kod pengesahan tidak boleh kosong

+ 4 - 3
qnfhq-api/src/main/resources/i18n/validation_de.properties

@@ -42,6 +42,7 @@ NotBlank.senderId=Absender darf nicht leer sein
 NotBlank.recipientId=Empf\u00e4nger darf nicht leer sein  
 NotBlank.content=Nachrichteninhalt darf nicht leer sein  
 NotBlank.msgType=Nachrichtentyp darf nicht leer sein  
-NotNull.ownerUid=Benutzernummer darf nicht leer sein  
-NotNull.otherUid=Gegenseitige Nummer darf nicht leer sein
-Die L\u00e4nge des Nachrichteninhalts darf 1000 nicht \u00fcberschreiten.
+NotNull.ownerUid=Benutzernummer darf nicht leer sein
+NotNull.otherUid=Die Gegenpartei-ID darf nicht leer sein  
+Length.content=Die Nachrichtenl\u00e4nge darf 1000 Zeichen nicht \u00fcberschreiten  
+NotBlank.verifyParam=Der Verifizierungscode darf nicht leer sein

+ 2 - 1
qnfhq-api/src/main/resources/i18n/validation_en.properties

@@ -45,4 +45,5 @@ NotBlank.content=Message content cannot be empty
 NotBlank.msgType=Message type cannot be empty
 NotNull.ownerUid=User ID cannot be empty
 NotNull.otherUid=Counterparty ID cannot be empty
-Length.content=The length of the message content cannot exceed 1000
+Length.content=The length of the message content cannot exceed 1000
+NotBlank.verifyParam=Verification code parameter cannot be empty

+ 3 - 2
qnfhq-api/src/main/resources/i18n/validation_es.properties

@@ -42,6 +42,7 @@ NotBlank.senderId=El remitente no puede estar vac\u00edo
 NotBlank.recipientId=El destinatario no puede estar vac\u00edo  
 NotBlank.content=El contenido del mensaje no puede estar vac\u00edo  
 NotBlank.msgType=El tipo de mensaje no puede estar vac\u00edo  
-NotNull.ownerUid=El n\u00famero de usuario no puede estar vac\u00edo  
+NotNull.ownerUid=El n\u00famero de usuario no puede estar vac\u00edo
 NotNull.otherUid=El n\u00famero de la otra parte no puede estar vac\u00edo
-Length.content=La longitud del contenido del mensaje no puede exceder los 1000
+Length.content=La longitud del contenido del mensaje no puede exceder de 1000
+NotBlank.verifyParam=El par\u00e1metro del c\u00f3digo de verificaci\u00f3n no puede estar vac\u00edo

+ 4 - 3
qnfhq-api/src/main/resources/i18n/validation_fr.properties

@@ -42,6 +42,7 @@ NotBlank.senderId=L'exp\u00e9diteur ne peut pas \u00eatre vide
 NotBlank.recipientId=Le destinataire ne peut pas \u00eatre vide  
 NotBlank.content=Le contenu du message ne peut pas \u00eatre vide  
 NotBlank.msgType=Le type de message ne peut pas \u00eatre vide  
-NotNull.ownerUid=Le num\u00e9ro d'utilisateur ne peut pas \u00eatre vide  
-NotNull.otherUid=Le num\u00e9ro de l'autre partie ne peut pas \u00eatre vide
-Length.content=La longueur du contenu du message ne peut pas d\u00e9passer 1000
+NotNull.ownerUid=Le num\u00e9ro d'utilisateur ne peut pas \u00eatre vide
+NotNull.otherUid=Le num\u00e9ro de l'autre partie ne peut pas \u00eatre nul  
+Length.content=La longueur du contenu du message ne peut pas d\u00e9passer 1000  
+NotBlank.verifyParam=Le param\u00e8tre du code de v\u00e9rification ne peut pas \u00eatre vide

+ 3 - 2
qnfhq-api/src/main/resources/i18n/validation_ja.properties

@@ -43,5 +43,6 @@ NotBlank.recipientId=\u53d7\u4fe1\u8005\u306f\u7a7a\u306b\u3067\u304d\u307e\u305
 NotBlank.content=\u30e1\u30c3\u30bb\u30fc\u30b8\u5185\u5bb9\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotBlank.msgType=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
 NotNull.ownerUid=\u30e6\u30fc\u30b6\u30fc\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
-NotNull.otherUid=\u76f8\u624b\u756a\u53f7\u306f\u7a7a\u306b\u3067\u304d\u307e\u305b\u3093
-Length.content=\u30e1\u30c3\u30bb\u30fc\u30b8\u5185\u5bb9\u306e\u9577\u3055\u306f1000\u3092\u8d85\u3048\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+NotNull.otherUid=\u76f8\u624b\u306e\u756a\u53f7\u3092\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+Length.content=\u30e1\u30c3\u30bb\u30fc\u30b8\u5185\u5bb9\u306e\u9577\u3055\u306f1000\u3092\u8d85\u3048\u3066\u306f\u3044\u3051\u307e\u305b\u3093
+NotBlank.verifyParam=\u691c\u8a3c\u30b3\u30fc\u30c9\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u7a7a\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093

+ 3 - 2
qnfhq-api/src/main/resources/i18n/validation_ko.properties

@@ -43,5 +43,6 @@ NotBlank.recipientId=\ubc1b\ub294 \uc0ac\ub78c\uc740 \ube44\uc6cc\ub458 \uc218 \
 NotBlank.content=\uba54\uc2dc\uc9c0 \ub0b4\uc6a9\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 NotBlank.msgType=\uba54\uc2dc\uc9c0 \uc720\ud615\uc740 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
 NotNull.ownerUid=\uc0ac\uc6a9\uc790 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
-NotNull.otherUid=\uc0c1\ub300\ubc29 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
-Length.content=\uba54\uc2dc\uc9c0 \ub0b4\uc6a9 \uae38\uc774\ub294 1000\uc790\ub97c \ucd08\uacfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4
+NotNull.otherUid=\uc0c1\ub300\ubc29 \ubc88\ud638\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+Length.content=\uba54\uc2dc\uc9c0 \ub0b4\uc6a9 \uae38\uc774\ub294 1000\uc790\ub97c \ucd08\uacfc\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4  
+NotBlank.verifyParam=\uc778\uc99d \ucf54\ub4dc \ub9e4\uac1c\ubcc0\uc218\ub294 \ube44\uc6cc\ub458 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4

+ 2 - 1
qnfhq-api/src/main/resources/i18n/validation_th.properties

@@ -43,5 +43,6 @@ NotBlank.recipientId=\u0e1c\u0e39\u0e49\u0e23\u0e31\u0e1a\u0e15\u0e49\u0e2d\u0e0
 NotBlank.content=\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotBlank.msgType=\u0e1b\u0e23\u0e30\u0e40\u0e20\u0e17\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
 NotNull.ownerUid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
-NotNull.otherUid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e1d\u0e48\u0e32\u0e22\u0e15\u0e23\u0e07\u0e02\u0e49\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07
+NotNull.otherUid=\u0e2b\u0e21\u0e32\u0e22\u0e40\u0e25\u0e02\u0e1d\u0e48\u0e32\u0e22\u0e15\u0e23\u0e07\u0e02\u0e49\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32
 Length.content=\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e2b\u0e32\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e40\u0e01\u0e34\u0e19 1000
+NotBlank.verifyParam=\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e23\u0e2b\u0e31\u0e2a\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19\u0e15\u0e49\u0e2d\u0e07\u0e44\u0e21\u0e48\u0e27\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e25\u0e48\u0e32

+ 3 - 2
qnfhq-api/src/main/resources/i18n/validation_tw.properties

@@ -43,5 +43,6 @@ NotBlank.recipientId=\u63a5\u6536\u4eba\u4e0d\u80fd\u7a7a
 NotBlank.content=\u6d88\u606f\u5167\u5bb9\u4e0d\u80fd\u7a7a
 NotBlank.msgType=\u6d88\u606f\u985e\u578b\u4e0d\u80fd\u7a7a
 NotNull.ownerUid=\u7528\u6236\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a
-NotNull.otherUid=\u5c0d\u65b9\u7de8\u865f\u4e0d\u80fd\u70ba\u7a7a
-Length.content=\u6d88\u606f\u5167\u5bb9\u9577\u5ea6\u4e0d\u80fd\u8d85\u904e1000
+NotNull.otherUid=????????
+Length.content=??????????1000
+NotBlank.verifyParam=?????????

+ 2 - 2
qnfhq-api/src/main/resources/i18n/validation_vi.properties

@@ -43,6 +43,6 @@ NotBlank.recipientId=Ng\u01b0\u1eddi nh\u1eadn kh\u00f4ng \u0111\u01b0\u1ee3c \u
 NotBlank.content=N\u1ed9i dung tin nh\u1eafn kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotBlank.msgType=Lo\u1ea1i tin nh\u1eafn kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 NotNull.ownerUid=M\u00e3 ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
-NotNull.otherUid=M\u00e3 \u0111\u1ed1i ph\u01b0\u01a1ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
+NotNull.otherUid=M\u00e3 s\u1ed1 \u0111\u1ed1i ph\u01b0\u01a1ng kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng
 Length.content=\u0110\u1ed9 d\u00e0i n\u1ed9i dung tin nh\u1eafn kh\u00f4ng \u0111\u01b0\u1ee3c v\u01b0\u1ee3t qu\u00e1 1000
-
+NotBlank.verifyParam=Tham s\u1ed1 m\u00e3 x\u00e1c minh kh\u00f4ng \u0111\u01b0\u1ee3c \u0111\u1ec3 tr\u1ed1ng

+ 2 - 1
qnfhq-api/src/main/resources/i18n/validation_zh.properties

@@ -45,4 +45,5 @@ NotBlank.content=\u6d88\u606f\u5185\u5bb9\u4e0d\u80fd\u7a7a
 NotBlank.msgType=\u6d88\u606f\u7c7b\u578b\u4e0d\u80fd\u7a7a
 NotNull.ownerUid=\u7528\u6237\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
 NotNull.otherUid=\u5bf9\u65b9\u7f16\u53f7\u4e0d\u80fd\u4e3a\u7a7a
-Length.content=\u6d88\u606f\u5185\u5bb9\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc71000
+Length.content=\u6d88\u606f\u5185\u5bb9\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc71000
+NotBlank.verifyParam=\u9a8c\u8bc1\u7801\u53c2\u6570\u4e0d\u80fd\u4e3a\u7a7a

+ 5 - 0
qnfhq-common/src/main/java/com/qnfhq/common/exception/ErrorCode.java

@@ -55,4 +55,9 @@ public interface ErrorCode {
      * c2c有一笔进行中的订单
      */
     int C2C_ORDER_PROCESS = 608;
+
+    /**
+     * 需要重新验证阿里云智能验证器
+     */
+    int AUTH_ALIYUN_CAPTCHA = 609;
 }