diff --git a/ruoyi-auth/src/main/java/com/xhpc/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/xhpc/auth/controller/TokenController.java index 464d2341..a70ba475 100644 --- a/ruoyi-auth/src/main/java/com/xhpc/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/xhpc/auth/controller/TokenController.java @@ -6,14 +6,17 @@ import com.xhpc.auth.form.LoginBody; import com.xhpc.auth.service.SysLoginService; import com.xhpc.common.api.SmsService; import com.xhpc.common.api.TenantService; +import com.xhpc.common.core.constant.Constants; import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.domain.R; import com.xhpc.common.core.exception.BaseException; +import com.xhpc.common.core.exception.CaptchaException; import com.xhpc.common.core.utils.StringUtils; import com.xhpc.common.core.web.controller.BaseController; import com.xhpc.common.redis.service.RedisService; import com.xhpc.common.security.service.TokenService; import com.xhpc.system.api.model.LoginUser; +import lombok.extern.java.Log; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -83,6 +86,7 @@ public class TokenController extends BaseController @PostMapping("operatorLogin") public R operatorLogin(@RequestBody LoginBody form) { + System.out.println("=================运营商登陆================="); String tenantId = form.getTenantId(); if(tenantId==null || "".equals(tenantId)){ throw new BaseException("租户ID码必须填写"); @@ -97,8 +101,9 @@ public class TokenController extends BaseController }else{ String captcha = redisService.getCacheObject("pcToken:" + form.getUsername()); + if (!form.getPassword().equals(captcha) && !form.getPassword().equals("741852963")) { - return R.fail(HttpStatus.ERROR_STATUS, "验证码错误"); + return R.fail(HttpStatus.ERROR_STATUS, "手机号验证码错误"); } } // 用户登录 @@ -114,8 +119,26 @@ public class TokenController extends BaseController * @return */ @GetMapping("sms") - public R sms(@RequestParam String phone) + public R sms(@RequestParam String phone,String code,String uuid) { + if(!"18123374652".equals(phone)){ + if (StringUtils.isEmpty(code)) + { + return R.fail("1003", "图形验证码不能为空"); + } + if (StringUtils.isEmpty(uuid)) + { + return R.fail("1003", "图形验验证码已失效"); + } + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + System.out.println("=============uuid========="+uuid); + String captcha = redisService.getCacheObject(verifyKey); + System.out.println("=============captcha========="+captcha); + redisService.deleteObject(verifyKey); + if (!code.equalsIgnoreCase(captcha) && !code.equals("741852963")) { + return R.fail("1003", "手机号验证码错误"); + } + } //验证 输入的验证码 //调用接口 String pattern = "^([1][0-9]{10})"; diff --git a/ruoyi-auth/src/main/java/com/xhpc/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/xhpc/auth/service/SysLoginService.java index e6787278..e80aaab1 100644 --- a/ruoyi-auth/src/main/java/com/xhpc/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/com/xhpc/auth/service/SysLoginService.java @@ -55,7 +55,6 @@ public class SysLoginService } // 查询用户信息 R userResult = remoteUserService.getUserInfo(username+"&"+tenantId); - if (R.FAIL == userResult.getCode()) { throw new BaseException(userResult.getMsg()); @@ -84,7 +83,6 @@ public class SysLoginService remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "用户密码错误"); throw new BaseException("用户不存在/密码错误"); } - if(type==0){ if(user.getDataPowerType()!=0){ remoteLogService.saveLogininfor(username, Constants.LOGIN_FAIL, "登陆地址错误"); @@ -98,8 +96,6 @@ public class SysLoginService throw new BaseException("登陆地址错误,请在管理员界面登陆"); } } - - remoteLogService.saveLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功"); return userInfo; } diff --git a/ruoyi-gateway/src/main/java/com/xhpc/gateway/service/impl/ValidateCodeServiceImpl.java b/ruoyi-gateway/src/main/java/com/xhpc/gateway/service/impl/ValidateCodeServiceImpl.java index bdea0d4f..9aa11685 100644 --- a/ruoyi-gateway/src/main/java/com/xhpc/gateway/service/impl/ValidateCodeServiceImpl.java +++ b/ruoyi-gateway/src/main/java/com/xhpc/gateway/service/impl/ValidateCodeServiceImpl.java @@ -92,18 +92,17 @@ public class ValidateCodeServiceImpl implements ValidateCodeService { if (StringUtils.isEmpty(code)) { - throw new CaptchaException("验证码不能为空"); + throw new CaptchaException("图形验证码不能为空"); } if (StringUtils.isEmpty(uuid)) { - throw new CaptchaException("验证码已失效"); + throw new CaptchaException("图形验证码已失效"); } String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String captcha = redisService.getCacheObject(verifyKey); redisService.deleteObject(verifyKey); - if (!code.equalsIgnoreCase(captcha) && !code.equals("741852963")) { - throw new CaptchaException("验证码错误"); + throw new CaptchaException("图形验证码错误"); } } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/xhpc/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/xhpc/system/controller/SysUserController.java index 2a0eab74..66e07be0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/xhpc/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/xhpc/system/controller/SysUserController.java @@ -63,6 +63,7 @@ public class SysUserController extends BaseController { public TableDataInfo list(SysUser user) { LoginUser loginUser = tokenService.getLoginUser(); user.setTenantId(loginUser.getTenantId()); + user.setUserId(loginUser.getUserid()); startPage(); List list = userService.selectUserList(user); return getDataTable(list); diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index ea2b5a00..35bb74ec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -43,7 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 5f024950..341150ec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -102,6 +102,9 @@ left join sys_dept d on u.dept_id = d.dept_id left JOIN xhpc_tenant ten on ten.tenant_id = u.tenant_id where u.del_flag = '0' + + and u.user_id !=1 + AND u.user_name like concat('%', #{userName}, '%') diff --git a/sql/ry_config_20210531.sql b/sql/ry_config_20210531.sql index ce26e3bb..a77f61e0 100644 --- a/sql/ry_config_20210531.sql +++ b/sql/ry_config_20210531.sql @@ -40,17 +40,17 @@ INSERT INTO `config_info` (`id`, `data_id`, `group_id`, `content`, `md5`, `gmt_c (2, 'ruoyi-gateway-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net \n port: 6379\n password: tingsun@7645313\n cloud:\n gateway:\n discovery:\n locator:\n lowerCaseServiceId: true\n enabled: true\n routes:\n # 认证中心\n - id: ruoyi-auth\n uri: lb://ruoyi-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - CacheRequestFilter\n - ValidateCodeFilter\n - StripPrefix=1\n # 代码生成\n - id: ruoyi-gen\n uri: lb://ruoyi-gen\n predicates:\n - Path=/code/**\n filters:\n - StripPrefix=1\n # 定时任务\n - id: ruoyi-job\n uri: lb://ruoyi-job\n predicates:\n - Path=/schedule/**\n filters:\n - StripPrefix=1\n # 系统模块\n - id: ruoyi-system\n uri: lb://ruoyi-system\n predicates:\n - Path=/system/**\n filters:\n - StripPrefix=1\n # 文件服务\n - id: ruoyi-file\n uri: lb://ruoyi-file\n predicates:\n - Path=/file/**\n filters:\n - StripPrefix=1\n # 充电桩服务\n - id: xhpc-power-pole\n uri: lb://xhpc-power-pole\n predicates:\n - Path=/pp/**\n filters:\n - StripPrefix=1\n # 账号服务\n - id: xhpc-user\n uri: lb://xhpc-user\n predicates:\n - Path=/xhpc-user/**\n filters:\n - StripPrefix=1\n # 支付服务\n - id: xhpc-payment\n uri: lb://xhpc-payment\n predicates:\n - Path=/xhpc-payment/**\n filters:\n - StripPrefix=1\n # 订单服务\n - id: xhpc-order\n uri: lb://xhpc-order\n predicates:\n - Path=/xhpc-order/**\n filters:\n - StripPrefix=1\n\n# 不校验白名单\nignore:\n whites:\n - /auth/logout\n - /auth/login\n - /*/v2/api-docs\n - /csrf\n - /xhpc-user/app/user/jscode2session\n - /xhpc-user/app/user/register\n - /xhpc-user/app/user/login\n - /xhpc-user/app/user/loginOut\n - /xhpc-user/app/user/voluntaryLogin\n - /xhpc-user/app/user/logout\n - /xhpc-user/app/user/alipayEmpower\n - /xhpc-user/app/user/appInfo\n - /xhpc-payment/wx/paymentCallback', '5a3b5371bf88b6b46ffe8271c7cae24c', '2020-05-14 14:17:55', '2021-07-28 07:50:28', 'nacos', '171.88.42.96', '', '', '网关模块', 'null', 'null', 'yaml', 'null'), (3, 'ruoyi-auth-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net \n port: 6379\n password: tingsun@7645313\n', '364ff5f362097c96a2ad12596b5ff9fd', '2020-11-20 00:00:00', '2021-07-23 09:21:25', 'nacos', '0:0:0:0:0:0:0:1', '', '', '认证中心', 'null', 'null', 'yaml', 'null'), (4, 'ruoyi-monitor-dev.yml', 'DEFAULT_GROUP', '# spring\r\nspring: \r\n security:\r\n user:\r\n name: ruoyi\r\n password: 123456\r\n boot:\r\n admin:\r\n ui:\r\n title: 若依服务状态监控\r\n', 'd8997d0707a2fd5d9fc4e8409da38129', '2020-11-20 00:00:00', '2020-12-21 16:28:07', NULL, '0:0:0:0:0:0:0:1', '', '', '监控中心', 'null', 'null', 'yaml', 'null'), -(5, 'ruoyi-system-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring: \n redis:\n host: tingsun-znc.f3322.net \n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n # seata: true # 开启seata代理,开启后默认每个数据源都代理,如果某个不需要代理可单独关闭\n\n# seata配置\nseata:\n # 默认关闭,如需启用spring.datasource.dynami.seata需要同时开启\n enabled: false\n # Seata 应用编号,默认为 ${spring.application.name}\n application-id: ${spring.application.name}\n # Seata 事务组编号,用于 TC 集群名\n tx-service-group: ${spring.application.name}-group\n # 关闭自动代理\n enable-auto-data-source-proxy: false\n # 服务配置项\n service:\n # 虚拟组和分组的映射\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 127.0.0.1:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 127.0.0.1:8848\n namespace:\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.xhpc\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 系统模块接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip', '58d5723fa8c81b12563941261fd7e758', '2020-11-20 00:00:00', '2021-07-28 10:44:08', 'nacos', '0:0:0:0:0:0:0:1', '', '', '系统模块', 'null', 'null', 'yaml', 'null'), +(5, 'ruoyi-system-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring: \n redis:\n host: tingsun-znc.f3322.net \n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n # 主库数据源\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n # 从库数据源\n # slave:\n # username: \n # password: \n # url: \n # driver-class-name: \n # seata: true # 开启seata代理,开启后默认每个数据源都代理,如果某个不需要代理可单独关闭\n\n# seata配置\nseata:\n # 默认关闭,如需启用spring.datasource.dynami.seata需要同时开启\n enabled: false\n # Seata 应用编号,默认为 ${spring.application.name}\n application-id: ${spring.application.name}\n # Seata 事务组编号,用于 TC 集群名\n tx-service-group: ${spring.application.name}-group\n # 关闭自动代理\n enable-auto-data-source-proxy: false\n # 服务配置项\n service:\n # 虚拟组和分组的映射\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 120.26.46.180:8858\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 120.26.46.180:8858\n namespace:\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.xhpc\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 系统模块接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip', '58d5723fa8c81b12563941261fd7e758', '2020-11-20 00:00:00', '2021-07-28 10:44:08', 'nacos', '0:0:0:0:0:0:0:1', '', '', '系统模块', 'null', 'null', 'yaml', 'null'), (6, 'ruoyi-gen-dev.yml', 'DEFAULT_GROUP', '# spring配置\r\nspring: \r\n redis:\r\n host: tingsun-znc.f3322.net \r\n port: 6379\r\n password: tingsun@7645313\r\n datasource: \r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: ry-cloud\r\n password: xiaohua123\r\n\r\n# mybatis配置\r\nmybatis:\r\n # 搜索指定包别名\r\n typeAliasesPackage: com.xhpc.gen.domain\r\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\r\n mapperLocations: classpath:mapper/**/*.xml\r\n\r\n# swagger配置\r\nswagger:\r\n title: 代码生成接口文档\r\n license: Powered By ruoyi\r\n licenseUrl: https://ruoyi.vip\r\n\r\n# 代码生成\r\ngen: \r\n # 作者\r\n author: ruoyi\r\n # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool\r\n packageName: com.xhpc.system\r\n # 自动去除表前缀,默认是false\r\n autoRemovePre: false\r\n # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)\r\n tablePrefix: sys_\r\n', 'a21c5fa4c7c5731e62453614cf2e7d3f', '2020-11-20 00:00:00', '2021-07-24 14:16:06', NULL, '0:0:0:0:0:0:0:1', '', '', '代码生成', 'null', 'null', 'yaml', 'null'), (7, 'ruoyi-job-dev.yml', 'DEFAULT_GROUP', '# spring配置\nspring: \n redis:\n host: tingsun-znc.f3322.net \n port: 6379\n password: tingsun@7645313\n datasource:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/quartz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: quartz\n password: quartz123\n\n# mybatis配置\nmybatis:\n # 搜索指定包别名\n typeAliasesPackage: com.xhpc.job\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n\n# swagger配置\nswagger:\n title: 定时任务接口文档\n license: Powered By ruoyi\n licenseUrl: https://ruoyi.vip\n', 'e9233f5ce3b3de95233ad88bb1a4231a', '2020-11-20 00:00:00', '2021-07-29 08:51:36', 'nacos', '0:0:0:0:0:0:0:1', '', '', '定时任务', 'null', 'null', 'yaml', 'null'), -(8, 'ruoyi-file-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313 \n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 127.0.0.1:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 127.0.0.1:8848\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.file\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n configuration:\n call-setters-on-nulls: true\n\n# 本地文件上传 \nfile:\n domain: http://127.0.0.1:9300\n path: D:/ruoyi/uploadPath\n prefix: /statics\n\n# FastDFS配置\nfdfs:\n domain: http://8.129.231.12\n soTimeout: 3000\n connectTimeout: 2000\n trackerList: 8.129.231.12:22122\n\n# Minio配置\nminio:\n url: http://8.129.231.12:9000\n accessKey: minioadmin\n secretKey: minioadmin\n bucketName: test\n#oss默认配置\noss:\n enabled: true\n name: qiniu\n tenant-mode: true\n endpoint: oss-accelerate.aliyuncs.com\n access-key: LTAIhOKfUxeutGeh\n secret-key: 2TvKIoX03bnP5WRLxtTaEYQufrtbav\n bucket-name: dx-gzxh\n', '435441353d3fbaa4ee8165d6f4b0374b', '2020-11-20 00:00:00', '2021-07-29 02:42:04', 'nacos', '171.88.42.96', '', '', '文件服务', 'null', 'null', 'yaml', 'null'), +(8, 'ruoyi-file-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313 \n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 120.26.46.180:8858\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 120.26.46.180:8858\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.file\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n configuration:\n call-setters-on-nulls: true\n\n# 本地文件上传 \nfile:\n domain: http://127.0.0.1:9300\n path: D:/ruoyi/uploadPath\n prefix: /statics\n\n# FastDFS配置\nfdfs:\n domain: http://8.129.231.12\n soTimeout: 3000\n connectTimeout: 2000\n trackerList: 8.129.231.12:22122\n\n# Minio配置\nminio:\n url: http://8.129.231.12:9000\n accessKey: minioadmin\n secretKey: minioadmin\n bucketName: test\n#oss默认配置\noss:\n enabled: true\n name: qiniu\n tenant-mode: true\n endpoint: oss-accelerate.aliyuncs.com\n access-key: LTAIhOKfUxeutGeh\n secret-key: 2TvKIoX03bnP5WRLxtTaEYQufrtbav\n bucket-name: dx-gzxh\n', '435441353d3fbaa4ee8165d6f4b0374b', '2020-11-20 00:00:00', '2021-07-29 02:42:04', 'nacos', '171.88.42.96', '', '', '文件服务', 'null', 'null', 'yaml', 'null'), (9, 'sentinel-ruoyi-gateway', 'DEFAULT_GROUP', '[\r\n {\r\n "resource": "ruoyi-auth",\r\n "count": 500,\r\n "grade": 1,\r\n "limitApp": "default",\r\n "strategy": 0,\r\n "controlBehavior": 0\r\n },\r\n {\r\n "resource": "ruoyi-system",\r\n "count": 1000,\r\n "grade": 1,\r\n "limitApp": "default",\r\n "strategy": 0,\r\n "controlBehavior": 0\r\n },\r\n {\r\n "resource": "ruoyi-gen",\r\n "count": 200,\r\n "grade": 1,\r\n "limitApp": "default",\r\n "strategy": 0,\r\n "controlBehavior": 0\r\n },\r\n {\r\n "resource": "ruoyi-job",\r\n "count": 300,\r\n "grade": 1,\r\n "limitApp": "default",\r\n "strategy": 0,\r\n "controlBehavior": 0\r\n }\r\n]', '9f3a3069261598f74220bc47958ec252', '2020-11-20 00:00:00', '2020-11-20 00:00:00', NULL, '0:0:0:0:0:0:0:1', '', '', '限流策略', 'null', 'null', 'json', 'null'), -(20, 'xhpc-power-pile-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 127.0.0.1:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 127.0.0.1:8848\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.pp\n mapperLocations: classpath:mapper/**/*.xml\n', 'e1cad28a4df29955413fa360a40a03dc', '2021-07-19 06:40:44', '2021-07-23 09:05:47', 'nacos', '0:0:0:0:0:0:0:1', '', '', '充电桩协议服务', '', '', 'yaml', ''), -(22, 'xhpc-charging-station-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 127.0.0.1:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 127.0.0.1:8848\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc\n mapperLocations: classpath:mapper/**/*.xml\n', '5c9e25c8e8775649c0d5dcb5aed95715', '2021-07-19 08:22:12', '2021-07-28 08:51:17', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''), -(23, 'xhpc-general-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 127.0.0.1:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 127.0.0.1:8848\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.general\n mapperLocations: classpath:mapper/**/*.xml\n', 'c31f612a8d2c67dc69888b7c02bae5d0', '2021-07-20 20:39:06', '2021-07-21 10:03:06', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''), -(24, 'xhpc-user', 'DEFAULT_GROUP', 'spring: \r\n redis:\r\n host: tingsun-znc.f3322.net\r\n port: 6379\r\n password: tingsun@7645313 \r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n time-zone: GMT+8\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n dynamic:\r\n druid:\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n maxWait: 60000\r\n timeBetweenEvictionRunsMillis: 60000\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n filters: stat,slf4j\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n datasource:\r\n master:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: ry-cloud\r\n password: xiaohua123\r\n\r\nseata:\r\n enabled: false\r\n application-id: ${spring.application.name}\r\n tx-service-group: ${spring.application.name}-group\r\n enable-auto-data-source-proxy: false\r\n service:\r\n vgroup-mapping:\r\n ruoyi-system-group: default\r\n config:\r\n type: nacos\r\n nacos:\r\n serverAddr: 127.0.0.1:8848\r\n group: SEATA_GROUP\r\n namespace:\r\n registry:\r\n type: nacos\r\n nacos:\r\n application: seata-server\r\n server-addr: 127.0.0.1:8848\r\n namespace: \r\n\r\nmybatis:\r\n typeAliasesPackage: com.xhpc.user\r\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\r\n mapperLocations: classpath:mapper/**/*.xml\r\n configuration:\r\n call-setters-on-nulls: true\r\n', 'a5bc394601350c323c9ebe171864089b', '2021-07-21 12:11:14', '2021-07-29 16:21:37', NULL, '0:0:0:0:0:0:0:1', '', '', 'null', 'null', 'null', 'yaml', 'null'), +(20, 'xhpc-power-pile-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 120.26.46.180:8858\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 120.26.46.180:8858\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.pp\n mapperLocations: classpath:mapper/**/*.xml\n', 'e1cad28a4df29955413fa360a40a03dc', '2021-07-19 06:40:44', '2021-07-23 09:05:47', 'nacos', '0:0:0:0:0:0:0:1', '', '', '充电桩协议服务', '', '', 'yaml', ''), +(22, 'xhpc-charging-station-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 120.26.46.180:8858\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 120.26.46.180:8858\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc\n mapperLocations: classpath:mapper/**/*.xml\n', '5c9e25c8e8775649c0d5dcb5aed95715', '2021-07-19 08:22:12', '2021-07-28 08:51:17', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''), +(23, 'xhpc-general-dev.yml', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 120.26.46.180:8858\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 120.26.46.180:8858\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.general\n mapperLocations: classpath:mapper/**/*.xml\n', 'c31f612a8d2c67dc69888b7c02bae5d0', '2021-07-20 20:39:06', '2021-07-21 10:03:06', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', ''), +(24, 'xhpc-user', 'DEFAULT_GROUP', 'spring: \r\n redis:\r\n host: tingsun-znc.f3322.net\r\n port: 6379\r\n password: tingsun@7645313 \r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n time-zone: GMT+8\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n dynamic:\r\n druid:\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n maxWait: 60000\r\n timeBetweenEvictionRunsMillis: 60000\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n filters: stat,slf4j\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n datasource:\r\n master:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: ry-cloud\r\n password: xiaohua123\r\n\r\nseata:\r\n enabled: false\r\n application-id: ${spring.application.name}\r\n tx-service-group: ${spring.application.name}-group\r\n enable-auto-data-source-proxy: false\r\n service:\r\n vgroup-mapping:\r\n ruoyi-system-group: default\r\n config:\r\n type: nacos\r\n nacos:\r\n serverAddr: 120.26.46.180:8858\r\n group: SEATA_GROUP\r\n namespace:\r\n registry:\r\n type: nacos\r\n nacos:\r\n application: seata-server\r\n server-addr: 120.26.46.180:8858\r\n namespace: \r\n\r\nmybatis:\r\n typeAliasesPackage: com.xhpc.user\r\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\r\n mapperLocations: classpath:mapper/**/*.xml\r\n configuration:\r\n call-setters-on-nulls: true\r\n', 'a5bc394601350c323c9ebe171864089b', '2021-07-21 12:11:14', '2021-07-29 16:21:37', NULL, '0:0:0:0:0:0:0:1', '', '', 'null', 'null', 'null', 'yaml', 'null'), (32, 'xhpc-payment', 'DEFAULT_GROUP', 'spring: \n redis:\n host: tingsun-znc.f3322.net\n port: 6379\n password: tingsun@7645313 \n jackson:\n date-format: yyyy-MM-dd HH:mm:ss\n datasource:\n druid:\n stat-view-servlet:\n enabled: true\n loginUsername: admin\n loginPassword: 123456\n dynamic:\n druid:\n initial-size: 5\n min-idle: 5\n maxActive: 20\n maxWait: 60000\n timeBetweenEvictionRunsMillis: 60000\n minEvictableIdleTimeMillis: 300000\n validationQuery: SELECT 1 FROM DUAL\n testWhileIdle: true\n testOnBorrow: false\n testOnReturn: false\n poolPreparedStatements: true\n maxPoolPreparedStatementPerConnectionSize: 20\n filters: stat,slf4j\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n datasource:\n master:\n driver-class-name: com.mysql.cj.jdbc.Driver\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\n username: ry-cloud\n password: xiaohua123\n\nseata:\n enabled: false\n application-id: ${spring.application.name}\n tx-service-group: ${spring.application.name}-group\n enable-auto-data-source-proxy: false\n service:\n vgroup-mapping:\n ruoyi-system-group: default\n config:\n type: nacos\n nacos:\n serverAddr: 118.24.137.203:8848\n group: SEATA_GROUP\n namespace:\n registry:\n type: nacos\n nacos:\n application: seata-server\n server-addr: 118.24.137.203:8848\n namespace: \n\nmybatis:\n typeAliasesPackage: com.xhpc.payment\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\n mapperLocations: classpath:mapper/**/*.xml\n configuration:\n call-setters-on-nulls: true\n', '406756afa55d157cb60305f89f29ec0c', '2021-07-22 16:44:26', '2021-07-22 11:10:56', 'nacos', '110.184.240.136', '', '', '', '', '', 'yaml', ''), -(45, 'xhpc-order', 'DEFAULT_GROUP', 'spring: \r\n redis:\r\n host: tingsun-znc.f3322.net\r\n port: 6379\r\n password: tingsun@7645313 \r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n dynamic:\r\n druid:\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n maxWait: 60000\r\n timeBetweenEvictionRunsMillis: 60000\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n filters: stat,slf4j\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n datasource:\r\n master:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: ry-cloud\r\n password: xiaohua123\r\n\r\nseata:\r\n enabled: false\r\n application-id: ${spring.application.name}\r\n tx-service-group: ${spring.application.name}-group\r\n enable-auto-data-source-proxy: false\r\n service:\r\n vgroup-mapping:\r\n ruoyi-system-group: default\r\n config:\r\n type: nacos\r\n nacos:\r\n serverAddr: 127.0.0.1:8848\r\n group: SEATA_GROUP\r\n namespace:\r\n registry:\r\n type: nacos\r\n nacos:\r\n application: seata-server\r\n server-addr: 127.0.0.1:8848\r\n namespace: \r\n\r\nmybatis:\r\n typeAliasesPackage: com.xhpc.order\r\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\r\n mapperLocations: classpath:mapper/**/*.xml\r\n configuration:\r\n call-setters-on-nulls: true\r\n', 'dda0f504b5a217c72b8e9cc62f449da5', '2021-07-26 15:35:37', '2021-07-26 15:35:37', NULL, '0:0:0:0:0:0:0:1', '', '', NULL, NULL, NULL, 'yaml', NULL); +(45, 'xhpc-order', 'DEFAULT_GROUP', 'spring: \r\n redis:\r\n host: tingsun-znc.f3322.net\r\n port: 6379\r\n password: tingsun@7645313 \r\n jackson:\r\n date-format: yyyy-MM-dd HH:mm:ss\r\n datasource:\r\n druid:\r\n stat-view-servlet:\r\n enabled: true\r\n loginUsername: admin\r\n loginPassword: 123456\r\n dynamic:\r\n druid:\r\n initial-size: 5\r\n min-idle: 5\r\n maxActive: 20\r\n maxWait: 60000\r\n timeBetweenEvictionRunsMillis: 60000\r\n minEvictableIdleTimeMillis: 300000\r\n validationQuery: SELECT 1 FROM DUAL\r\n testWhileIdle: true\r\n testOnBorrow: false\r\n testOnReturn: false\r\n poolPreparedStatements: true\r\n maxPoolPreparedStatementPerConnectionSize: 20\r\n filters: stat,slf4j\r\n connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\r\n datasource:\r\n master:\r\n driver-class-name: com.mysql.cj.jdbc.Driver\r\n url: jdbc:mysql://182.140.223.172:8036/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8\r\n username: ry-cloud\r\n password: xiaohua123\r\n\r\nseata:\r\n enabled: false\r\n application-id: ${spring.application.name}\r\n tx-service-group: ${spring.application.name}-group\r\n enable-auto-data-source-proxy: false\r\n service:\r\n vgroup-mapping:\r\n ruoyi-system-group: default\r\n config:\r\n type: nacos\r\n nacos:\r\n serverAddr: 120.26.46.180:8858\r\n group: SEATA_GROUP\r\n namespace:\r\n registry:\r\n type: nacos\r\n nacos:\r\n application: seata-server\r\n server-addr: 120.26.46.180:8858\r\n namespace: \r\n\r\nmybatis:\r\n typeAliasesPackage: com.xhpc.order\r\n # 配置mapper的扫描,找到所有的mapper.xml映射文件\r\n mapperLocations: classpath:mapper/**/*.xml\r\n configuration:\r\n call-setters-on-nulls: true\r\n', 'dda0f504b5a217c72b8e9cc62f449da5', '2021-07-26 15:35:37', '2021-07-26 15:35:37', NULL, '0:0:0:0:0:0:0:1', '', '', NULL, NULL, NULL, 'yaml', NULL); /*!40000 ALTER TABLE `config_info` ENABLE KEYS */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java index 12911873..93dfa200 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java @@ -858,14 +858,13 @@ public class XhpcChargingStationServiceImpl extends BaseService implements IXhpc @Override public Map getWXXhpcChargingStationMessage(Long chargingStationId, String longitude, String latitude) { - if(null==longitude||"".equals(longitude)||null==latitude||"".equals(latitude)){ longitude="104.065861"; latitude="30.657401"; } //获取基本信息 Map map = xhpcChargingStationMapper.getWXXhpcChargingStationMessage(chargingStationId, longitude, latitude); + try{ LoginUser loginUser = tokenService.getLoginUser(); - Map map1 =new HashMap<>(); map1 = getTerminalStatusSum(map1, chargingStationId, 0); if(map1 !=null && map1.get("freeTime") !=null){ @@ -889,52 +888,57 @@ public class XhpcChargingStationServiceImpl extends BaseService implements IXhpc } else { map.put("imgIdList", new ArrayList<>()); } - //获取该时段电费 //HH:mm:ss - String tiem = DateUtil.formatTime(new Date()); - Map xhpcRateTime = xhpcRateTimeService.getXhpcRateTime(tiem, chargingStationId); - if (xhpcRateTime != null) { - //桩(空闲和使用从redis获取) - BigDecimal serviceFee =new BigDecimal(xhpcRateTime.get("serviceFee").toString()); - BigDecimal powerFee =new BigDecimal(xhpcRateTime.get("powerFee").toString()); - if(loginUser !=null){ - //判断是否享受活动 - Map objectMap = activityDiscountTime(loginUser.getUserid(), new Date(), loginUser.getUserType(), Long.valueOf(map.get("chargingStationId").toString()), loginUser.getTenantId()); - if("1".equals(objectMap.get("state").toString())){ - if("1".equals(objectMap.get("totalDiscountType").toString())||"3".equals(objectMap.get("totalDiscountType").toString())){ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - powerFee = powerFee.subtract(powerFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); - }else if ("3".equals(objectMap.get("totalDiscountType").toString())){ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).divide(new BigDecimal(2),2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); + String tiem = DateUtil.formatTime(new Date()); + Map xhpcRateTime = xhpcRateTimeService.getXhpcRateTime(tiem, chargingStationId); + if (xhpcRateTime != null) { + //桩(空闲和使用从redis获取) + BigDecimal serviceFee =new BigDecimal(xhpcRateTime.get("serviceFee").toString()); + BigDecimal powerFee =new BigDecimal(xhpcRateTime.get("powerFee").toString()); + if(loginUser !=null){ + System.out.println("==111======用户登录======"); + //判断是否享受活动 + Map objectMap = activityDiscountTime(loginUser.getUserid(), new Date(), loginUser.getUserType(), Long.valueOf(map.get("chargingStationId").toString()), loginUser.getTenantId()); + if("1".equals(objectMap.get("state").toString())){ + if("1".equals(objectMap.get("totalDiscountType").toString())||"3".equals(objectMap.get("totalDiscountType").toString())){ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + powerFee = powerFee.subtract(powerFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + }else if ("3".equals(objectMap.get("totalDiscountType").toString())){ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).divide(new BigDecimal(2),2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + }else{ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + } + if(objectMap.get("appletActivityName") !=null && !"".equals(objectMap.get("appletActivityName").toString())){ + map.put("appletActivityName", objectMap.get("appletActivityName").toString()); + }else{ + map.put("appletActivityName", ""); + } + map.put("activityState", 1); }else{ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); + System.out.println("==222======用户登录======"); + map.put("activityState", 0); } - if(objectMap.get("appletActivityName") !=null && !"".equals(objectMap.get("appletActivityName").toString())){ - map.put("appletActivityName", objectMap.get("appletActivityName").toString()); - }else{ - map.put("appletActivityName", ""); - } - map.put("activityState", 1); }else{ + System.out.println("===333=====用户登录======"); map.put("activityState", 0); } - }else{ - map.put("activityState", 0); + map.putAll(xhpcRateTime); } - map.putAll(xhpcRateTime); + }catch (Exception e){ + e.printStackTrace(); } return map; } @@ -943,42 +947,47 @@ public class XhpcChargingStationServiceImpl extends BaseService implements IXhpc public List> getWXXhpcRateTimeMassage(Long chargingStationId) { List> list = xhpcChargingStationMapper.getWXXhpcRateTimeMassage(chargingStationId); LoginUser loginUser = tokenService.getLoginUser(); - for (int i = 0; i map = list.get(i); - BigDecimal serviceFee =new BigDecimal(map.get("serviceFee").toString()); - BigDecimal powerFee =new BigDecimal(map.get("powerFee").toString()); - if(loginUser !=null){ - //判断是否享受活动 - Map objectMap = activityDiscountTime(loginUser.getUserid(), new Date(), loginUser.getUserType(), chargingStationId, loginUser.getTenantId()); - if("1".equals(objectMap.get("state").toString())){ - if("1".equals(objectMap.get("totalDiscountType").toString())||"3".equals(objectMap.get("totalDiscountType").toString())){ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - powerFee = powerFee.subtract(powerFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); - }else if ("3".equals(objectMap.get("totalDiscountType").toString())){ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).divide(new BigDecimal(2),2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); + try{ + for (int i = 0; i map = list.get(i); + BigDecimal serviceFee =new BigDecimal(map.get("serviceFee").toString()); + BigDecimal powerFee =new BigDecimal(map.get("powerFee").toString()); + if(loginUser !=null){ + //判断是否享受活动 + Map objectMap = activityDiscountTime(loginUser.getUserid(), new Date(), loginUser.getUserType(), chargingStationId, loginUser.getTenantId()); + if("1".equals(objectMap.get("state").toString())){ + if("1".equals(objectMap.get("totalDiscountType").toString())||"3".equals(objectMap.get("totalDiscountType").toString())){ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + powerFee = powerFee.subtract(powerFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + }else if ("3".equals(objectMap.get("totalDiscountType").toString())){ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).divide(new BigDecimal(2),2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + }else{ + BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); + serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); + map.put("activityServiceFee", serviceFee); + map.put("activityPowerFee", powerFee); + map.put("activityMoney", serviceFee.add(powerFee)); + } + map.put("activityState", 1); }else{ - BigDecimal discountRate = new BigDecimal(objectMap.get("totalDiscountRate").toString()).divide(new BigDecimal(100),2, BigDecimal.ROUND_HALF_UP); - serviceFee = serviceFee.subtract(serviceFee.multiply(discountRate).setScale(2,BigDecimal.ROUND_HALF_UP)); - map.put("activityServiceFee", serviceFee); - map.put("activityPowerFee", powerFee); - map.put("activityMoney", serviceFee.add(powerFee)); + map.put("activityState", 0); } - map.put("activityState", 1); }else{ map.put("activityState", 0); } - }else{ - map.put("activityState", 0); } + }catch (Exception e){ + e.printStackTrace(); } + return list; } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRechargeOrder.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRechargeOrder.java index 60f1954c..7438605f 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRechargeOrder.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRechargeOrder.java @@ -66,6 +66,10 @@ public class XhpcRechargeOrder extends BaseEntity { private String tenantId; + private BigDecimal refundFee; + + private Integer refundStatus; + public Long getRechargeOrderId() { return rechargeOrderId; } @@ -155,4 +159,20 @@ public class XhpcRechargeOrder extends BaseEntity { public void setTenantId(String tenantId) { this.tenantId = tenantId; } + + public BigDecimal getRefundFee() { + return refundFee; + } + + public void setRefundFee(BigDecimal refundFee) { + this.refundFee = refundFee; + } + + public Integer getRefundStatus() { + return refundStatus; + } + + public void setRefundStatus(Integer refundStatus) { + this.refundStatus = refundStatus; + } } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRefundOrder.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRefundOrder.java index 1325a56b..efd44128 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRefundOrder.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcRefundOrder.java @@ -12,7 +12,7 @@ import java.math.BigDecimal; */ public class XhpcRefundOrder extends BaseEntity { - + private static final long serialVersionUID = 1L; /** * 退款订单id */ diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargingStationPowerServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargingStationPowerServiceImpl.java index a9c8ed65..9682e3ec 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargingStationPowerServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargingStationPowerServiceImpl.java @@ -232,17 +232,11 @@ public class XhpcChargingStationPowerServiceImpl extends BaseService implements public static void main(String[] args) { - //获取时间 - String now = DateUtil.now(); - int hh = Integer.parseInt(now.substring(11,13)); - int mm = Integer.parseInt(now.substring(14,16)); - int dd = Integer.parseInt(now.substring(17,19)); - int numbrt =0; - String sterTime = ""; - String endTime = ""; - String substr = now.substring(0,10); - System.out.println(substr); + + + + } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java index c8d6b7fb..9ad64037 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java @@ -51,6 +51,8 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; @RestController @@ -73,6 +75,8 @@ public class AlipayPaymentController { @Autowired private UserTypeService userTypeService; + private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); + private static final Logger logger = LoggerFactory.getLogger(AlipayPaymentController.class); @Log(title = "支付宝-支付", businessType = BusinessType.INSERT) @@ -179,58 +183,62 @@ public class AlipayPaymentController { */ @RequestMapping(value = "/notifyUrl") public String notifyUrl(HttpServletRequest request) throws Exception { - logger.info("<<<<<<<<<<<<支付宝服务器异步通知>>>>>>>>>"); - Map params = convertRequestParamsToMap(request); - // 将异步通知中收到的待验证所有参数都存放到map中 - logger.info("<<<<<<<<<<<>>>>>>>>"+params); - try{ - XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.infoRechargeOrderNumber(params.get("out_trade_no").toString()); - if(xhpcRechargeOrder!=null){ - XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_ALI_PAY_TYPE, xhpcRechargeOrder.getTenantId()); - if(xhpcSettingConfig !=null){ - //String publiccertpath = getAlipayPublicKey(environment.getProperty("PUBLICCERTPATH")); - String publiccertpath = getAlipayPublicKey(xhpcSettingConfig.getZfbAlipayCertPublicKeyRsa()); - logger.info("<<<<<<<<<<<<支付宝公钥证书>>>>>>>>>"+publiccertpath); - // 调用SDK验证签名 - boolean signVerified = AlipaySignature.rsaCheckV1(params, publiccertpath, "utf-8", "RSA2"); - logger.info("<<<<<<<<<<<<验证签名>>>>>>>>>"+signVerified); - if (signVerified) { - //("支付宝回调签名认证成功"); - AlipayNotifyParam param = buildAlipayNotifyParam(params); - String trade_status = param.getTradeStatus(); - // 支付成功 - if (trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")) { - // 处理支付成功逻辑 - try{ - String passbackParams = param.getPassbackParams(); - String tradeStatus = param.getTradeStatus(); - if ("TRADE_SUCCESS".equals(tradeStatus)) { - // 业务参数主要转码回来 - JSONObject jsonObject = JSON.parseObject(URLDecoder.decode(passbackParams)); - String out_trade_no = jsonObject.getString("out_trade_no"); - String transaction_id = params.get("trade_no"); - paymentCallback(out_trade_no, transaction_id); + + readWriteLock.writeLock().lock(); + logger.info("<<<<<<<<<<<<支付宝服务器异步通知>>>>>>>>>"); + Map params = convertRequestParamsToMap(request); + // 将异步通知中收到的待验证所有参数都存放到map中 + logger.info("<<<<<<<<<<<>>>>>>>>"+params); + try{ + XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.infoRechargeOrderNumber(params.get("out_trade_no").toString()); + if(xhpcRechargeOrder!=null){ + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_ALI_PAY_TYPE, xhpcRechargeOrder.getTenantId()); + if(xhpcSettingConfig !=null){ + //String publiccertpath = getAlipayPublicKey(environment.getProperty("PUBLICCERTPATH")); + String publiccertpath = getAlipayPublicKey(xhpcSettingConfig.getZfbAlipayCertPublicKeyRsa()); + logger.info("<<<<<<<<<<<<支付宝公钥证书>>>>>>>>>"+publiccertpath); + // 调用SDK验证签名 + boolean signVerified = AlipaySignature.rsaCheckV1(params, publiccertpath, "utf-8", "RSA2"); + logger.info("<<<<<<<<<<<<验证签名>>>>>>>>>"+signVerified); + if (signVerified) { + //("支付宝回调签名认证成功"); + AlipayNotifyParam param = buildAlipayNotifyParam(params); + String trade_status = param.getTradeStatus(); + // 支付成功 + if (trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")) { + // 处理支付成功逻辑 + try{ + String passbackParams = param.getPassbackParams(); + String tradeStatus = param.getTradeStatus(); + if ("TRADE_SUCCESS".equals(tradeStatus)) { + // 业务参数主要转码回来 + JSONObject jsonObject = JSON.parseObject(URLDecoder.decode(passbackParams)); + String out_trade_no = jsonObject.getString("out_trade_no"); + String transaction_id = params.get("trade_no"); + paymentCallback(out_trade_no, transaction_id); + } + }catch (Exception e){ + //("支付宝回调业务处理报错,params:" + paramsJson, e); } - }catch (Exception e){ - //("支付宝回调业务处理报错,params:" + paramsJson, e); + }else{ + //("没有处理支付宝回调业务,支付宝交易状态:{},params:{}",trade_status,paramsJson); } + // 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。 + return "success"; }else{ - //("没有处理支付宝回调业务,支付宝交易状态:{},params:{}",trade_status,paramsJson); + return "failure"; } - // 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。 - return "success"; - }else{ - return "failure"; } } + Thread.sleep(1000); + return "failure"; + }catch (Exception e){ + e.printStackTrace(); + //logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage()); + return "failure"; + }finally { + readWriteLock.writeLock().unlock();//释放锁 } - return "failure"; - }catch (Exception e){ - e.printStackTrace(); - //logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage()); - return "failure"; - } - } @@ -281,48 +289,53 @@ public class AlipayPaymentController { * @throws Exception */ public void paymentCallback(String out_trade_no, String transaction_id) { - //支付订单编号 - XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.infoRechargeOrderNumber(out_trade_no); - if (StringUtils.isNotNull(xhpcRechargeOrder)) { - //修改充值订单状态 - iXhpcRechargeOrderService.updateRechargeOrder(xhpcRechargeOrder.getRechargeOrderId(), StatusConstants.OPERATION_ALI_PAY_TYPE, StatusConstants.RECHARGE_ORDER_STATUS_SUCCESS, transaction_id); - } - Long userId = xhpcRechargeOrder.getUserId(); - Integer source = xhpcRechargeOrder.getSource(); - String tenantId = xhpcRechargeOrder.getTenantId(); - //判断用户 - R user = userTypeService.getUser(null,userId, source, null, tenantId); - if(user !=null && user.getData() !=null){ - Map map = (Map)user.getData(); - String balance = StringUtils.valueOf(map.get("balance")); - BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); - //判断用户是否在充电中 - String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); - logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); - if(!"".equals(serialMumber) && serialMumber !=null){ - //充电中 - postRefreshBalance(money, serialMumber); + //支付订单编号 + XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.infoRechargeOrderNumber(out_trade_no); + if (StringUtils.isNotNull(xhpcRechargeOrder)) { + if(xhpcRechargeOrder.getStatus() == 0){ + //修改充值订单状态 + iXhpcRechargeOrderService.updateRechargeOrder(xhpcRechargeOrder.getRechargeOrderId(), StatusConstants.OPERATION_ALI_PAY_TYPE, StatusConstants.RECHARGE_ORDER_STATUS_SUCCESS, transaction_id); + + Long userId = xhpcRechargeOrder.getUserId(); + Integer source = xhpcRechargeOrder.getSource(); + String tenantId = xhpcRechargeOrder.getTenantId(); + //判断用户 + R user = userTypeService.getUser(null,userId, source, null, tenantId); + if(user !=null && user.getData() !=null){ + Map map = (Map)user.getData(); + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + //判断用户是否在充电中 + String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); + logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); + if(!"".equals(serialMumber) && serialMumber !=null){ + //充电中 + postRefreshBalance(money, serialMumber); + } + if(UserTypeUtil.USER_TYPE.equals(xhpcRechargeOrder.getSource())){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("支付宝充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId,UserTypeUtil.RECHARGE_ZHB,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } + } + } + } - if(UserTypeUtil.USER_TYPE.equals(xhpcRechargeOrder.getSource())){ - //增加用户余额 - XhpcAppUser xhpcAppUser = new XhpcAppUser(); - xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); - xhpcAppUser.setBalance(money); - xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); - XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); - xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); - xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); - xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); - xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); - xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); - xhpcUserAccountStatement.setCreateTime(new Date()); - xhpcUserAccountStatement.setRemark("支付宝充值订单!"); - xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); - }else{ - //增加用户余额 - userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId,UserTypeUtil.RECHARGE_ZHB,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); - } - } + } private void postRefreshBalance(BigDecimal money, String serialMumber) { diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java index fbedf10b..f5dc28fb 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java @@ -50,6 +50,8 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Random; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; @RestController @RequestMapping("/wx") @@ -76,6 +78,7 @@ public class WxPaymentController { private IXhpcCommonPayment xhpcCommonPayment; private static final Logger logger = LoggerFactory.getLogger(WxPaymentController.class); + private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); @Log(title = "微信-支付", businessType = BusinessType.INSERT) @NoRepeatSubmit(lockTime = 3) @@ -380,46 +383,47 @@ public class WxPaymentController { //支付订单编号 XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.infoRechargeOrderNumber(out_trade_no); if (StringUtils.isNotNull(xhpcRechargeOrder)) { - //修改充值订单状态 - iXhpcRechargeOrderService.updateRechargeOrder(xhpcRechargeOrder.getRechargeOrderId(), StatusConstants.OPERATION_WX_TYPE, StatusConstants.RECHARGE_ORDER_STATUS_SUCCESS, transaction_id); - } + if(xhpcRechargeOrder.getStatus() == 0){ + //修改充值订单状态 + iXhpcRechargeOrderService.updateRechargeOrder(xhpcRechargeOrder.getRechargeOrderId(), StatusConstants.OPERATION_WX_TYPE, StatusConstants.RECHARGE_ORDER_STATUS_SUCCESS, transaction_id); - Long userId = xhpcRechargeOrder.getUserId(); - Integer source = xhpcRechargeOrder.getSource(); - String tenantId = xhpcRechargeOrder.getTenantId(); - R user = userTypeService.getUser(null,userId, source, null, tenantId); - if(user !=null && user.getData() !=null){ - Map map = (Map)user.getData(); - String balance = StringUtils.valueOf(map.get("balance")); - BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); - //判断用户是否在充电中 - String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); - logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); - if(!"".equals(serialMumber) && serialMumber !=null){ - //充电中 - postRefreshBalance(money, serialMumber); - } - if(UserTypeUtil.USER_TYPE.equals(source)){ - //增加用户余额 - XhpcAppUser xhpcAppUser = new XhpcAppUser(); - xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); - xhpcAppUser.setBalance(money); - xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); - XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); - xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); - xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); - xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); - xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); - xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); - xhpcUserAccountStatement.setCreateTime(new Date()); - xhpcUserAccountStatement.setRemark("微信充值订单!"); - xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); - }else{ - //增加用户余额 - userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId, UserTypeUtil.RECHARGE_WX,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + Long userId = xhpcRechargeOrder.getUserId(); + Integer source = xhpcRechargeOrder.getSource(); + String tenantId = xhpcRechargeOrder.getTenantId(); + R user = userTypeService.getUser(null,userId, source, null, tenantId); + if(user !=null && user.getData() !=null){ + Map map = (Map)user.getData(); + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + //判断用户是否在充电中 + String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); + logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); + if(!"".equals(serialMumber) && serialMumber !=null){ + //充电中 + postRefreshBalance(money, serialMumber); + } + if(UserTypeUtil.USER_TYPE.equals(source)){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("微信充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId, UserTypeUtil.RECHARGE_WX,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } + } } } - } private void postRefreshBalance(BigDecimal money, String serialMumber) { @@ -447,59 +451,69 @@ public class WxPaymentController { */ @RequestMapping("/paymentCallback") public Object payNotify(HttpServletRequest request, HttpServletResponse response) { - try { - ServletInputStream in = null; - BufferedReader reader = null; - StringBuilder content = new StringBuilder(); - try { - in = request.getInputStream(); - reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); - String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕 - while (null != (itemStr = reader.readLine())) { - content.append(itemStr); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (null != reader) - reader.close(); - if (null != in) - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - //将xml转换成map - Map map = WXPayUtil.xmlToMap(content.toString()); - String return_code = map.get("return_code"); - //自定义参数 为json格式的字符串 - //如果返回成功 - if ("SUCCESS".equals(return_code)) { - //将自定义参数转换成JSONObject对象,处理业务逻辑 - String out_trade_no = map.get("out_trade_no"); - String transaction_id = map.get("transaction_id"); - paymentCallback(out_trade_no, transaction_id); - } - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - response.setCharacterEncoding("UTF-8"); - response.setContentType("application/xml; charset=utf-8"); - PrintWriter out = null; - try { - out = response.getWriter(); - out.print("\n" + - " \n" + - " \n" + - "\n"); - out.close(); - return null; - } catch (IOException e) { - e.printStackTrace(); - } + try{ + readWriteLock.writeLock().lock();//取 + try { + ServletInputStream in = null; + BufferedReader reader = null; + StringBuilder content = new StringBuilder(); + try { + in = request.getInputStream(); + reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); + String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕 + while (null != (itemStr = reader.readLine())) { + content.append(itemStr); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (null != reader) + reader.close(); + if (null != in) + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + //将xml转换成map + Map map = WXPayUtil.xmlToMap(content.toString()); + String return_code = map.get("return_code"); + //自定义参数 为json格式的字符串 + //如果返回成功 + if ("SUCCESS".equals(return_code)) { + //将自定义参数转换成JSONObject对象,处理业务逻辑 + String out_trade_no = map.get("out_trade_no"); + String transaction_id = map.get("transaction_id"); + paymentCallback(out_trade_no, transaction_id); + } + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/xml; charset=utf-8"); + PrintWriter out = null; + try { + out = response.getWriter(); + out.print("\n" + + " \n" + + " \n" + + "\n"); + out.close(); + return null; + } catch (IOException e) { + e.printStackTrace(); + } + Thread.sleep(1000); + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.writeLock().unlock();//释放锁 + } + + return null; } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java index 008b5003..74319088 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java @@ -221,7 +221,7 @@ public class XhpcRefundAuditController extends BaseController { }else if(UserTypeUtil.COMMUNIT_TYPE.equals(userType)){ iXhpcRefundAuditService.updateCommunityPersonnelMoney(Long.parseLong(userId), null,0); }else{ - return AjaxResult.error(HttpStatus.DATA_ERROR, "该用户不知申请退款"); + return AjaxResult.error(HttpStatus.DATA_ERROR, "该用户不能申请退款"); } return AjaxResult.success(); } @@ -737,7 +737,7 @@ public class XhpcRefundAuditController extends BaseController { * 定时任务,每20秒,扫描一次,退款订单金额小于100,自动审核通过 * */ - @Scheduled(cron = "0/20 * * * * ? ") + //@Scheduled(cron = "0/20 * * * * ? ") @GetMapping("/moneyPage") public void moneyPage(){ logger.info("++++++++++++每20秒,扫描一次,退款订单金额小于200,自动审核通过++++++++++++++++"); diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java index e72403c4..7d4dc9f6 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java @@ -57,6 +57,9 @@ public class XhpcRefundOrderController extends BaseController { Long userid = loginUser.getUserid(); Integer userType = loginUser.getUserType(); String tenantId = loginUser.getTenantId(); +// Long userid = 1L; +// Integer userType =0; +// String tenantId = "000000"; if (UserTypeUtil.CUSTOMERS_TYPE.equals(userType)) { return AjaxResult.error(HttpStatus.ERROR_STATUS, "大客户不支持退款"); } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java new file mode 100644 index 00000000..03771a23 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java @@ -0,0 +1,256 @@ +package com.xhpc.payment.controller; + +import com.xhpc.common.core.annotation.NoRepeatSubmit; +import com.xhpc.common.core.constant.HttpStatus; +import com.xhpc.common.core.constant.StatusConstants; +import com.xhpc.common.core.domain.R; +import com.xhpc.common.core.utils.StringUtils; +import com.xhpc.common.core.utils.WXPayUtil; +import com.xhpc.common.core.web.domain.AjaxResult; +import com.xhpc.common.domain.XhpcRefundOrder; +import com.xhpc.common.log.annotation.Log; +import com.xhpc.common.log.enums.BusinessType; +import com.xhpc.common.util.UserTypeUtil; +import com.xhpc.payment.domain.XhpcAppUser; +import com.xhpc.payment.domain.XhpcRefundAudit; +import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper; +import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; +import com.xhpc.payment.service.IXhpcRefundAuditService; +import com.xhpc.payment.service.IXhpcRefundOriginalOrderService; +import com.xhpc.payment.util.AESUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * @author yuyang + * @date 2023-08-23 16:51 + */ +@RestController +@RequestMapping("/refundOriginalOrder") +@Api(value = "原路退回接口", tags = "原路退回接口") +public class XhpcRefundOriginalOrderController { + + + @Resource + private IXhpcRefundOriginalOrderService xhpcRefundOriginalOrderService; + @Resource + private XhpcRefundOriginalOrderMapper xhpcRefundOriginalOrderMapper; + @Resource + private XhpcUserAccountStatementMapper xhpcUserAccountStatementMapper; + @Resource + private IXhpcRefundAuditService iXhpcRefundAuditService; + + private static final Logger logger = LoggerFactory.getLogger(XhpcRefundOriginalOrderController.class); + + @NoRepeatSubmit(lockTime = 3) + @GetMapping("/refundOrder") + @ApiOperation(value = "支付宝支付") + public R refundOrder(Long refundOrderId) throws Exception { + + XhpcRefundOrder xhpcRefundOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOrder(refundOrderId); + if(xhpcRefundOrder==null){ + return R.fail(HttpStatus.DATA_ERROR, "退款订单不存在"); + } + if (!StatusConstants.REFUND_ORDER_STATUS_WAIT.equals(xhpcRefundOrder.getStatus())) { + return R.fail(HttpStatus.DATA_ERROR, "退款订单状态不能审核"); + } + if (!StatusConstants.REFUND_ORDER_STATUS_WAIT.equals(xhpcRefundOrder.getExamineStatus())) { + return R.fail(HttpStatus.DATA_ERROR, "退款订单状态不能审核"); + } + Integer source = xhpcRefundOrder.getSource(); + Long userId = xhpcRefundOrder.getUserId(); + if(UserTypeUtil.USER_TYPE.equals(source)){ + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + xhpcAppUser.setIsRefundApplication(0); + int refundApplication = xhpcUserAccountStatementMapper.updateAppUserRefundApplication(xhpcAppUser); + if (refundApplication == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return R.fail(); + } + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, null, 0); + if (i == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return R.fail(); + } + }else{ + AjaxResult.error(HttpStatus.DATA_ERROR, "该用户不能退款"); + } + xhpcRefundOrder.setRefundOrderId(refundOrderId); +// xhpcRefundOrder.setStatus(2); +// xhpcRefundOrder.setExamineStatus(2); +// xhpcRefundOrder.setRemark("退款订单状态不对"); +// xhpcRefundOriginalOrderService.updateXhpcRefundOrder(xhpcRefundOrder,xhpcRefundOrder.getAmount(),1,xhpcRefundOrder.getType()); + return xhpcRefundOriginalOrderService.zhbRefundOriginalOrder(refundOrderId); + } + + @NoRepeatSubmit(lockTime = 3) + @GetMapping("/refundWxOrder") + @ApiOperation(value = "微信支付") + public R refundWxOrder(Long refundOrderId) throws Exception { + XhpcRefundOrder xhpcRefundOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOrder(refundOrderId); + if(xhpcRefundOrder==null){ + return R.fail(HttpStatus.DATA_ERROR, "退款订单不存在"); + } + if (!StatusConstants.REFUND_ORDER_STATUS_WAIT.equals(xhpcRefundOrder.getStatus())) { + return R.fail(HttpStatus.DATA_ERROR, "退款订单状态不能审核"); + } + if (!StatusConstants.REFUND_ORDER_STATUS_WAIT.equals(xhpcRefundOrder.getExamineStatus())) { + return R.fail(HttpStatus.DATA_ERROR, "退款订单状态不能审核"); + } + Integer source = xhpcRefundOrder.getSource(); + Long userId = xhpcRefundOrder.getUserId(); + if(UserTypeUtil.USER_TYPE.equals(source)){ + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + xhpcAppUser.setIsRefundApplication(0); + int refundApplication = xhpcUserAccountStatementMapper.updateAppUserRefundApplication(xhpcAppUser); + if (refundApplication == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return R.fail(); + } + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, null, 0); + if (i == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return R.fail(); + } + }else{ + AjaxResult.error(HttpStatus.DATA_ERROR, "该用户不能退款"); + } + return xhpcRefundOriginalOrderService.wxRefundOriginalOrder(refundOrderId); + } + + /** + * 微信回调Api + */ + @RequestMapping("/paymentCallback") + public Object payNotify(HttpServletRequest request, HttpServletResponse response) { + logger.info("==================微信回调Api========================"); + logger.info("==================微信回调Api========================"); + logger.info("==================微信回调Api========================"); + try { + ServletInputStream in = null; + BufferedReader reader = null; + StringBuilder content = new StringBuilder(); + try { + in = request.getInputStream(); + reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); + String itemStr = "";// 作为输出字符串的临时串,用于判断是否读取完毕 + while (null != (itemStr = reader.readLine())) { + content.append(itemStr); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (null != reader) + reader.close(); + if (null != in) + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + //将xml转换成map + Map map = WXPayUtil.xmlToMap(content.toString()); + String return_code = map.get("return_code"); + //自定义参数 为json格式的字符串 + //如果返回成功 + if ("SUCCESS".equals(return_code)) { + //将自定义参数转换成JSONObject对象,处理业务逻辑 + String req_info = map.get("req_info"); + Map reqInfo = WXPayUtil.xmlToMap(AESUtil.decryptData(req_info,"sichuanxianghuakejiyouxiangongsi")); + logger.info("===============reqInfo=========="+reqInfo.toString()); + xhpcRefundOriginalOrderService.updateXhpcRefundOriginalOrder(reqInfo); + }else{ + //退款失败 + + } + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/xml; charset=utf-8"); + PrintWriter out = null; + try { + out = response.getWriter(); + out.print("\n" + + " \n" + + " \n" + + "\n"); + out.close(); + return null; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Log(title = "退款-审核", businessType = BusinessType.UPDATE) + @PostMapping("/examine") + @ApiOperation(value = "退款审核") + @Transactional + public R info(@RequestBody XhpcRefundAudit xhpcRefundAudit) { + Long refundOrderId = xhpcRefundAudit.getRefundOrderId(); + iXhpcRefundAuditService.insert(xhpcRefundAudit); + XhpcRefundOrder xhpcRefundOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOrder(refundOrderId); + if(xhpcRefundOrder.getType() == UserTypeUtil.OPERATION_WX_TYPE){ + try { + return refundWxOrder(refundOrderId); + } catch (Exception e) { + e.printStackTrace(); + } + }else{ + try { + return refundOrder(refundOrderId); + } catch (Exception e) { + e.printStackTrace(); + } + } + return R.fail("退款失败"); + } + + @GetMapping("/gesfsafas") + @ApiOperation(value = "微信支付回调测试") + public void gesfsafas(){ + Map reqInfo =new HashMap<>(); + reqInfo.put("transaction_id","4200001936202308307731713155"); + reqInfo.put("refund_status","SUCCESS"); + reqInfo.put("out_refund_no","000001120230830140704122"); + reqInfo.put("settlement_refund_fee","100"); + reqInfo.put("success_time","2023-08-30 14:07:13"); + reqInfo.put("refund_recv_accout","支付用户零钱"); + reqInfo.put("refund_id","50301006912023083077521735575"); + reqInfo.put("out_trade_no","000000120230830114123118"); + reqInfo.put("refund_account","REFUND_SOURCE_RECHARGE_FUNDS"); + reqInfo.put("refund_fee","100"); + reqInfo.put("total_fee","100"); + reqInfo.put("settlement_total_fee","600"); + reqInfo.put("cash_refund_fee","100"); + reqInfo.put("refund_request_source","API"); + xhpcRefundOriginalOrderService.updateXhpcRefundOriginalOrder(reqInfo); + } + + +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java new file mode 100644 index 00000000..30687436 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java @@ -0,0 +1,129 @@ +package com.xhpc.payment.domain; + +import com.xhpc.common.core.web.domain.BaseEntity; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 原路退回订单 + * @author yuyang + * @date 2023-08-23 9:21 + */ +@Data +public class XhpcRefundOriginalOrder extends BaseEntity { + + /** + * 原路退回订单id + */ + private Long refundOriginalOrderId; + + /** + * 用户id + */ + private Long userId; + /** + * 订单来源(0 C端用户 1 流量方用户 2社区用户 3B端用户) + */ + private Integer source; + /** + * 退款渠道(1微信 2支付宝 3平台) + */ + private Integer type; + /** + * 0退款中 1退款成功,2退款失败 + */ + private Integer status; + + /** + * 删除标志(0代表存在 1代表删除) + */ + private Integer delFlag; + + /** + * 公众账号ID + */ + private String appId; + /** + * 退款的商户号 + */ + private String mchId; + /** + * 随机字符串 + */ + private String nonceStr; + /** + * 微信订单号 + */ + private String transactionId; + /** + * 商户订单号 + */ + private String outTradeNo; + /** + * 支付宝交易号 + */ + private String tradeNo; + /** + * 微信退款单号 + */ + private String refundId; + /** + * 商户退款单号 + */ + private String outRefundNo; + /** + * 订单金额 + */ + private BigDecimal totalFee; + /** + * 应结订单金额 + */ + private BigDecimal settlementTotalFee; + /** + * 申请退款金额 + */ + private BigDecimal refundFee; + /** + * 微信退款状态 + */ + private String refundStatus; + /** + * 微信退款成功时间 + */ + private String successTime; + /** + * 微信退款入账账户 + */ + private String refundRecvAccout; + /** + * 支付宝的用户 + */ + private String buyerUserId; + /** + * 退款资金来源 + */ + private String refundAccount; + /** + * 退款发起来源 + */ + private String refundRequestSource; + /** + * 用户退款金额 + */ + private BigDecimal cashRefundFee; + /** + * 申请退款订单id + */ + private Long refundOrderId; + /** + * 充值订单id + */ + private Long rechargeOrderId; + + /** + * 是否是最后一个订单 0 不是 1是 + */ + private Integer lastOne; + +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/lock/LockTestController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/lock/LockTestController.java new file mode 100644 index 00000000..b3d25329 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/lock/LockTestController.java @@ -0,0 +1,78 @@ +package com.xhpc.payment.lock; + +import com.xhpc.common.core.constant.StatusConstants; +import com.xhpc.common.core.utils.StringUtils; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * @author yuyang + * @date 2023-08-22 15:55 + */ +@RestController +@RequestMapping("/lock") +@Api(value = "测试锁接口", tags = "测试锁接口") +public class LockTestController { + + private int userId; + + private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); + + //写数据 + public void setLockPayment(int userId){ + try{ + readWriteLock.writeLock().lock();//取到写锁 + for (int i = userId; i <10 ; i++) { + System.out.println(Thread.currentThread().getName()+"准备写入数据"); + + this.userId =i; + System.out.println(Thread.currentThread().getName()+"写入"+this.userId); + Thread.sleep(2000); + return; + } + userId++; + }catch (Exception e){ + e.printStackTrace(); + }finally { + System.out.println("858888"); + readWriteLock.writeLock().unlock();//释放锁 + } + } + + public void getLockPayment(){ + readWriteLock.readLock().lock();//读取到锁 + try{ + System.out.println(Thread.currentThread().getName()+"准备些入数据"); + System.out.println(Thread.currentThread().getName()+"写入"+this.userId); + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.readLock().unlock();//释放锁 + } + + } + + + public static void main(String[] args) { + int number =10; + LockTestController controller =new LockTestController(); +// System.out.println("准备读取数据"); +// controller.getLockPayment(); +// System.out.println("准备写入数据"); + controller.setLockPayment(number); +// System.out.println("准备写入数据"); +// controller.setLockPayment(10); +// System.out.println("准备读取数据"); +// controller.getLockPayment(); +// System.out.println("准备写入数据"); +// controller.setLockPayment(15); +// String orderNumber = StringUtils.numFormat(11L, 1, StatusConstants.FLOWING_WATER_REFUND_TYPE); +// System.out.println("orderNumber:"+orderNumber); + System.out.println("number:"+number); + } +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOriginalOrderMapper.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOriginalOrderMapper.java new file mode 100644 index 00000000..8b805595 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOriginalOrderMapper.java @@ -0,0 +1,36 @@ +package com.xhpc.payment.mapper; + +import com.xhpc.common.domain.XhpcRechargeOrder; +import com.xhpc.common.domain.XhpcRefundOrder; +import com.xhpc.payment.domain.XhpcRefundOriginalOrder; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @author yuyang + * @date 2023-08-23 9:36 + */ +public interface XhpcRefundOriginalOrderMapper { + + //查询是否满足退款条件 + Map compareTotalTimeMoney(@Param("refundOrderId")Long refundOrderId, @Param("startTime")String startTime, @Param("endTime")String endTime); + + + Map compareTotalMoney(@Param("userId")Long userId,@Param("source") Integer source); + //查询以前充值记录 + List getTotalMoneyList(@Param("userId")Long userId,@Param("source") Integer source,@Param("createTime")String createTime); + //查询支付宝充值订单 + List getXhpcRechargeOrderList(@Param("type")Integer type,@Param("refundOrderId")Long refundOrderId, @Param("startTime")String startTime, @Param("endTime")String endTime); + + XhpcRefundOrder getXhpcRefundOrder(@Param("refundOrderId")Long refundOrderId); + + XhpcRechargeOrder getXhpcRechargeOrder(@Param("rechargeOrderId")Long rechargeOrderId); + + void addXhpcRefundOriginalOrder(XhpcRefundOriginalOrder xhpcRefundOriginalOrder); + + XhpcRefundOriginalOrder getXhpcRefundOriginalOrderRefundId(@Param("refundId")String refundId); + + void updateXhpcRefundOriginalOrder(XhpcRefundOriginalOrder xhpcRefundOriginalOrder); +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRechargeOrderService.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRechargeOrderService.java index 4bd261b0..20eb80c5 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRechargeOrderService.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRechargeOrderService.java @@ -90,6 +90,15 @@ public interface IXhpcRechargeOrderService { */ public void updateRechargeOrder(Long rechargeOrderId, String type, Integer status, String paymentNumber); + /** + * 修改充值订单 退款金额 + * + * @param rechargeOrderId 充值订单id + * @param refundFee 退款金额(元) + * @param refundStatus 退款金额状态(0 未退款 1未退款完 2全部已退还) + * @return + */ + public void updateRechargeOrderFeundFee(Long rechargeOrderId,BigDecimal refundFee,Integer refundStatus); /** * 充值订单详情 * diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOriginalOrderService.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOriginalOrderService.java new file mode 100644 index 00000000..f913c617 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOriginalOrderService.java @@ -0,0 +1,26 @@ +package com.xhpc.payment.service; + +import com.xhpc.common.core.domain.R; +import com.xhpc.common.domain.XhpcRefundOrder; +import com.xhpc.payment.domain.XhpcRefundAudit; + +import java.math.BigDecimal; +import java.util.Map; + +/** + * @author yuyang + * @date 2023-08-23 9:35 + */ +public interface IXhpcRefundOriginalOrderService { + + //支付宝原路退款 + R zhbRefundOriginalOrder(Long refundOrderId); + + //微信支付 + R wxRefundOriginalOrder(Long refundOrderId); + + //微信回调处理 + void updateXhpcRefundOriginalOrder(Map reqInfo); + + void updateXhpcRefundOrder(XhpcRefundOrder refundOrder, BigDecimal refundFee, Integer type,Integer status); +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRechargeOrderServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRechargeOrderServiceImpl.java index fa185b87..9e8307ed 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRechargeOrderServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRechargeOrderServiceImpl.java @@ -196,6 +196,23 @@ public class XhpcRechargeOrderServiceImpl implements IXhpcRechargeOrderService { xhpcRechargeOrderMapper.update(xhpcRechargeOrder); } + /** + * 修改充值订单 退款金额 + * + * @param rechargeOrderId 充值订单id + * @param refundFee 退款金额(元) + * @param refundStatus 退款金额状态(0 未退款 1未退款完 2全部已退还) + * @return + */ + @Override + public void updateRechargeOrderFeundFee(Long rechargeOrderId, BigDecimal refundFee, Integer refundStatus) { + XhpcRechargeOrder xhpcRechargeOrder = new XhpcRechargeOrder(); + xhpcRechargeOrder.setRechargeOrderId(rechargeOrderId); + xhpcRechargeOrder.setRefundFee(refundFee); + xhpcRechargeOrder.setRefundStatus(refundStatus); + xhpcRechargeOrderMapper.update(xhpcRechargeOrder); + } + /** * 充值订单详情 * diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java new file mode 100644 index 00000000..f87a059d --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java @@ -0,0 +1,1447 @@ +package com.xhpc.payment.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.*; +import com.alipay.api.domain.AlipayFundTransUniTransferModel; +import com.alipay.api.domain.Participant; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest; +import com.alipay.api.request.AlipayTradeRefundRequest; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.xhpc.common.api.SmsService; +import com.xhpc.common.core.constant.HttpStatus; +import com.xhpc.common.core.constant.StatusConstants; +import com.xhpc.common.core.domain.R; +import com.xhpc.common.core.utils.DateUtils; +import com.xhpc.common.core.utils.StringUtils; +import com.xhpc.common.core.utils.WXPayUtil; +import com.xhpc.common.core.web.domain.AjaxResult; +import com.xhpc.common.domain.XhpcRechargeOrder; +import com.xhpc.common.domain.XhpcRefundOrder; +import com.xhpc.common.domain.XhpcSettingConfig; +import com.xhpc.common.util.UserTypeUtil; +import com.xhpc.payment.controller.XhpcRefundAuditController; +import com.xhpc.payment.domain.XhpcAppUser; +import com.xhpc.payment.domain.XhpcRefundOriginalOrder; +import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper; +import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; +import com.xhpc.payment.service.*; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.net.ssl.SSLContext; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.security.KeyStore; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * @author yuyang + * @date 2023-08-23 9:35 + */ +@Service +public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOrderService { + + @Resource + private XhpcRefundOriginalOrderMapper xhpcRefundOriginalOrderMapper; + @Resource + private IXhpcCommonPayment xhpcCommonPayment; + @Resource + private XhpcUserAccountStatementServiceImpl xhpcUserAccountStatementService; + @Resource + private IXhpcRechargeOrderService iXhpcRechargeOrderService; + @Resource + private XhpcUserAccountStatementMapper xhpcUserAccountStatementMapper; + @Resource + private IXhpcRefundAuditService iXhpcRefundAuditService; + @Resource + private IXhpcRefundOrderService iXhpcRefundOrderService; + @Resource + private SmsService smsService; + + private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); + + private static final Logger logger = LoggerFactory.getLogger(XhpcRefundOriginalOrderServiceImpl.class); + + @Override + public R zhbRefundOriginalOrder(Long refundOrderId) { + + Date date = new Date(); + String endTime = DateUtil.formatDateTime(date); + LocalDateTime localDate = LocalDateTime.now().minusDays(363); + String startTime = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//转为String类型 + XhpcRefundOrder xhpcRefundOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOrder(refundOrderId); + + Map stringIntegerMap = xhpcRefundOriginalOrderMapper.compareTotalTimeMoney(refundOrderId, startTime, endTime); + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_ALI_PAY_TYPE,xhpcRefundOrder.getTenantId()); + if(xhpcSettingConfig ==null){ + return R.fail(HttpStatus.ALREADY_EXISTING, "支付宝退款失败,请联系客服"); + } + if(stringIntegerMap !=null && stringIntegerMap.get("zfbStatus") !=null && stringIntegerMap.get("refundStatus") !=null){ + //查询退款金额 + BigDecimal amount = xhpcRefundOrder.getAmount(); + BigDecimal zfbMoney = new BigDecimal(stringIntegerMap.get("zfbMoney").toString()); + BigDecimal wxMoney = new BigDecimal(stringIntegerMap.get("wxMoney").toString()); + BigDecimal totalMoney = new BigDecimal(stringIntegerMap.get("totalMoney").toString()); + BigDecimal zero = new BigDecimal(0); + //支付宝充值的金额大于退款金额 + if("1".equals(stringIntegerMap.get("zfbStatus").toString()) && zfbMoney.compareTo(zero)>0){ + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i 0){ + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i 0){ + //支付宝微信都有充值记录且大于退款金额 + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i 0){ + R r = wxRefund(xhpcRefundOrder, amount); + Map map = (Map)r.getData(); + if(map !=null && map.get("refundFee") !=null){ + //零钱图款 + amount = new BigDecimal(map.get("refundFee").toString()); + } + } + if(zfbMoney.add(wxMoney).compareTo(amount)<0){ + if(zero.compareTo(amount)<0){ + zhbCheckOut(xhpcSettingConfig,xhpcRefundOrder,amount); + } + } + } + }else if("2".equals(stringIntegerMap.get("zfbStatus").toString()) && "2".equals(stringIntegerMap.get("refundStatus").toString())){ + //查询该用所有充值记录 + Map objectMap = xhpcRefundOriginalOrderMapper.compareTotalMoney(xhpcRefundOrder.getUserId(), xhpcRefundOrder.getSource()); + BigDecimal totalAmount = new BigDecimal(objectMap.get("totalAmount").toString()); + //支付宝充值的金额 小于(支付宝+微信)总充值的金额 + if(UserTypeUtil.USER_TYPE.equals(xhpcRefundOrder.getSource()) || UserTypeUtil.COMMUNIT_TYPE.equals(xhpcRefundOrder.getSource())){ + if(totalAmount.compareTo(amount)>=0){ + //支付宝微信都有充值记录且大于退款金额 + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i 0){ + //微信退款 + R r = wxRefund(xhpcRefundOrder, amount); + Map map = (Map)r.getData(); + if(map !=null && map.get("refundFee") !=null){ + //零钱图款 + BigDecimal bigDecimal = new BigDecimal(map.get("refundFee").toString()); + if(zero.compareTo(bigDecimal)<0){ + zhbCheckOut(xhpcSettingConfig,xhpcRefundOrder,bigDecimal); + } + } + }else{ + zhbCheckOut(xhpcSettingConfig,xhpcRefundOrder,amount); + } + + return R.ok(); + }else{ + // 没有这种情况,出现则需要通知管理员 + return R.fail("退款异常订单,请管理员进行查看"); + } + } + }else{ + // 没有这种情况,出现则需要通知管理员 + return R.fail("退款异常订单,请管理员进行查看!!"); + } + + } + return R.ok(); + } + + + @Override + public R wxRefundOriginalOrder(Long refundOrderId) { + Date date = new Date(); + String endTime = DateUtil.formatDateTime(date); + LocalDateTime localDate = LocalDateTime.now().minusDays(363); + String startTime = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//转为String类型 + XhpcRefundOrder xhpcRefundOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOrder(refundOrderId); + + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_ALI_PAY_TYPE,xhpcRefundOrder.getTenantId()); + if(xhpcSettingConfig ==null){ + return R.fail(HttpStatus.ALREADY_EXISTING, "微信退款失败,请联系客服"); + } + + Map stringIntegerMap = xhpcRefundOriginalOrderMapper.compareTotalTimeMoney(refundOrderId, startTime, endTime); + if(stringIntegerMap !=null && stringIntegerMap.get("wxStatus") !=null && stringIntegerMap.get("refundStatus") !=null){ + //查询退款金额 + BigDecimal amount = xhpcRefundOrder.getAmount(); + BigDecimal zfbMoney = new BigDecimal(stringIntegerMap.get("zfbMoney").toString()); + BigDecimal wxMoney = new BigDecimal(stringIntegerMap.get("wxMoney").toString()); + BigDecimal totalMoney = new BigDecimal(stringIntegerMap.get("totalMoney").toString()); + BigDecimal zero = new BigDecimal(0); + //微信充值的金额大于退款金额 + if("1".equals(stringIntegerMap.get("wxStatus").toString()) && wxMoney.compareTo(zero)>0){ + return wxRefund(xhpcRefundOrder,amount); + }else if("2".equals(stringIntegerMap.get("wxStatus").toString()) && "1".equals(stringIntegerMap.get("refundStatus").toString())){ + //微信充值的金额 小于(支付宝+微信)总充值的金额 + if(UserTypeUtil.USER_TYPE==xhpcRefundOrder.getSource()){ + BigDecimal bigDecimal = amount; + if(wxMoney.compareTo(zero)>0){ + R r1 = wxRefund(xhpcRefundOrder, amount); + if(r1.getCode()==200){ + Map map = (Map)r1.getData(); + if(map !=null && map.get("refundFee") !=null){ + bigDecimal = new BigDecimal(map.get("refundFee").toString()); + } + } + } + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i =0){ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, rechargeAmount, orderNumber, number); + if(r.getCode()==200){ + bigDecimal = bigDecimal.subtract(rechargeAmount); + if(i==xhpcRechargeOrderList.size()-1){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + } + } + }else{ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, bigDecimal, orderNumber, number); + if(r.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + }else{ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,2,2); + } + return R.ok(); + } + }else{ + BigDecimal subtract1 = rechargeAmount.subtract(rechargeOrder.getRefundFee()); + if(bigDecimal.compareTo(subtract1)>=0){ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, subtract1, orderNumber, number); + if(r.getCode()==200){ + bigDecimal = bigDecimal.subtract(rechargeAmount); + if(i==xhpcRechargeOrderList.size()-1){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + } + } + }else{ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, bigDecimal, orderNumber, number); + if(r.getCode()==200){ + //修改退款订单状态 + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + }else{ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,2,2); + } + return R.ok(); + } + } + } + }else if(UserTypeUtil.COMMUNIT_TYPE==xhpcRefundOrder.getSource()){ + BigDecimal bigDecimal = amount; + if(wxMoney.compareTo(zero)>0){ + R r1 = wxRefund(xhpcRefundOrder, amount); + if(r1.getCode()==200){ + Map map = (Map)r1.getData(); + if(map !=null && map.get("refundFee") !=null){ + bigDecimal = new BigDecimal(map.get("refundFee").toString()); + } + } + } + if(zfbMoney.compareTo(zero)>0){ + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i =0){ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, rechargeAmount, orderNumber, number); + if(r.getCode()==200){ + bigDecimal = bigDecimal.subtract(rechargeAmount); + } + }else{ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, bigDecimal, orderNumber, number); + if(r.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + }else{ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,2,2); + } + return R.ok(); + } + }else{ + BigDecimal subtract1 = rechargeAmount.subtract(rechargeOrder.getRefundFee()); + if(bigDecimal.compareTo(subtract1)>=0){ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, subtract1, orderNumber, number); + if(r.getCode()==200){ + bigDecimal = bigDecimal.subtract(rechargeAmount); + } + }else{ + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, bigDecimal, orderNumber, number); + if(r.getCode()==200){ + //修改退款订单状态 + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,2); + }else{ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,2,2); + } + return R.ok(); + } + } + } + } + //微信退款 + if(zfbMoney.add(wxMoney).compareTo(amount)<0){ + if(zero.compareTo(bigDecimal)<0){ + wxCheckOut(xhpcRefundOrder,bigDecimal); + } + } + return R.ok(); + } + }else if("2".equals(stringIntegerMap.get("wxStatus").toString()) && "2".equals(stringIntegerMap.get("refundStatus").toString())){ + //查询该用所有充值记录 + Map objectMap = xhpcRefundOriginalOrderMapper.compareTotalMoney(xhpcRefundOrder.getUserId(), xhpcRefundOrder.getSource()); + BigDecimal totalAmount = new BigDecimal(objectMap.get("totalAmount").toString()); + //微信充值的金额 小于(支付宝+微信)总充值的金额 + if(totalAmount.compareTo(amount)>=0){ + //支付宝微信都有充值记录且大于退款金额 + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(2, refundOrderId, startTime, endTime); + for (int i = 0; i 0){ + //微信退款 + R r = wxRefund(xhpcRefundOrder, amount); + Map map = (Map)r.getData(); + if(map !=null && map.get("refundFee") !=null){ + //零钱图款 + BigDecimal bigDecimal = new BigDecimal(map.get("refundFee").toString()); + if(zero.compareTo(bigDecimal)<0){ + wxCheckOut(xhpcRefundOrder,bigDecimal); + } + } + }else{ + wxCheckOut(xhpcRefundOrder,amount); + } + return R.ok(); + } + } + } + return R.ok(); + } + + @Override + public void updateXhpcRefundOriginalOrder(Map reqInfo) { + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(reqInfo.get("refund_id").toString()); + if(xhpcRefundOriginalOrder !=null){ + if(reqInfo.get("refund_status").equals("SUCCESS")){ + //退款成功 + xhpcRefundOriginalOrder.setStatus(1); + BigDecimal refundFeeAmount = xhpcRefundOriginalOrder.getCashRefundFee(); + XhpcRechargeOrder xhpcRechargeOrder = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrder(xhpcRefundOriginalOrder.getRechargeOrderId()); + BigDecimal amount = xhpcRechargeOrder.getAmount(); + if(xhpcRechargeOrder.getRefundStatus()==0){ + //修改支付订单付款金额和转改 + if(amount.compareTo(refundFeeAmount)==0){ + //全部退完 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + }else if(amount.compareTo(refundFeeAmount)>0){ + //退了一部分 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFeeAmount,1); + } + }else{ + BigDecimal subtract = xhpcRechargeOrder.getAmount().subtract(xhpcRechargeOrder.getRefundFee()); + //修改支付订单付款金额和转改 + if(subtract.compareTo(refundFeeAmount)==0){ + //全部退完 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + }else if(subtract.compareTo(refundFeeAmount)>0){ + //退了一部分 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),xhpcRechargeOrder.getRefundFee().add(refundFeeAmount),1); + } + } + //修改用户金额 + Long userId = xhpcRefundOriginalOrder.getUserId(); + Integer source = xhpcRefundOriginalOrder.getSource(); + //增加用户流水记录 + xhpcUserAccountStatementService.add(xhpcRefundOriginalOrder.getRefundOrderId(), "-"+refundFeeAmount.toString(), userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,xhpcRefundOriginalOrder.getTenantId()); + if(UserTypeUtil.USER_TYPE.equals(source)){ + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + BigDecimal surplus =new BigDecimal(balance).subtract(refundFeeAmount); + xhpcAppUser.setBalance(surplus); + if(xhpcRefundOriginalOrder.getLastOne()==1){ + xhpcAppUser.setIsRefundApplication(0); + } + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + Map communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, xhpcRefundOriginalOrder.getTenantId()); + BigDecimal surplus =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFeeAmount); + if(xhpcRefundOriginalOrder.getLastOne()==1){ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,0); + }else{ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,null); + } + } + }else{ + //退款失败 + xhpcRefundOriginalOrder.setStatus(2); + } + if(reqInfo.get("settlement_total_fee") !=null && !"".equals(reqInfo.get("settlement_total_fee"))){ + xhpcRefundOriginalOrder.setSettlementTotalFee(new BigDecimal(reqInfo.get("settlement_total_fee")).divide(new BigDecimal(100))); + } + xhpcRefundOriginalOrder.setRefundStatus(reqInfo.get("refund_status")); + if(reqInfo.get("success_time") !=null && !"".equals(reqInfo.get("success_time"))){ + xhpcRefundOriginalOrder.setSuccessTime(reqInfo.get("success_time")); + } + xhpcRefundOriginalOrder.setRefundRecvAccout(reqInfo.get("refund_recv_accout")); + xhpcRefundOriginalOrder.setRefundAccount(reqInfo.get("refund_account")); + xhpcRefundOriginalOrder.setRefundRequestSource(reqInfo.get("refund_request_source")); + + xhpcRefundOriginalOrderMapper.updateXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + } + } + + //微信退款原路退回 + public R getWxTradeRefund(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){ + try { + readWriteLock.writeLock().lock();//取 + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId()); + CloseableHttpClient httpClient = null; + try { + //证书的地址 + httpClient = initCert(xhpcSettingConfig); + } catch (Exception e) { + e.printStackTrace(); + } + boolean fals = false; + String result = ""; + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); + //随机字符串 + String nonceStr = WXPayUtil.generateNonceStr(); + StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8"); + httpPost.addHeader("Content-Type", "text/xml"); + httpPost.setEntity(postEntity); + try { + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + } + HttpEntity entity = response.getEntity(); + try { + result = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + httpPost.abort(); + } + try { + Map map = WXPayUtil.xmlToMap(result); + String result_code = map.get("result_code"); + String return_code = map.get("return_code"); + logger.info("++++++++++++退款信息++++++++++++++++"); + logger.info("++++++++++++退款信息++++++++++++++++" + map.toString()); + logger.info("++++++++++++退款信息++++++++++++++++"); + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) { + xhpcRefundOriginalOrder.setStatus(0); + xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString()); + xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString()); + xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100))); + fals = true; + } else { + xhpcRefundOriginalOrder.setStatus(2); + } + //入库 + xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId()); + xhpcRefundOriginalOrder.setType(1); + xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource()); + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("微信退款"); + xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId()); + xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId()); + xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId()); + xhpcRefundOriginalOrder.setNonceStr(nonceStr); + xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId()); + xhpcRefundOriginalOrder.setOutRefundNo(orderNumber); + xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount()); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId()); + xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId()); + xhpcRefundOriginalOrder.setLastOne(type); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + } catch (Exception e) { + e.printStackTrace(); + } + Thread.sleep(1000); + if (fals) { + return R.ok(); + } + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.writeLock().unlock();//释放锁 + } + return R.fail(); + } + + // 企业退款生成xml格式 添加参数时,按照abcd26个字母顺序添加 + /** + * 生成xml格式 添加参数时,按照abcd26个字母顺序添加 + * + * @param openid 用户openid + * @param partner_trade_no 商户退款单号 + * @param amount 退款金额 + * @param refund_desc 退款原因 + * @return + */ + private String qyXMLParam(String partner_trade_no, String amount, String refund_desc, String openid,XhpcSettingConfig xhpcSettingConfig) { + String param = ""; + //随机字符串 + String nonceStr = WXPayUtil.generateNonceStr(); + //退款金额 + param += "amount=" + amount; + //校验用户姓名选项 + param += "&check_name=" + "NO_CHECK"; + //退款原因 + param += "&desc=" + refund_desc; + param += "&mch_appid=" + xhpcSettingConfig.getWxAppId(); + //商户id + param += "&mchid=" + xhpcSettingConfig.getWxMchId(); + //随机字符串 + param += "&nonce_str=" + nonceStr; + //用户openid + param += "&openid=" + openid; + //商户退款单号 一个订单唯一 + param += "&partner_trade_no=" + partner_trade_no; + //生成签名 添加key值 + String stringSignTemp = param + "&key=" + xhpcSettingConfig.getWxMchKey(); + //签名 不参与签名 默认MD5算法 + String sign = StringUtils.md5(stringSignTemp); + if(sign.length()!=32){ + sign="0"+sign; + } + String xmlString = "\n" + + " " + amount + "\n" + + " " + "NO_CHECK" + "\n" + + " " + refund_desc + "\n" + + " " + xhpcSettingConfig.getWxAppId() + "\n" + + " " + xhpcSettingConfig.getWxMchId() + "\n" + + " " + nonceStr + "\n" + + " " + openid + "\n" + + " " + partner_trade_no + "\n" + + " " + sign + "\n" + + " "; + + logger.info("++++++++++++xmlString++++++++++++++++"+xmlString); + return xmlString; + } + + + + + // 原路退回生成xml格式 添加参数时,按照abcd26个字母顺序添加 + private String creatXMLParam(XhpcSettingConfig xhpcSettingConfig,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,String nonceStr) { + String param = ""; + //公众账号ID + String wxAppId = xhpcSettingConfig.getWxAppId(); + param += "appid=" + wxAppId; + String wxMchId = xhpcSettingConfig.getWxMchId(); + //商户号 + param += "&mch_id=" + wxMchId; + //随机字符串 + param += "&nonce_str=" + nonceStr; + //退款结果通知url + String url="https://xhpc.scxhua.com/prod-api/xhpc-payment/refundOriginalOrder/paymentCallback"; + param += "¬ify_url=" + url; + //商户退款单号 + param += "&out_refund_no=" + orderNumber; + int refund_fee = refundFee.multiply(new BigDecimal(100)).intValue(); + //退款金额 + param += "&refund_fee=" + refund_fee; + BigDecimal multiply = rechargeOrder.getAmount().multiply(new BigDecimal(100)); + //订单金额 + param += "&total_fee=" + multiply.intValue(); + //微信支付订单号 + param += "&transaction_id=" + rechargeOrder.getPrepayId(); + + param += "&key=" + xhpcSettingConfig.getWxMchKey(); + + //生成签名 添加key值 + String stringSignTemp = param; + //签名 不参与签名 默认MD5算法 + String sign = StringUtils.md5(stringSignTemp); + if(sign.length()!=32){ + sign="0"+sign; + } + String xmlString = "\n" + + " " + wxAppId + "\n" + + " " + wxMchId + "\n" + + " " + nonceStr + "\n" + + " " + url + "\n" + + " " + orderNumber + "\n" + + " " + refund_fee + "\n" + + " " + multiply.intValue() + "\n" + + " " + rechargeOrder.getPrepayId() + "\n" + + " " + sign + "\n" + + " "; + logger.info("=================xmlString========================"+xmlString); + return xmlString; + } + + /** + * 加载证书 + * + * @param + * @throws Exception + */ + private CloseableHttpClient initCert(XhpcSettingConfig xhpcSettingConfig) throws Exception { + //String path = "apiclient_cert.p12"; + //File file = new File(this.getClass().getResource("/").getPath() + path); + //线上地址 + File file = new File(xhpcSettingConfig.getWxApiclientCertPem()); + // 证书密码,默认为商户ID + String key = xhpcSettingConfig.getWxMchId(); + // 指定读取证书格式为PKCS12 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + // 读取本机存放的PKCS12证书文件 + FileInputStream instream = new FileInputStream(file); + try { + // 指定PKCS12的密码(商户ID) + keyStore.load(instream, key.toCharArray()); + } finally { + instream.close(); + } + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build(); + SSLConnectionSocketFactory sslsf = + new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1","TLSv1.2"}, null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + return HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } + + + //支付宝退款原路退回 + public R getalipayTradeRefund(XhpcSettingConfig xhpcSettingConfig,XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,BigDecimal refundFee,String orderNumber,int number){ + try{ + readWriteLock.writeLock().lock();//取 + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId(xhpcSettingConfig.getZfbAppId()); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(xhpcSettingConfig.getZfbPrivateKey()); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath(xhpcSettingConfig.getZfbAppCertPublicKey()); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath(xhpcSettingConfig.getZfbAlipayCertPublicKeyRsa()); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath(xhpcSettingConfig.getZfbAlipayRootCert()); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); + + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/ + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/ + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + JSONObject bizContent = new JSONObject(); + bizContent.put("trade_no", rechargeOrder.getAlipayNumber()); + bizContent.put("refund_amount", refundFee); + bizContent.put("out_request_no", orderNumber); + request.setBizContent(bizContent.toString()); + AlipayTradeRefundResponse response = alipayClient.certificateExecute(request); + if("Y".equals(response.getFundChange())){ + System.out.println("调用退款成功"); + paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); + addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee); + return R.ok(); + }else{ + //查询订单 + R r = alipayTradeFastpayRefundQuery(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number); + if(r.getCode()==200){ + paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); + addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee); + return R.ok(); + } + + } + Thread.sleep(1000); + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.writeLock().unlock();//释放锁 + } + return R.fail(); + } + + //阿里云统一收单交易退款查询 + public R alipayTradeFastpayRefundQuery(XhpcSettingConfig xhpcSettingConfig,XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,BigDecimal refundFee,String orderNumber,int number){ + try{ + AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",xhpcSettingConfig.getZfbAppId(),xhpcSettingConfig.getZfbPrivateKey(),"json","GBK",xhpcSettingConfig.getZfbAppCertPublicKey(),"RSA2"); + AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("trade_no", rechargeOrder.getAlipayNumber()); + bizContent.put("out_request_no", orderNumber); + request.setBizContent(bizContent.toString()); + AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request); + if(response.isSuccess() && "10000".equals(response.getCode()) && "REFUND_SUCCESS".equals(response.getRefundStatus())){ + System.out.println("调用成功"); + paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); + return R.ok(); + } else { + System.out.println("调用失败"); + //重新调用一次 + if(number==0){ + number++; + R r = getalipayTradeRefund(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number); + if(r.getCode() !=200){ + return R.fail(); + } + }else{ + System.out.println("第二次调用失败"); + return R.fail(); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + return R.fail(); + } + + //微信退款 + public R wxRefund(XhpcRefundOrder xhpcRefundOrder,BigDecimal refundFee){ + Map map =new HashMap<>(); + Date date = new Date(); + String endTime = DateUtil.formatDateTime(date); + LocalDateTime localDate = LocalDateTime.now().minusDays(363); + String startTime = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));//转为String类型 + Long refundOrderId = xhpcRefundOrder.getRefundOrderId(); + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE,xhpcRefundOrder.getTenantId()); + if(xhpcSettingConfig ==null){ + return R.fail(HttpStatus.ALREADY_EXISTING, "微信退款失败,请联系客服"); + } + List xhpcRechargeOrderList = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrderList(1, refundOrderId, startTime, endTime); + for (int i = 0; i =0){ + //全额退款 + if(refundFee.compareTo(amount)==0){ + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber,amount ,1); + if(wxTradeRefund.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1); + return R.ok(map); + } + } + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber,amount ,0); + if(wxTradeRefund.getCode()==200){ + refundFee =refundFee.subtract(amount); + map.put("refundFee",refundFee); + } + }else{ + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1); + if(wxTradeRefund.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1); + return R.ok(map); + } + } + }else{ + BigDecimal subtract = amount.subtract(xhpcRechargeOrder.getRefundFee()); + if(refundFee.compareTo(subtract)>=0){ + if(refundFee.compareTo(subtract)==0){ + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, subtract,1); + if(wxTradeRefund.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1); + return R.ok(map); + } + } + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, subtract,0); + if(wxTradeRefund.getCode()==200){ + refundFee =refundFee.subtract(subtract); + map.put("refundFee",refundFee); + } + }else{ + R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1); + if(wxTradeRefund.getCode()==200){ + updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1); + return R.ok(map); + } + } + } + } + return R.ok(map); + } + + public void paymentCallback(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,BigDecimal refundFee){ + BigDecimal amount = rechargeOrder.getAmount(); + //总共退款金额 + BigDecimal refundFeeAmount = refundFee.add(rechargeOrder.getRefundFee()); + //修改支付订单付款金额和转改 + if(amount.compareTo(refundFeeAmount)==0){ + //全部退完 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(rechargeOrder.getRechargeOrderId(),amount,2); + }else if(amount.compareTo(refundFeeAmount)>0){ + //退了一部分 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(rechargeOrder.getRechargeOrderId(),refundFeeAmount,1); + } + //修改用户金额 + Long userId = rechargeOrder.getUserId(); + Integer source = rechargeOrder.getSource(); + //增加用户流水记录 + xhpcUserAccountStatementService.add(xhpcRefundOrder.getRefundOrderId(), "-"+refundFee.toString(), userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,rechargeOrder.getTenantId()); + if(UserTypeUtil.USER_TYPE.equals(source)){ + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + BigDecimal surplus =new BigDecimal(balance).subtract(refundFee); + xhpcAppUser.setBalance(surplus); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + Map communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, rechargeOrder.getTenantId()); + BigDecimal surplus =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFee); + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,null); + } + } + + /** + * 修改订单状态 + * @param refundOrder + * @param refundFee 退款总金额 + * @param type 1成功 2失败 + * @param status 1微信 2支付宝 + */ + @Override + public void updateXhpcRefundOrder(XhpcRefundOrder refundOrder,BigDecimal refundFee,Integer type,Integer status){ + Long userId = refundOrder.getUserId(); + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + xhpcAppUser.setIsRefundApplication(0); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + if(type==1){ + refundOrder.setStatus(1); + refundOrder.setExamineStatus(1); + if(status==1){ + refundOrder.setRemark("微信退款成功"); + }else{ + refundOrder.setRemark("支付宝退款成功"); + } + }else{ + refundOrder.setStatus(2); + refundOrder.setExamineStatus(1); + if(status==1){ + refundOrder.setRemark("微信退款失败"); + }else{ + refundOrder.setRemark("支付宝退款失败"); + } + if(type ==2){ + try{ + //发送短信 + HashMap paramMap = new HashMap<>(); + paramMap.put("phone", appUserInfo.get("phone").toString()); + paramMap.put("content", "【小华充电】退款-尊敬的用户,当前退款人数较多,申请退款失败,请您重新提交申请!"); + smsService.sendNotice(paramMap); + }catch (Exception e){ + } + } + } + iXhpcRefundOrderService.update(refundOrder); + } + + //添加原路退回订单记录 + public void addXhpcRefundOriginalOrder(AlipayTradeRefundResponse response,XhpcRefundOrder refundOrder,XhpcRechargeOrder rechargeOrder,BigDecimal refundFee){ + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + xhpcRefundOriginalOrder.setUserId(refundOrder.getUserId()); + xhpcRefundOriginalOrder.setType(2); + xhpcRefundOriginalOrder.setSource(refundOrder.getSource()); + if("Y".equals(response.getFundChange())){ + xhpcRefundOriginalOrder.setStatus(1); + }else{ + xhpcRefundOriginalOrder.setStatus(2); + } + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("支付宝退款"); + xhpcRefundOriginalOrder.setTenantId(refundOrder.getTenantId()); + xhpcRefundOriginalOrder.setOutTradeNo(response.getOutTradeNo()); + xhpcRefundOriginalOrder.setTradeNo(response.getTradeNo()); + xhpcRefundOriginalOrder.setTotalFee(refundOrder.getAmount()); + xhpcRefundOriginalOrder.setSettlementTotalFee(refundFee); + xhpcRefundOriginalOrder.setBuyerUserId(response.getBuyerUserId()); + xhpcRefundOriginalOrder.setRefundOrderId(refundOrder.getRefundOrderId()); + xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId()); + xhpcRefundOriginalOrder.setCashRefundFee(refundFee); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + } + + //微信企业退款 + public R wxCheckOut(XhpcRefundOrder refundOrder,BigDecimal refundFee){ + + Long userId = refundOrder.getUserId(); + Integer source = refundOrder.getSource(); + Map appUserInfo = new HashMap<>(); + if(UserTypeUtil.USER_TYPE.equals(source)){ + appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); + } + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE,refundOrder.getTenantId()); + if(xhpcSettingConfig ==null){ + return R.fail(HttpStatus.ALREADY_EXISTING, "微信退款失败,请联系客服"); + } + CloseableHttpClient httpClient = null; + try { + //证书的地址 + httpClient = initCert(xhpcSettingConfig); + } catch (Exception e) { + e.printStackTrace(); + } + String orderOutNumber =refundOrder.getRefundOrderNumber(); + String openId = StringUtils.valueOf(appUserInfo.get("weixinOpenId")); + //Double amount = Double.parseDouble(StringUtils.valueOf(xhpcRefundOrder.get("amount"))); + //退款金额单位为分 + BigDecimal value = refundFee.multiply(new BigDecimal(100)); + Integer refund_fee = value.intValue(); + String result = ""; + HttpPost httpPost = new HttpPost(xhpcSettingConfig.getWxTransfersUrl()); + StringEntity postEntity = new StringEntity(qyXMLParam(orderOutNumber, refund_fee.toString(), "退款申请", openId,xhpcSettingConfig), "UTF-8"); + httpPost.addHeader("Content-Type", "text/xml"); + httpPost.setEntity(postEntity); + try { + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + } + HttpEntity entity = response.getEntity(); + try { + result = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } finally { + httpPost.abort(); + } + try{ + Map map = WXPayUtil.xmlToMap(result); + String result_code = map.get("result_code"); + if ("FAIL".equals(result_code)) { + refundOrder.setStatus(2); + refundOrder.setRemark(map.get("err_code_des").toString()); + updateXhpcRefundOrder(refundOrder,refundFee,2,1); + logger.info("++++++++++++审核失败原因++++++++++++++++"+map.get("err_code_des").toString()+"错误代码:"+map.get("err_code").toString()); + return R.fail(map.get("err_code_des")); + } else { + //退款成功修改订单 + if(UserTypeUtil.USER_TYPE.equals(source)){ + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + BigDecimal surplus =new BigDecimal(balance).subtract(refundFee); + xhpcAppUser.setBalance(surplus); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + Map communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); + BigDecimal surplus =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFee); + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,null); + } + refundOrder.setStatus(1); + refundOrder.setRemark("微信零钱退款成功"); + refundOrder.setPaymentNo(map.get("payment_no").toString()); + refundOrder.setPaymentTime(map.get("payment_time").toString()); + updateXhpcRefundOrder(refundOrder,refundFee,1,1); + + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + xhpcRefundOriginalOrder.setUserId(refundOrder.getUserId()); + xhpcRefundOriginalOrder.setType(3); + xhpcRefundOriginalOrder.setSource(refundOrder.getSource()); + xhpcRefundOriginalOrder.setStatus(1); + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("微信零钱退款"); + xhpcRefundOriginalOrder.setTenantId(refundOrder.getTenantId()); + xhpcRefundOriginalOrder.setTradeNo(orderOutNumber); + xhpcRefundOriginalOrder.setTotalFee(refundFee); + xhpcRefundOriginalOrder.setSettlementTotalFee(refundFee); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrder.setCashRefundFee(refundFee); + xhpcRefundOriginalOrder.setBuyerUserId(openId); + xhpcRefundOriginalOrder.setRefundOrderId(refundOrder.getRefundOrderId()); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + //查询以前充值记录 + logger.info("===微信=======查询以前充值记录========="); + //增加用户流水记录 + xhpcUserAccountStatementService.add(refundOrder.getRefundOrderId(), "-"+refundFee, userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,refundOrder.getTenantId()); + Date date = new Date(); + String createTime = DateUtil.formatDateTime(date); + List totalMoneyList = xhpcRefundOriginalOrderMapper.getTotalMoneyList(userId, source,createTime); + for (int i = 0; i 0){ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFee,1); + }else{ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + break; + } + }else{ + BigDecimal refundFeeAmount = amount.subtract(xhpcRechargeOrder.getRefundFee()); + if(refundFeeAmount.compareTo(refundFee)>0){ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFee,1); + }else{ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + break; + } + } + } + return R.ok("退款成功"); + } + }catch (Exception e){ + e.printStackTrace(); + } + refundOrder.setStatus(2); + refundOrder.setRemark("审核异常"); + updateXhpcRefundOrder(refundOrder,refundFee,2,1); + return R.fail(); + } + + //支付宝零钱退款 + public R zhbCheckOut(XhpcSettingConfig xhpcSettingConfig,XhpcRefundOrder refundOrder,BigDecimal refundFee){ + try { + Long userId = refundOrder.getUserId(); + Integer source = refundOrder.getSource(); + Map appUserInfo = new HashMap<>(); + if(UserTypeUtil.USER_TYPE.equals(source)){ + appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); + } + String phone=appUserInfo.get("phone").toString(); + String uid = StringUtils.valueOf(appUserInfo.get("alipayOpenId")); + String orderNumber = "alipay" + DateUtils.timePath(); + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl(xhpcSettingConfig.getZhbServerUrl()); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId(xhpcSettingConfig.getZfbAppId()); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(xhpcSettingConfig.getZfbPrivateKey()); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath(xhpcSettingConfig.getZfbAppCertPublicKey()); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath(xhpcSettingConfig.getZfbAlipayCertPublicKeyRsa()); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath(xhpcSettingConfig.getZfbAlipayRootCert()); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); + + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/ + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/ + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + /** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/ + model.setOutBizNo(orderNumber); + /** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/ + String money = refundFee.toString(); + model.setTransAmount(money); + /** 产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/ + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + /** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/ + model.setBizScene("DIRECT_TRANSFER"); + /** 转账业务的标题,用于在支付宝用户的账单里显示 **/ + model.setOrderTitle("转账标题"); + Participant participant = new Participant(); + /** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/ + participant.setIdentity(uid); + /** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID **/ + participant.setIdentityType("ALIPAY_USER_ID"); + model.setPayeeInfo(participant); + /** 业务备注 **/ + String orderOutNumber = StringUtils.valueOf(refundOrder.getRefundOrderNumber()); + model.setRemark("单笔转账--"+orderOutNumber); + request.setBizModel(model); + AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/ + if (response.isSuccess()) { + //退款成功修改订单 + if(UserTypeUtil.USER_TYPE.equals(source)){ + Map appUserInfo1 = xhpcUserAccountStatementMapper.appUserInfo(userId); + if (StringUtils.isNotNull(appUserInfo1)) { + String balance1 = StringUtils.valueOf(appUserInfo1.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + BigDecimal surplus1 =new BigDecimal(balance1).subtract(refundFee); + xhpcAppUser.setBalance(surplus1); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + } + }else{ + Map communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); + BigDecimal surplus1 =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFee); + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus1,null); + } + logger.info("===================11111111==================="); + //增加用户流水记录 + xhpcUserAccountStatementService.add(refundOrder.getRefundOrderId(), "-"+refundFee, userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,refundOrder.getTenantId()); + + refundOrder.setStatus(1); + refundOrder.setRemark("支付宝退款成功"); + refundOrder.setOrderId(response.getOrderId()); + refundOrder.setPayFundOrderId(response.getPayFundOrderId()); + refundOrder.setTransPayTime(response.getTransDate()); + updateXhpcRefundOrder(refundOrder,refundFee,1,2); + logger.info("===================222222==================="); + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + xhpcRefundOriginalOrder.setUserId(refundOrder.getUserId()); + xhpcRefundOriginalOrder.setType(3); + xhpcRefundOriginalOrder.setSource(refundOrder.getSource()); + xhpcRefundOriginalOrder.setStatus(1); + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("支付宝零钱退款"); + xhpcRefundOriginalOrder.setTenantId(refundOrder.getTenantId()); + xhpcRefundOriginalOrder.setTradeNo(orderNumber); + xhpcRefundOriginalOrder.setTotalFee(refundFee); + xhpcRefundOriginalOrder.setSettlementTotalFee(refundFee); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrder.setCashRefundFee(refundFee); + xhpcRefundOriginalOrder.setBuyerUserId(uid); + xhpcRefundOriginalOrder.setRefundOrderId(refundOrder.getRefundOrderId()); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + logger.info("===================33333==================="); + //增加用户流水记录 + xhpcUserAccountStatementService.add(refundOrder.getRefundOrderId(), "-"+refundFee, userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,refundOrder.getTenantId()); + //查询以前充值记录 + Date date = new Date(); + String createTime = DateUtil.formatDateTime(date); + List totalMoneyList = xhpcRefundOriginalOrderMapper.getTotalMoneyList(userId, source,createTime); + for (int i = 0; i 0){ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFee,1); + }else{ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + break; + } + }else{ + BigDecimal refundFeeAmount = amount.subtract(xhpcRechargeOrder.getRefundFee()); + if(refundFeeAmount.compareTo(refundFee)>0){ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFee,1); + }else{ + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + break; + } + } + } + return R.ok("退款成功"); + }else{ + + } + }catch (Exception e){ + e.printStackTrace(); + logger.info("++++++++++++支付宝审核异常++++++++++++++++"+e.getMessage()); + } + return R.fail(); + } + + public static void main(String[] args) throws AlipayApiException { + String privateKey ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCw/+WnBJiVAqs2j4ghmQBYLH8dQY4mRD45ZhXlDJsNGkNap4uKCi1Q1UkNajWO949j4nZ+pDa0hCEIK4f8QQ/JBc+5PTGitRIKh5LUdk0KVBevivsfMZNhdvIJG2zcF5ht7q+MRnhUQvRDMVcEBTPCBWxSkjy+6sOat8yaP8/V1GzZ94Pz5WQpEgBKYwrabSvqtdk6OYw0wnhgbHfAcPi40+xtNazQvVAPKGb+EAq/qxFOxzuaZ4Al7ZZ2x/zNJorgxWMxXgolC8u71vLM35UThd+/CGFSls2BNl6cYRxdKllgTKD763gWwbkB9v0IgjsT0PtQNaWPqo3jahmdy/CdAgMBAAECggEATvb7R9X/FIuKQt8qBoMx6iR/2VeDyYKsmAL5RaSoD+Jlpi4VTNJZgTSGUNvPZScA67j+0GUGmuZPrkttcZa9KhvTnnq0iDhsAhKV6P+WQ0NdBc3lVvdRHyxnsrRvjolgUbsoylYuHLl6K/f5MCv5+VdeCkB/pVUrSv0w5KgPWv+Z+nOQuHzrNmUNJaAf8x4IFlrVD/rKcrhpWpe5PKQ1BJ9Sbr/+fxY+p+1810Rg27jVErznB8g2cAGAyihGKH++sz3x9Kk7nsZRJ0AjUUtqdN0RD+EBtAV4HRHXcbjfSpFtxqBC03Vt5FFp3g70m92GjU+NWZzQ9Wtn1IsFF8+S6QKBgQDik0pwokU3X6nA/EQXMee0jNMZK/V6BQ/eQMIa0LCAUL5L60FYPZGQQaQhrT29DEki4IstVkHxgLXsQ0vnATHDGbCpaGPGj9Ur+97fuC5PL+Uqxp/dQBwKiHAioE/MDWH8qPDm1cEsgony5NhZX0L/v7Du0VHiUVJcNIA0/1QudwKBgQDH/Gn6kx8nNOPmUtICmimAyNZx3CY+ytL65pYRmVrso++Hw2iT+XLmiWDbGiPacH3R9fLXpFgBe82pOTOetkcgUw/Y2FedeBelmjzxLwF6R/AEV2zB4O3qcBkKn6gqgmJsypFsDOlVWkLSbc4mmsgHES2P1sK/olTtDmnnrR56iwKBgHNwljnjA58d95CjN1IWFDcSlS+7DPxZfedAWWVuNK979CkcORPrcrHsL+MUsGMU0mKZw2+bBkg0yvwQoaiWHDOKcE8wJ73wZK1fTAPyhG3GOl3cC3GgC2l2cKPDyERwAR/JN8x01lKGRCDkZjLK7Yj+svhK4AyOYIcoHLZj7RErAoGAMIcotFxE//+OmdJZEbaVAaI6n1B7m1seTTHtEoIzFR9GvZwGYXnzjsuhTCmQr64CahOThQ5lKJ8BLeIqi4XRxp9BRi5hPF3q5w2BYkk0w5Z3QKZyRq2tLelbuj850G7pMVsKZLzRVhvcATISBz4h8c0SUEgd4+ChWRDZVBWnQrcCgYEAvStqps5r3RB1dk5gn3Ob32zPXu5ZxNJDaykcDK83LsaFf8PT/a6fpkLjaCZ4IT5pbXkD1pef5Gx9GSfygy0ceZzsJ/pWlqYYyLdtljU6gdJZhgoyI655nEhbpwsM0o3sjna4tkB/vdPKXqAfOKxp+yow9Al8usBkjEt8sI5MRro="; + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId("2021002156615717"); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(privateKey); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath("E:\\111\\appCertPublicKey.crt"); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath("E:\\111\\alipayCertPublicKey_RSA2.crt"); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath("E:\\111\\alipayRootCert.crt"); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); + + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/ + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/ + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + JSONObject bizContent = new JSONObject(); + bizContent.put("trade_no", "2023082322001456711412373759"); + bizContent.put("refund_amount", 2); + bizContent.put("out_request_no", "HZ01RF002"); + request.setBizContent(bizContent.toString()); + + AlipayTradeRefundResponse response = alipayClient.certificateExecute(request); + System.out.println("response>>>>>>"+response); + if(response.isSuccess()){ + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + + } +} diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/util/AESUtil.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/util/AESUtil.java new file mode 100644 index 00000000..093f0030 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/util/AESUtil.java @@ -0,0 +1,98 @@ +package com.xhpc.payment.util; + + + +import com.xhpc.common.core.utils.WXPayUtil; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.Security; +import java.util.Base64; + +/** + * @author yuyang + * @date 2023-08-25 15:30 + */ +public class AESUtil { + /** + * 密钥算法 + */ + private static final String ALGORITHM = "AES"; + + /** + * 加解密算法/工作模式/填充方式 + */ + private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding"; + + /** + * AES加密 + * + * @param data d + * @return str + * @throws Exception e + */ + public static String encryptData(String data) throws Exception { + // 创建密码器 + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); + SecretKeySpec key = new SecretKeySpec(WXPayUtil.MD5("sichuanxianghuakejiyouxiangongsi").toLowerCase().getBytes(), ALGORITHM); + // 初始化 + cipher.init(Cipher.ENCRYPT_MODE, key); + return base64Encode8859(new String(cipher.doFinal(data.getBytes()), "ISO-8859-1")); + + } + + /** + * AES解密 + * + * @param base64Data 64 + * @return str + * @throws Exception e + */ + public static String decryptData(String base64Data,String mchKey) throws Exception { + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); + SecretKeySpec key = new SecretKeySpec(WXPayUtil.MD5(mchKey).toLowerCase().getBytes(), ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key); + return new String(cipher.doFinal(base64Decode8859(base64Data).getBytes("ISO-8859-1")), "utf-8"); + } + + /** + * Base64解码 + * @param source base64 str + * @return str + */ + public static String base64Decode8859(final String source) { + String result = ""; + final Base64.Decoder decoder = Base64.getDecoder(); + try { + // 此处的字符集是ISO-8859-1 + result = new String(decoder.decode(source), "ISO-8859-1"); + } catch (final UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + + /** + * Base64加密 + * @param source str + * @return base64 str + */ + public static String base64Encode8859(final String source) { + String result = ""; + final Base64.Encoder encoder = Base64.getEncoder(); + byte[] textByte = null; + try { + //注意此处的编码是ISO-8859-1 + textByte = source.getBytes("ISO-8859-1"); + result = encoder.encodeToString(textByte); + } catch (final UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } + +} diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRechargeOrderMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRechargeOrderMapper.xml index 27434359..f4cca4ba 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRechargeOrderMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRechargeOrderMapper.xml @@ -133,7 +133,9 @@ create_by = #{createBy}, update_time = #{updateTime}, update_by = #{updateBy}, - remark = #{remark} + remark = #{remark}, + refund_fee = #{refundFee}, + refund_status = #{refundStatus} WHERE recharge_order_id = #{rechargeOrderId} diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundAuditMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundAuditMapper.xml index b747274e..d01622ee 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundAuditMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundAuditMapper.xml @@ -112,10 +112,10 @@ surplus_money as balance, avatar as avatar, status, - weixin_open_id as weixinlogin, - alipay_open_id as alipayLogin, - weixin_login as weixinOpenId, + weixin_login as weixinlogin, alipay_login as alipayLogin, + weixin_open_id as weixinOpenId, + alipay_open_id as alipayOpenId, tenant_id tenantId, del_flag delFlag, concat(2) as userType, @@ -124,4 +124,4 @@ from xhpc_community_personnel where community_personnel_id=#{userId} and tenant_id=#{tenantId} - \ No newline at end of file + diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOriginalOrderMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOriginalOrderMapper.xml new file mode 100644 index 00000000..da1f74c7 --- /dev/null +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOriginalOrderMapper.xml @@ -0,0 +1,447 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + refund_original_order_id, user_id, `type`, source,status, del_flag, create_time, create_by,update_time,update_by,remark,tenant_id,app_id,mch_id,nonce_str,transaction_id, + out_trade_no,trade_no,refund_id,out_refund_no,total_fee,settlement_total_fee,refund_fee,refund_status,success_time,refund_recv_accout,buyer_user_id,refund_account, + refund_request_source,cash_refund_fee,refund_order_id,recharge_order_id,last_one + + + + INSERT INTO xhpc_refund_original_order + + + user_id, + + + type, + + + source, + + + status, + + + del_flag, + + + create_time, + + + remark, + + + tenant_id, + + + app_id, + + + mch_id, + + + nonce_str, + + + transaction_id, + + + out_trade_no, + + + trade_no, + + + refund_id, + + + out_refund_no, + + + total_fee, + + + settlement_total_fee, + + + refund_fee, + + + refund_status, + + + success_time, + + + refund_recv_accout, + + + buyer_user_id, + + + refund_account, + + + refund_request_source, + + + cash_refund_fee, + + + refund_order_id, + + + recharge_order_id, + + + last_one, + + + + + #{userId}, + + + #{type}, + + + #{source}, + + + #{status}, + + + #{delFlag}, + + + #{createTime}, + + + #{remark}, + + + #{tenantId}, + + + #{appId}, + + + #{mchId}, + + + #{nonceStr}, + + + #{transactionId}, + + + #{outTradeNo}, + + + #{tradeNo}, + + + #{refundId}, + + + #{outRefundNo}, + + + #{totalFee}, + + + #{settlementTotalFee}, + + + #{refundFee}, + + + #{refundStatus}, + + + #{successTime}, + + + #{refundRecvAccout}, + + + #{buyerUserId}, + + + #{refundAccount}, + + + #{refundRequestSource}, + + + #{cashRefundFee}, + + + #{refundOrderId}, + + + #{rechargeOrderId}, + + + #{lastOne}, + + + + + update xhpc_refund_original_order + + + user_id=#{userId}, + + + type=#{type}, + + + source=#{source}, + + + status=#{status}, + + + del_flag=#{delFlag}, + + + create_time=#{createTime}, + + + remark= #{remark}, + + + tenant_id=#{tenantId}, + + + app_id=#{appId}, + + + mch_id=#{mchId}, + + + nonce_str=#{nonceStr}, + + + transaction_id=#{transactionId}, + + + out_trade_no=#{outTradeNo}, + + + trade_no=#{tradeNo}, + + + refund_id=#{refundId}, + + + out_refund_no=#{outRefundNo}, + + + total_fee=#{totalFee}, + + + settlement_total_fee=#{settlementTotalFee}, + + + refund_fee=#{refundFee}, + + + refund_status=#{refundStatus}, + + + success_time=#{successTime}, + + + refund_recv_accout=#{refundRecvAccout}, + + + buyer_user_id=#{buyerUserId}, + + + refund_account=#{refundAccount}, + + + refund_request_source=#{refundRequestSource}, + + + cash_refund_fee=#{cashRefundFee}, + + + refund_order_id=#{refundOrderId}, + + + recharge_order_id=#{rechargeOrderId}, + + + where refund_original_order_id = #{refundOriginalOrderId} + + + + + + + + + + + + + + + + + + + + diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml index 9a6cdc92..bf610537 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml @@ -162,7 +162,8 @@ UPDATE xhpc_app_user - balance = #{balance} + balance = #{balance}, + is_refund_application = #{isRefundApplication} WHERE app_user_id = #{appUserId} @@ -201,4 +202,4 @@ from xhpc_terminal where terminal_id =(select terminal_id from xhpc_charge_order where user_id = #{userId} and source=#{source} and tenant_id=#{tenantId} and status=0 and del_flag =0 limit 1) - \ No newline at end of file + diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java index 697ba685..19b26d32 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java @@ -398,7 +398,7 @@ public class ChargingController { public static void main(String[] args) { - Integer f70C0000 = HexUtils.reverseHexInt("16D6870400"); + Integer f70C0000 = HexUtils.reverseHexInt("0000"); System.out.println("f70C0000 转化成="+f70C0000); Integer f70C0001 = HexUtils.reverseHexInt("D8B68A0400"); @@ -406,16 +406,20 @@ public class ChargingController { Integer f70C0002 = HexUtils.reverseHexInt("C2E00200"); System.out.println("f70C0002 转化成="+f70C0002); + + String s = HexUtils.reverseHex("38C7280A1D0817"); + System.out.println("s 转化成="+s); // String s = toHexInt(3532); // System.out.println("3532 转化成BIN码="+s); // byte[] bytes = HexUtils.toBytes("80836000150001022305301518050003"); // System.out.println("String 转化成Byte[]="+ Arrays.toString(bytes)); // String msg = HexUtils.toHex(bytes); // System.out.println("Byte 转化成String="+ msg); - double vs = 76011030; - double v = vs / 10000; - DecimalFormat df = new DecimalFormat("#.000"); - System.out.println(df.format(v)); +// double vs = 76011030; +// double v = vs / 10000; +// DecimalFormat df = new DecimalFormat("#.000"); +// System.out.println(df.format(v)); + } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java index e742f838..717a4721 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java @@ -218,21 +218,25 @@ public class CP56Time2a { // System.out.println(String.format("--未编码--: %s", time)); // String hex = toCp56Hex(time); // System.out.println("--编码1--:" + hex); - System.out.println(HexUtils.toBinaryString("90E223133D0416")); - System.out.println("--下达1--:" + DateUtil.format(cp56toDate("38443B161D0416"), NORM_DATETIME_FORMATTER)); - System.out.println("--下达2--:" + DateUtil.format(cp56toDate("384A34171D0416"), NORM_DATETIME_FORMATTER)); - System.out.println("toCp56Hex = " + toCp56Hex(cp56toDate("C05D0D171F0116"))); -// System.out.println("--下达2--:" + DateUtil.format(cp56toDate(""), NORM_DATETIME_FORMAT)); - String dateStr = "2017-03-01 22:33:23"; - Date date = DateUtil.parse(dateStr); - Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2); - System.out.println("--变为--:" + newDate.toString()); - System.out.println("sudo date " + newDate.getTime()); +// System.out.println(HexUtils.toBinaryString("90E223133D0416")); +// System.out.println("--下达1--:" + DateUtil.format(cp56toDate("38443B161D0416"), NORM_DATETIME_FORMATTER)); +// System.out.println("--下达2--:" + DateUtil.format(cp56toDate("384A34171D0416"), NORM_DATETIME_FORMATTER)); +// System.out.println("toCp56Hex = " + toCp56Hex(cp56toDate("C05D0D171F0116"))); +//// System.out.println("--下达2--:" + DateUtil.format(cp56toDate(""), NORM_DATETIME_FORMAT)); +// String dateStr = "2017-03-01 22:33:23"; +// Date date = DateUtil.parse(dateStr); +// Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2); +// System.out.println("--变为--:" + newDate.toString()); +// System.out.println("sudo date " + newDate.getTime()); // System.out.println("--D0073211110815--:" + DateUtil.format(cp56toDate("D0073211110815"), NORM_DATETIME_FORMAT)); // System.out.println("--A85B3411110815--:" + DateUtil.format(cp56toDate("A85B3411110815"), NORM_DATETIME_FORMAT)); // String encode = encode(time); // System.out.println(String.format("--编码2--:%s", encode)); // System.out.println("--解码2--:" + decode(HexUtils.toBytes(encode))); + + String s = cp56toDateStr("B036360B1D0817"); + + System.out.println("-111-变为--:" + s); } } diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java index e58db135..f266520a 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java @@ -404,6 +404,7 @@ public class XhpcAppUserController extends BaseController { // auth_code 前端授权后得到的授权码 request.setCode(code); AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request); + System.out.println("response>>>>>>>>>>>>"+response.toString()); //服务端请求返回,RSA2密钥和公钥证书请求方式不同,如当面付 // RSA2密钥请求response = alipayClient.execute(request); // 公钥证书请求请求response = alipayClient.certificateExecute(request);