From 79f8fc87c9c9e4866a477dfe4485eedda5976209 Mon Sep 17 00:00:00 2001 From: jiangqs <jiangqs> Date: 星期二, 18 七月 2023 19:41:20 +0800 Subject: [PATCH] bug和企业微信同步 --- ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java | 178 ++++------ ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml | 2 ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml | 3 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/IdCardInfo.java | 1 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/ContactInfo.java | 3 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java | 19 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java | 5 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/HttpUtils.java | 337 +++++++++++++++++++ ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java | 73 ++++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/QiYeUtils.java | 39 ++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/HttpUtils.java | 3 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SubmitInfo.java | 5 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java | 6 ruoyi-modules/ruoyi-file/pom.xml | 7 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java | 6 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SystemScheduler.java | 20 + ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/staff/SysStaffServiceImpl.java | 55 +++ ruoyi-gateway/src/main/resources/bootstrap.yml | 2 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java | 84 ++++ ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java | 10 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/staff/SysStaffService.java | 10 ruoyi-auth/src/main/resources/bootstrap.yml | 2 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopAuthDto.java | 6 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/UboInfo.java | 33 + ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SalesSceneInfo.java | 3 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SchedulerUtils.java | 48 ++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthentication.java | 8 27 files changed, 844 insertions(+), 124 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java index 43f2194..9381a1c 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/SecurityConstant.java @@ -56,4 +56,9 @@ */ String PAY_MONEY_INTEGRAL = "PAY_MONEY_INTEGRAL"; + /** + * 用户验证码前缀key + */ + String QY_TOKEN = "QY_TOKEN"; + } diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java index 6c749ca..b975a1e 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java @@ -37,8 +37,11 @@ @Autowired private TokenService tokenService; - @Value("${h5.redirectUriBase}") - private String redirectUriBase; + @Value("${h5.redirectMerchantUriBase}") + private String redirectMerchantUriBase; + + @Value("${h5.redirectEmployeeUriBase}") + private String redirectEmployeeUriBase; /** @@ -51,7 +54,17 @@ @ApiOperation("构造网页授权链接") public R<OauthUrlVo> oauthUrl(@ApiParam(value = "授权重定向地址", required = true) @RequestParam("redirectUri") String redirectUri) throws UnsupportedEncodingException { // 普通应用 - redirectUri = redirectUriBase + redirectUri; + redirectUri = redirectMerchantUriBase + redirectUri; + String oauthRedirectUrl = URLEncoder.encode(redirectUri,"utf-8"); + String oauthUrl = qywxInnerService.getOauthUrl(oauthRedirectUrl); + return R.ok(new OauthUrlVo(oauthUrl)); + } + + @GetMapping({"/h5/oauthStaffUrl"}) + @ApiOperation("构造网页授权链接") + public R<OauthUrlVo> oauthStaffUrl(@ApiParam(value = "授权重定向地址", required = true) @RequestParam("redirectUri") String redirectUri) throws UnsupportedEncodingException { + // 普通应用 + redirectUri = redirectEmployeeUriBase + redirectUri; String oauthRedirectUrl = URLEncoder.encode(redirectUri,"utf-8"); String oauthUrl = qywxInnerService.getOauthUrl(oauthRedirectUrl); return R.ok(new OauthUrlVo(oauthUrl)); diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 650d4e1..8439e22 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -34,3 +34,5 @@ suiteSecret: "" token: "" encodingAESKey: "" + + diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index f6fe55b..fdae1b6 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -13,7 +13,7 @@ cloud: nacos: discovery: - # 服务注册地址cd ../a + # 服务注册地址 #server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 config: diff --git a/ruoyi-modules/ruoyi-file/pom.xml b/ruoyi-modules/ruoyi-file/pom.xml index c2c31bb..2e1dc38 100644 --- a/ruoyi-modules/ruoyi-file/pom.xml +++ b/ruoyi-modules/ruoyi-file/pom.xml @@ -73,6 +73,13 @@ <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.1</version> </dependency> + + <!-- 微信图片上传 --> + <dependency> + <groupId>com.github.wechatpay-apiv3</groupId> + <artifactId>wechatpay-apache-httpclient</artifactId> + <version>0.4.9</version> + </dependency> </dependencies> diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java index 29f5c50..345b2ad 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java @@ -5,6 +5,19 @@ import com.ruoyi.file.service.ISysFileService; import com.ruoyi.file.utils.OBSUploadUtils; import com.ruoyi.system.api.domain.poji.sys.SysFile; +import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; +import com.wechat.pay.contrib.apache.httpclient.WechatPayUploadHttpPost; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; +import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +26,10 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.net.URI; +import java.security.PrivateKey; import java.util.ArrayList; import java.util.List; @@ -25,6 +42,15 @@ public class SysFileController { private static final Logger log = LoggerFactory.getLogger(SysFileController.class); + + private final static String PRIVATE_KEY = ""; + + private final static String MCH_ID = ""; + + private final static String MCH_SERIAL_NO = ""; + + private final static String API_V3_KEY = ""; + @Autowired private ISysFileService sysFileService; @@ -85,4 +111,51 @@ } return R.ok(urls); } + + + + /** + * @description 创建httpClient + * @author jqs + * @date 2023/6/19 12:50 + * @param + * @return CloseableHttpClient + */ + private CloseableHttpClient createHttpClient() throws Exception { + + String privateKey = PRIVATE_KEY; + String mchId = MCH_ID; + String mchSerialNo = MCH_SERIAL_NO; + String apiV3Key = API_V3_KEY; + // 加载商户私钥(privateKey:私钥字符串) + PrivateKey merchantPrivateKey = PemUtil + .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); + + // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥) + AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( + new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8")); + + // 初始化httpClient + CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create() + .withMerchant(mchId, mchSerialNo, merchantPrivateKey) + .withValidator(new WechatPay2Validator(verifier)).build(); + return httpClient; + } + + @PostMapping("uploadWXFile") + public R<String> uploadWXFile(@RequestPart("file")MultipartFile file) throws Exception { + URI uri = new URI("https://api.mch.weixin.qq.com/v3/merchant/media/upload"); + CloseableHttpClient httpClient = createHttpClient(); + InputStream inputStream = file.getInputStream(); + String sha256 = DigestUtils.sha256Hex(inputStream); + HttpPost request = new WechatPayUploadHttpPost.Builder(uri) + .withImage(file.getName(), sha256, inputStream) + .build(); + CloseableHttpResponse response = httpClient.execute(request); + HttpEntity entity = response.getEntity(); + String s = EntityUtils.toString(entity); + System.out.println(s); + return R.ok(s); + } + } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java index f0095d6..eb3e653 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java @@ -179,8 +179,8 @@ if(checkTime.compareTo(activityStartTime)>0){ String activityId = activity.getActivityId(); long currentTimeMillis = System.currentTimeMillis(); - long startTimeDifference = currentTimeMillis - activityStartTime.getTime(); - long endTimeDifference = currentTimeMillis - activityEndTime.getTime(); + long startTimeDifference = activityStartTime.getTime() - currentTimeMillis; + long endTimeDifference = activityEndTime.getTime() - currentTimeMillis; // 查询延时任务 DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId).getData(); // 如果延时任务为空,创建延时任务控制活动定时开始和结束 @@ -194,7 +194,7 @@ remoteConfigService.addDelayTask(startDelayTask); } // 查询延时任务 - DelayTask endDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId).getData(); + DelayTask endDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_END_TASK.getCode() + "-" + activityId).getData(); // 如果延时任务为空,创建延时任务控制活动定时开始和结束 if (endDelayTask == null) { redisService.setCacheObject(DelayTaskEnum.ACTIVITY_END_TASK.getCode() + "-" + activityId, activityEndTime, endTimeDifference, TimeUnit.MILLISECONDS); @@ -427,8 +427,8 @@ Date activityStartTime = activity.getActivityStartTime(); Date activityEndTime = activity.getActivityEndTime(); long currentTimeMillis = System.currentTimeMillis(); - long startTimeDifference = currentTimeMillis - activityStartTime.getTime(); - long endTimeDifference = currentTimeMillis - activityEndTime.getTime(); + long startTimeDifference = activityStartTime.getTime() - currentTimeMillis; + long endTimeDifference = activityEndTime.getTime() - currentTimeMillis; // 查询延时任务 DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.ACTIVITY_START_TASK.getCode() + "-" + activityId).getData(); // 如果延时任务为空,创建延时任务控制活动定时开始和结束 diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml index d24638a..b1d4469 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml @@ -189,7 +189,7 @@ INNER JOIN t_goods tg ON tag.goods_id = tg.goods_id LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1 LEFT JOIN t_shop_goods tsg ON tg.goods_id = tsg.goods_id AND tsg.shop_id = #{shopId} - WHERE tag.activity_id = #{activityId} AND tg.del_flag = 0 AND tg.goods_status = 1 + WHERE tag.del_flag = 0 AND tag.activity_id = #{activityId} AND tg.del_flag = 0 AND tg.goods_status = 1 ORDER BY tag.sales_number DESC, tg.create_time DESC LIMIT 6 </select> diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/HttpUtils.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/HttpUtils.java index 84144c1..1c13a20 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/HttpUtils.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/HttpUtils.java @@ -22,7 +22,6 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; @@ -41,8 +40,6 @@ public class HttpUtils { public static void main(String[] args) { - BigDecimal payMoney = BigDecimal.valueOf(0.73); - System.out.println(BigDecimal.ZERO.compareTo(payMoney)); } diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml index 487cb03..2ff23a1 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml @@ -267,6 +267,9 @@ FROM t_order toc INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id WHERE toc.del_flag = 0 + <if test="param.userId != null"> + AND toc.user_id = #{param.userId} + </if> <if test="param.orderStatus != null"> AND toc.order_status = #{param.orderStatus} </if> diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java index 8857783..575fc15 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtEditShopDto.java @@ -45,6 +45,12 @@ @ApiModelProperty(value="店主联系方式") private String shopownerPhone; + @ApiModelProperty(value="签约省区域") + private String signProvinceCode; + + @ApiModelProperty(value="签约市区域") + private String signCityCode; + @ApiModelProperty(value="签约区域") private String signAreaCode; diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopAuthDto.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopAuthDto.java index 580bdf3..e7793e3 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopAuthDto.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtShopAuthDto.java @@ -99,6 +99,12 @@ */ @ApiModelProperty(value = "法人身份证背面") private String lpIcBack; + + @ApiModelProperty(value = "法人手机号") + private String lpMobilePhone; + + @ApiModelProperty(value = "法人邮箱") + private String lpContactEmail; /** * 结算账户类型1对公2对私 */ diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthentication.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthentication.java index 4144d92..cd69a29 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthentication.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/pojo/shop/ShopAuthentication.java @@ -126,6 +126,14 @@ */ @TableField("lp_ic_back") private String lpIcBack; + + + @TableField("lp_mobile_phone") + private String lpMobilePhone; + + @TableField("lp_contact_email") + private String lpContactEmail; + /** * 结算账户类型1对公2对私 */ diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java index c1cba5f..1d25532 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/MgtShopInfoVo.java @@ -40,6 +40,12 @@ @ApiModelProperty(value="店主联系方式") private String shopownerPhone; + @ApiModelProperty(value="签约省区域") + private String signProvinceCode; + + @ApiModelProperty(value="签约市区域") + private String signCityCode; + @ApiModelProperty(value="签约区域") private String signAreaCode; diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java index eeeacc4..264d788 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java @@ -19,6 +19,8 @@ import com.ruoyi.shop.service.task.MemberTaskService; import com.ruoyi.shop.service.task.ShopFileService; import com.ruoyi.shop.service.task.ShopTaskService; +import com.ruoyi.shop.util.WxShopUtils; +import com.ruoyi.shop.util.dto.*; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.config.SysTag; @@ -918,9 +920,91 @@ @Override public void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto){ ShopAuthentication shopAuthentication = shopAuthenticationService.getById(mgtShopAuthDto.getAuthId()); + Shop shop = this.getByShopId(shopAuthentication.getShopId()); + String applyNumber = IdUtils.simpleUUID(); BeanUtils.copyProperties(mgtShopAuthDto , shopAuthentication); + shopAuthentication.setApplyNumber(applyNumber); shopAuthentication.setAuditStatus(3); shopAuthenticationService.saveOrUpdate(shopAuthentication); + //生成提交类 + SubmitInfo submitInfo = new SubmitInfo(); + submitInfo.setOut_request_no(applyNumber); + if(shopAuthentication.getMainType()==2){ + submitInfo.setOrganization_type("2"); + }else{ + submitInfo.setOrganization_type("4"); + } + //营业执照 + BusinessLicenseInfo business_license_info = new BusinessLicenseInfo(); + business_license_info.setBusiness_license_copy(shopAuthentication.getBlImage()); + business_license_info.setBusiness_license_number(shopAuthentication.getBlNumber()); + business_license_info.setMerchant_name(shopAuthentication.getBlShopName()); + business_license_info.setLegal_person(shopAuthentication.getBlCorporateName()); + business_license_info.setCompany_address(shopAuthentication.getBlRegisteredAddress()); + business_license_info.setBusiness_time(shopAuthentication.getBlBusinessDeanline()); + submitInfo.setBusiness_license_info(business_license_info); + //法人证件 + submitInfo.setId_doc_type("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); + IdCardInfo id_card_info = new IdCardInfo(); + id_card_info.setId_card_copy(shopAuthentication.getLpIcFront()); + id_card_info.setId_card_national(shopAuthentication.getLpIcBack()); + id_card_info.setId_card_name(shopAuthentication.getLpCorporateName()); + id_card_info.setId_card_number(shopAuthentication.getLpIdCard()); + id_card_info.setId_card_valid_time_begin(shopAuthentication.getLpIcStartDate()); + id_card_info.setId_card_valid_time(shopAuthentication.getLpIcEndDate()); + submitInfo.setId_card_info(id_card_info); + //企业填写 + if(shopAuthentication.getMainType()==2){ + submitInfo.setOwner(true); + List<UboInfo> ubo_info_list = new ArrayList<>(); + UboInfo uboInfo = new UboInfo(); + uboInfo.setUbo_id_doc_type("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); + uboInfo.setUbo_id_doc_copy(shopAuthentication.getUboIcFront()); + uboInfo.setUbo_id_doc_copy_back(shopAuthentication.getUboIcBack()); + uboInfo.setUbo_id_doc_name(shopAuthentication.getUboName()); + uboInfo.setUbo_id_doc_number(shopAuthentication.getUboIdCard()); + uboInfo.setUbo_id_doc_address(shopAuthentication.getUboIcAddress()); + uboInfo.setUbo_id_doc_period_begin(shopAuthentication.getUboIcStartDate()); + uboInfo.setUbo_id_doc_period_end(shopAuthentication.getUboIcEndDate()); + ubo_info_list.add(uboInfo); + submitInfo.setUbo_info_list(ubo_info_list); + } + //结算账户信息 + AccountInfo accountInfo = new AccountInfo(); + if(shopAuthentication.getSettlementAccountType().equals("1")){ + accountInfo.setBank_account_type("74"); + }else{ + accountInfo.setBank_account_type("75"); + } + accountInfo.setAccount_bank(shopAuthentication.getSaBank()); + accountInfo.setAccount_name(shopAuthentication.getSaAccountName()); + accountInfo.setBank_address_code(shopAuthentication.getSaBankCityCode()); + accountInfo.setBank_name(shopAuthentication.getSaBankName()); + accountInfo.setAccount_number(shopAuthentication.getSaNumber()); + submitInfo.setAccount_info(accountInfo); + ContactInfo contactInfo = new ContactInfo(); + contactInfo.setContact_type("65"); + contactInfo.setContact_name(shopAuthentication.getLpCorporateName()); + contactInfo.setContact_id_card_number(shopAuthentication.getLpIdCard()); + contactInfo.setMobile_phone(shopAuthentication.getLpMobilePhone()); + contactInfo.setContact_email(shopAuthentication.getLpContactEmail()); + submitInfo.setContact_info(contactInfo); + //店铺信息 + SalesSceneInfo salesSceneInfo = new SalesSceneInfo(); + salesSceneInfo.setStore_name(shop.getShopName()); + salesSceneInfo.setStore_url(""); + salesSceneInfo.setStore_qr_code(""); + submitInfo.setSales_scene_info(salesSceneInfo); + submitInfo.setMerchant_shortname(shop.getShopName()); + submitInfo.setBusiness_addition_pics(shopAuthentication.getBaPics()); + submitInfo.setBusiness_addition_desc(shopAuthentication.getBaDesc()); + //提交审核 + try { + WxShopUtils.ApplymentSubMch(submitInfo); + } catch (Exception e) { + throw new RuntimeException(e); + } + } /** diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java index 97e9a57..010581b 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WxShopUtils.java @@ -6,12 +6,15 @@ import com.ruoyi.shop.util.dto.IdCardInfo; import com.ruoyi.shop.util.dto.SubmitInfo; import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; -import com.wechat.pay.contrib.apache.httpclient.auth.*; -import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager; +import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier; +import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; +import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; import com.wechat.pay.contrib.apache.httpclient.exception.HttpCodeException; import com.wechat.pay.contrib.apache.httpclient.exception.NotFoundException; import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; @@ -19,7 +22,6 @@ import javax.crypto.Cipher; import java.io.ByteArrayInputStream; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -40,84 +42,57 @@ public class WxShopUtils { - public void ApplymentSubMch() throws Exception { + private final static String PRIVATE_KEY = ""; + + private final static String MCH_ID = ""; + + private final static String MCH_SERIAL_NO = ""; + + private final static String API_V3_KEY = ""; + + + /** + * @description 创建httpClient + * @author jqs + * @date 2023/6/19 12:50 + * @param + * @return CloseableHttpClient + */ + private static CloseableHttpClient createHttpClient() throws NotFoundException, IOException, GeneralSecurityException, HttpCodeException { + + String privateKey = PRIVATE_KEY; + String mchId = MCH_ID; + String mchSerialNo = MCH_SERIAL_NO; + String apiV3Key = API_V3_KEY; + // 加载商户私钥(privateKey:私钥字符串) + PrivateKey merchantPrivateKey = PemUtil + .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); + + // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥) + AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier( + new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8")); + + // 初始化httpClient + CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create() + .withMerchant(mchId, mchSerialNo, merchantPrivateKey) + .withValidator(new WechatPay2Validator(verifier)).build(); + return httpClient; + } + + public static void ApplymentSubMch(SubmitInfo submitInfo) throws Exception { // 初始化httpClient CloseableHttpClient httpClient = createHttpClient(); //请求URL - HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/"); + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/ecommerce/applyments/"); // 请求body参数 - String reqdata = "{" - + "\"business_info\": {" - + "\"merchant_shortname\":\"上海XXX有限公司\"," - + "\"service_phone\":\"139XXXX\"," - + "\"sales_info\": {" - + "\"mini_program_info\": {" - + "\"mini_program_pics\": [" - + "\"0\":\"F8O5MNAOlYZyxZcLnWXkyk72coZ3CVX3XobPZng-xepKPTrcH_XMfrGGYLi1XFogMG9P25LSUX6gjXU5iPI74YqiRUDfORyw2d76wK3vzuQ\"" - + "]," - + "\"mini_program_sub_appid\":\"wx76c3f74c108876c2\"" - + "}," - + "\"mp_info\": {" - + "\"mp_pics\": [" - + "\"0\":\"F8O5MNAOlYZyxZcLnWXkys5TBxf0dyfesnyfNuquBMArHRfgCq8hDRdscDpblCcEgvgV5MkVch9IBEX7aatZCmI8k5Wdb_M8a4bYcmlg6V8\"" - + "]," - + "\"mp_sub_appid\":\"wx85c88c63bd22651f\"" - + "}," - + "\"sales_scenes_type\": [" - + "\"0\":\"SALES_SCENES_MP\"," - + "\"1\":\"SALES_SCENES_MINI_PROGRAM\"" - + "]" - + "}" - + "}," - + "\"subject_info\": {" - + "\"business_license_info\": {" - + "\"legal_person\":\"江XX\"," - + "\"license_copy\":\"F8O5MNAOlYZyxZcLnWXkysZ5xo8fE3SHJ1pHUe6OJKmNIWtqUVyv4aY2-JLTgjDOSovWaKkBu3AbkjGuQXhesDzREu2pT_Yf_hxlFKPJMwQ\"," - + "\"merchant_name\":\"上海XXX有限公司\"," - + "\"license_number\":\"91310118MA1JXXXX\"" - + "}," - + "\"subject_type\":\"SUBJECT_TYPE_ENTERPRISE\"," - + "\"identity_info\": {" - + "\"owner\":true," - + "\"id_doc_type\":\"IDENTIFICATION_TYPE_IDCARD\"," - + "\"id_card_info\": {" - + "\"id_card_copy\":\"F8O5MNAOlYZyxZcLnWXkyvLpqoz7MNRULxju0NqUCtLGBl_vm8Bhj9uAyuLyDART9UsA10spF9gbT3DEoM85HxPQOhMuilK0zLtOxAjPx58\"," - + "\"card_period_end\":\"2035-12-28\"," - + "\"card_period_begin\":\"2015-12-28\"," - + "\"id_card_name\":\"JRMJGA7B7oSVS+krFeaQn4AvYZE2LL9tTwA+XXa9lYJU4AhS+Qheb7fhgo+D+hfa0v+ykU1BVvVo7NpCfgOYQqmYDyYF27Q/p4hB7IoqZLhJUE+hTG45VNoa9ASaKG79Hg+eGz4YTIHFGMFm1ljyg4fd5lGJixCqn38/gCfwm5x6vDOMVkFpqbUdR7klQwReGoG7iSlEpr4gZPqzItcBHiuXidMToKZTX1Lol1Lx52DHk0blcdh1CMRhv+wxQzF0lJMy/WtVyjKuB8daDbLJKTEwDx5KfkTZGHmGiaJnWY0qFX03sXsufvfB0Wj6Z37+nJnV16fplPmdr1/KEHamLw==\"," - + "\"id_card_national\":\"F8O5MNAOlYZyxZcLnWXkyvcmQrkBXCIo2vZGUoM6ER-skL5k6IOhzeJ34tNNUggQIPfJbM_pzdg9jM4pQbkIm84_bKfi2JKNn99xIurNgwI\"," - + "\"id_card_number\":\"V0quwnIu/PLbdQQ3/nzMqjvHtChDqed4Jpc3Iy2lgnFoWVNXguRWBHMYKHaLgLvnxLvO6TciMnrSw13QzUJD4ZnEIiks8gGTd+OCzl5Jl3F+sneQ+Js4akBnCSBQso/SERvi6vUqCeRhX1vtiFsmKtqlL8r/ssrFev4FoJEka5gGME1osTgcpMMTIR8rolIO1oXbl3e8z5RDics5xKH2Ogjzis73yq9M18ap0uRRdLWoX/cxeG3tbU1bi5jZsAU9hGHXs4BKTaHfrslsKIkqXR0f2Jpk7H5qtwAyP8glcALN7gB5DIOmBEIZ5zx2PrDm38CsZHstu0hF8beXV/PG2w==\"" - + "}" - + "}" - + "}," - + "\"business_code\":\"20201126100507000003\"," - + "\"contact_info\": {" - + "\"contact_name\":\"AD2jwe8eYFYfeoSmBpyRYUawyQgQkUoAajOlHnQM/JzproDF7hikLDouMr5Mb1W5otvdJZYEipG0HzwLpG9NXbqP6SXSpzQFb8fY5cpuXZsIbDy70lAybF0bbxJiJw1PHSd7KpMbu0XHqwlicePLUOw7HCNV6euQsKEvtusiWsaVrNNdKXpj3ONhyAg2ws4ibc56GUVoNll3osmGLPi6/bIn3pD6sjNThgPE9UzRQax0XPwgIpafIewQiVy0GNtv5P33wqPa9pAsdEmaLXNtQr2Ddjw5SYMInen1qbVO8NP0VhuWmYiAjd1WbkNnR+gbwsilBCYYeRuFbKfqatASnA==\"," - + "\"mobile_phone\":\"GLc5+TuqJbxLeQO+CrKeDWF+7lZq9IsidIU4zcMpus4qsE8r1qNyvVMjrZfWLrjOItiQhXqkiKZs0B4M0UWAviWwmBhNWW0BJrauBjZbGZU+pLHC/2eOetdDC4sQqHN7Xw0N4tizqeQNu49n+DbSiv0TL09EcmNUUV9rImfjpVyo77MxKhPvdg3ODwS+IVvY2Tc9q11iBgaPIQ+XwoBaJGth1wdw0GLgEFUmX02TWxjHxq7f5O1RU3LjBlt1O+56ZZYpA+zr+IjQ/TwrIDp+4nk9v1oW2wtHuwrdqKrlLyJ1/zdoqwSddLuGxp8PwSM8CKobQP8TXhJu0S9pwLbNyg==\"," - + "\"contact_id_number\":\"iC35X6SaOx4A4BEJ4fmM2oOkYRO5rEzRh2QRdrxFD3+HwmNjxddsm1LoqfhSiV34DAO2x3Ded3q2c1LJ7NHqa3/IGCDss4FKlgIyiu5AmzQTTYwsobmvVFxeSUXA4PnH/tUTfatJOuj+9Emt7fmnpO9uWeCLIn5CXaaABrXpO4mUu8qPBaoF2jTfbwBm6QiYX58kATyRrIvBRs6VorHJydXkz3P1hCejh8sAYoJXlNHnoajI+NEwiWX9RhwUadYLbMwww68cc7Yzehp3s6an0NWuC76Y4e7FQ/i5D9ZpUvLKUoYfFsZMnHrv/PhLxmv5l8gQs9/IkmOdYfRujKZJwQ==\"," - + "\"contact_email\":\"ggK2ABtJ8bBiBo1iM7I6R2yEvhD6WC96d07gthnPGajc4lBCKpIqXjyNX8B97vc0OilyLRNUcySbT/KUejPyu4x9W6Ok6iS4zcerfKfIQkKs+3JXIMo0bu+GyI5O0fzRrPg1Mek2okfIjVK9wiTNJTzoGyz9twMXEaqqrOTbysyhnkqfrol5dad/TPg8qNWaBO3+Ma/hr1Tr0xeHWkKX3mBySC3NW49HM51x0PvFAwnStHr/8hiGzGpqAA3yJuYdlEwey3Lv+/bMmbTq+AyrYq9xX3q+n0VHuiSnzgICPwQiP4zXsoivA0bm7DSgcP1Oa6MjpGqMOS7AU1dHyak2GQ==\"" - + "}," - + "\"bank_account_info\": {" - + "\"account_number\":\"Bfu6CzrRWlVTLZwjEK2CCXG0KRfGoIsbYs9IYmtFcV9FTEVLCcVCRGW6DVE2hMMr7U9tSdo7QqsptXZ7Zhciandyx9kRkY/VmPywurySvCbqpOLbx3AgmQY7H6/Ye542R0uloi6Pdp5FjqY/TdnlDcTS4cqv9iqU0DqKAUt7q+L6jZ8lrSlGFPI/1RkXCGAhlTSZ/iAJYDWzcN/E0cno9BQPYCmEIWldzj7W3Tmhi1eaZYX5mlLWnTOuVmMsRXIehb4y6LCi6T0kS7/c3GOFwlTzHVaaUgFqZhOL00h2G4Cl94uZfuVNO7KTiFaWtV61muEN6JfaSnFwRDSHxhtsRg==\"," - + "\"bank_address_code\":\"310101\"," - + "\"account_name\":\"RVBRWZKlmzrjkDmz4uEkaLQLU5q5xErXGoWhzDNdnQjRlfn1NVHL2EtIE+B0BULFNOHrX61q13lcgo9CDal9YJ/LjZkzAAsivwJZpNSRZbAsNNjqbYiiVhdnxYpwMqtukVgZAFgx0XMovOeSGX1+Dosc2vKJSsxtUw6wJXcZbMjvsX5/xamFTvRIx1J2a/q3ODBJ9URO5O2FDhGwLx8LQnFIv7xUDM3JXw7c6+eNy1OYTVwlj3/MIDQVw2eiPjpG1vC6K6PRwCI4wFZk1QwH99Xa3Wwvf+ek54j7FQTh0N703dK6jjonL5L6Lh9ZsckLx45InkARlPnU0KQpoK5g9w==\"," - + "\"bank_account_type\":\"BANK_ACCOUNT_TYPE_CORPORATE\"," - + "\"account_bank\":\"招商银行\"" - + "}," - + "\"settlement_info\": {" - + "\"settlement_id\":\"716\"," - + "\"qualification_type\":\"零售批发/生活娱乐/网上商城/其他\"" - + "}" - + "}"; + String reqdata = convertToStr(submitInfo); StringEntity entity = new StringEntity(reqdata,"utf-8"); entity.setContentType("application/json"); httpPost.setEntity(entity); httpPost.setHeader("Accept", "application/json"); - httpPost.setHeader("Wechatpay-Serial", "XXXXXXXXXXXXXX"); //完成签名并执行请求 CloseableHttpResponse response = httpClient.execute(httpPost); - try { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { //处理成功 @@ -129,48 +104,36 @@ throw new IOException("request failed"); } } finally { + httpClient.close(); response.close(); } - httpClient.close(); + } - /** - * @description 创建httpClient - * @author jqs - * @date 2023/6/19 12:50 - * @param - * @return CloseableHttpClient - */ - private CloseableHttpClient createHttpClient() throws NotFoundException, IOException, GeneralSecurityException, HttpCodeException { - String merchantId = ""; - PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey( - new FileInputStream("/path/to/apiclient_key.pem")); - String merchantSerialNumber = ""; - String apiV3Key = ""; + public static void QueryApplyments(String applymentId) throws Exception{ - // 获取证书管理器实例 - CertificatesManager certificatesManager = CertificatesManager.getInstance(); - // 向证书管理器增加需要自动更新平台证书的商户信息 - certificatesManager.putMerchant(merchantId, new WechatPay2Credentials(merchantId, - new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8)); - // ... 若有多个商户号,可继续调用putMerchant添加商户信息 - - // 从证书管理器中获取verifier - Verifier verifier = certificatesManager.getVerifier(merchantId); - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() - .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) - .withValidator(new WechatPay2Validator(verifier)); - - CloseableHttpClient httpClient = builder.build(); - return httpClient; + // 初始化httpClient + CloseableHttpClient httpClient = createHttpClient(); + //请求URL + HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/ecommerce/applyments/out-request-no/"+applymentId); + httpGet.setHeader("Accept", "application/json"); + //完成签名并执行请求 + CloseableHttpResponse response = httpClient.execute(httpGet); + try { + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { //处理成功 + System.out.println("success,return body = " + EntityUtils.toString(response.getEntity())); + } else if (statusCode == 204) { //处理成功,无返回Body + System.out.println("success"); + } else { + System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity())); + throw new IOException("request failed"); + } + } finally { + httpClient.close(); + response.close(); + } } - - //提交申请 - /*public static String apply(SubmitInfo submitInfo) throws Exception { - String bodyStr=convertToStr(submitInfo); - HttpResponse response = HttpUtils.v3HttpExecute("POST",EcommerceUrl.APPLYMENTS, - "自己系统的应用名称","服务商商户号","商户API证书序列号","平台证书序列号",requestParam,"商户API证书位置.pem",null); - }*/ //加密申请信息 @@ -178,6 +141,7 @@ rsaEncryptSubmitInfo(submitInfo); return JSONObject.toJSONString(submitInfo); } + private static void rsaEncryptSubmitInfo(SubmitInfo submitInfo) throws Exception { IdCardInfo idCardInfo=submitInfo.getId_card_info(); @@ -197,7 +161,7 @@ } private static String rsaEncryptByCert(String content) throws Exception { - String platPrivateKey = ""; + String platPrivateKey = PRIVATE_KEY; InputStream inStream=new ByteArrayInputStream(platPrivateKey.getBytes(StandardCharsets.UTF_8)); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate certificate = (X509Certificate)cf.generateCertificate(inStream); diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/ContactInfo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/ContactInfo.java index d4817dd..c5a5752 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/ContactInfo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/ContactInfo.java @@ -23,9 +23,8 @@ /**超级管理员姓名*/ private String contact_name; /**超级管理员身份证件号码*/ + private String contact_id_doc_type; private String contact_id_card_number; - /**超级管理员手机*/ private String mobile_phone; - /**超级管理员邮箱*/ private String contact_email; } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/IdCardInfo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/IdCardInfo.java index d9c8ce4..787d62c 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/IdCardInfo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/IdCardInfo.java @@ -27,5 +27,6 @@ /**身份证号码*/ private String id_card_number; /**身份证有效期限*/ + private String id_card_valid_time_begin; private String id_card_valid_time; } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SalesSceneInfo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SalesSceneInfo.java index 806bf65..d08376c 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SalesSceneInfo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SalesSceneInfo.java @@ -24,6 +24,5 @@ private String store_url; /**店铺二维码*/ private String store_qr_code; - /**小程序AppID*/ - private String mini_program_sub_appid; + } \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SubmitInfo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SubmitInfo.java index b6aad20..4654a1f 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SubmitInfo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/SubmitInfo.java @@ -11,6 +11,7 @@ import lombok.Data; import java.io.Serializable; +import java.util.List; /** * 进件信息 @@ -32,6 +33,8 @@ private IdCardInfo id_card_info; /**经营者/法人其他类型证件信息*/ private IdDocInfo id_doc_info; + /**经营者/法人是否为受益人*/ + private Boolean owner; /**是否填写结算银行账户*/ private Boolean need_account_info; /**结算银行账户*/ @@ -48,4 +51,6 @@ private String business_addition_pics; /**补充说明*/ private String business_addition_desc; + + private List<UboInfo> ubo_info_list; } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/UboInfo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/UboInfo.java new file mode 100644 index 0000000..bd29c13 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/dto/UboInfo.java @@ -0,0 +1,33 @@ +package com.ruoyi.shop.util.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @ClassName UboInfo + * @Description TODO + * @Author jqs + * @Date 2023/7/18 15:57 + * @Version 1.0 + */ +@Data +public class UboInfo implements Serializable { + private static final long serialVersionUID=1L; + + private String ubo_id_doc_type; + + private String ubo_id_doc_copy; + + private String ubo_id_doc_copy_back; + + private String ubo_id_doc_name; + + private String ubo_id_doc_number; + + private String ubo_id_doc_address; + + private String ubo_id_doc_period_begin; + + private String ubo_id_doc_period_end; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SchedulerUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SchedulerUtils.java new file mode 100644 index 0000000..d0925ea --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SchedulerUtils.java @@ -0,0 +1,48 @@ +package com.ruoyi.system.scheduler; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; + + +@Component +public class SchedulerUtils { + + @Autowired + private StringRedisTemplate redisTemplate; + + public boolean getSchedulerRun() { + String localIpAddress = getLocalIpAddress(); + return true; + } + + public static String getLocalIpAddress() { + String localIpAddress = ""; + try { + Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip = null; + while (allNetInterfaces.hasMoreElements()) { + NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); + if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) { + continue; + } else { + Enumeration<InetAddress> addresses = netInterface.getInetAddresses(); + while (addresses.hasMoreElements()) { + ip = addresses.nextElement(); + if (ip != null && ip instanceof Inet4Address) { + return ip.getHostAddress(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return localIpAddress; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SystemScheduler.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SystemScheduler.java new file mode 100644 index 0000000..b4169bb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/scheduler/SystemScheduler.java @@ -0,0 +1,20 @@ +package com.ruoyi.system.scheduler; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +@Component +@Slf4j +public class SystemScheduler { + + + @Autowired + private SchedulerUtils schedulerUtils; + + + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/staff/SysStaffServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/staff/SysStaffServiceImpl.java index 4033b05..cb00e90 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/staff/SysStaffServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/staff/SysStaffServiceImpl.java @@ -1,13 +1,16 @@ package com.ruoyi.system.service.impl.staff; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.constant.AppErrorConstant; +import com.ruoyi.system.api.constant.SecurityConstant; import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.domain.dto.MgtStaffEditDto; @@ -18,10 +21,12 @@ import com.ruoyi.system.mapper.staff.SysStaffMapper; import com.ruoyi.system.service.staff.SysStaffService; import com.ruoyi.system.service.sys.ISysUserService; +import com.ruoyi.system.util.QiYeUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import java.util.concurrent.TimeUnit; /** * <p> @@ -39,6 +44,10 @@ @Resource private ISysUserService sysUserService; + + @Resource + private RedisService redisService; + /** * @description 获取部门员工列表 @@ -195,4 +204,50 @@ queryWrapper.eq(SysStaff::getStaffMobile,mobile); return this.getOne(queryWrapper,false); } + + + /** + * @description 同步组织架构 + * @author jqs + * @date 2023/7/18 19:06 + * @param + * @return void + */ + @Override + public void synchronizeOrganizationalStructure(){ + String accessToken = getQYToken(); + + + } + + + /** + * @description 获取企业微信token + * @author jqs + * @date 2023/7/18 19:35 + * @param + * @return String + */ + private String getQYToken(){ + String accessToken = redisService.getCacheObject(SecurityConstant.QY_TOKEN); + if(StringUtils.isBlank(accessToken)){ + try { + accessToken = QiYeUtils.getAccessTokenByQY(); + JSONObject jsonAccessToken = JSONObject.parseObject(accessToken); + String errcode = jsonAccessToken.getString("errcode"); + String errmsg = jsonAccessToken.getString("errmsg"); + if(errcode.equals("0")){ + accessToken = jsonAccessToken.getString("access_token"); + Long expiresIn = jsonAccessToken.getLong("expires_in"); + expiresIn = expiresIn -100; + redisService.setCacheObject(SecurityConstant.QY_TOKEN,accessToken,expiresIn, TimeUnit.SECONDS); + }else{ + throw new ServiceException(errmsg); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return accessToken; + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/staff/SysStaffService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/staff/SysStaffService.java index 4557a81..5301b71 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/staff/SysStaffService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/staff/SysStaffService.java @@ -84,4 +84,14 @@ * @return SysStaff */ SysStaff getByMobile(String mobile); + + /** + * @description 同步组织架构 + * @author jqs + * @date 2023/7/18 19:06 + * @param + * @return void + */ + void synchronizeOrganizationalStructure(); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/HttpUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/HttpUtils.java new file mode 100644 index 0000000..0d0c1e4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/HttpUtils.java @@ -0,0 +1,337 @@ +package com.ruoyi.system.util; + +import com.ruoyi.common.core.utils.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @ClassName HttpUtils + * @Description TODO + * @Author zhanglin + * @Date 2020/2/11 10:30 + * @Version 1.0 + **/ +public class HttpUtils { + + public static void main(String[] args) { + } + + + /** + * get + * + * @param host + * @return + * @throws Exception + */ + public static HttpResponse doGet(String host)throws Exception { + return doGet(host, "", "GET", null, null); + } + + /** + * get + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doGet(String host, String path, String method, Map<String, String> headers, Map<String, String> querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpGet request = new HttpGet(buildUrl(host, path, querys)); + if(null != headers) { + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + } + + return httpClient.execute(request); + } + + /** + * post form + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param bodys + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys, + Map<String, String> bodys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (bodys != null) { + List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + return httpClient.execute(request); + } + + /** + * Post String + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Post stream + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Put String + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Put stream + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Delete + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doDelete(String host, String path, String method, + Map<String, String> headers, + Map<String, String> querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); + for (Map.Entry<String, String> e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException { + StringBuilder sbUrl = new StringBuilder(); + sbUrl.append(host); + if (!StringUtils.isBlank(path)) { + sbUrl.append(path); + } + if (null != querys) { + StringBuilder sbQuery = new StringBuilder(); + for (Map.Entry<String, String> query : querys.entrySet()) { + if (0 < sbQuery.length()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); + } + } + } + if (0 < sbQuery.length()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + private static HttpClient wrapClient(String host) { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + sslClient(httpClient); + } + + return httpClient; + } + + private static void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + @Override + public void checkClientTrusted(X509Certificate[] xcs, String str) { + + } + @Override + public void checkServerTrusted(X509Certificate[] xcs, String str) { + + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/QiYeUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/QiYeUtils.java new file mode 100644 index 0000000..eafc255 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/QiYeUtils.java @@ -0,0 +1,39 @@ +package com.ruoyi.system.util; + +import org.apache.http.HttpResponse; +import org.apache.http.util.EntityUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName QiYeUtils + * @Description TODO + * @Author jqs + * @Date 2023/7/18 19:07 + * @Version 1.0 + */ +public class QiYeUtils { + + private final static String ACCESS_TOKEN_HOST = "https://qyapi.weixin.qq.com/cgi-bin/"; + + public static void main(String[] args) throws Exception { + String accessToken = getAccessTokenByQY(); + System.out.println(accessToken); + } + + public static String getAccessTokenByQY() throws Exception { + String host = ACCESS_TOKEN_HOST + "gettoken?corpid=ww11400938eb1b91bc&corpsecret=-wuQ2EBxNT9BJa40LdpFqyxI_8RqrZTCUNiabzBasi8"; + Map<String, String> headers = new HashMap<>(8); + HttpResponse response = HttpUtils.doGet(host, "", "GET", headers, null); + return EntityUtils.toString(response.getEntity()); + } + + public static String getDepartmentList(String accessToken) throws Exception { + String host = ACCESS_TOKEN_HOST + "department/list?access_token="+accessToken; + Map<String, String> headers = new HashMap<>(8); + HttpResponse response = HttpUtils.doGet(host, "", "GET", headers, null); + return EntityUtils.toString(response.getEntity()); + } + +} -- Gitblit v1.7.1