From cc1181b93c51c60a117846f9640d3f56370e67f3 Mon Sep 17 00:00:00 2001 From: jiangqs <jiangqs> Date: 星期四, 03 八月 2023 13:32:26 +0800 Subject: [PATCH] Merge branch 'master' of ssh://sinata.cn:20202/java/HongRuiTang into master --- ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java | 3 ruoyi-modules/ruoyi-shop/pom.xml | 5 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java | 44 +++++++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java | 2 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java | 122 ++++++++++++++++++++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java | 96 +-------------- ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java | 44 +++++++ ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml | 9 + 8 files changed, 236 insertions(+), 89 deletions(-) diff --git a/ruoyi-modules/ruoyi-shop/pom.xml b/ruoyi-modules/ruoyi-shop/pom.xml index aacbe47..dbbee66 100644 --- a/ruoyi-modules/ruoyi-shop/pom.xml +++ b/ruoyi-modules/ruoyi-shop/pom.xml @@ -104,6 +104,11 @@ <!-- 微信 --> <dependency> + <groupId>com.github.binarywang</groupId> + <artifactId>weixin-java-pay</artifactId> + <version>4.5.0</version> + </dependency> + <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.4.9</version> diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java new file mode 100644 index 0000000..451ba86 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java @@ -0,0 +1,44 @@ +package com.ruoyi.shop.config; + +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Binary Wang + */ +@Configuration +@ConditionalOnClass(WxPayService.class) +@EnableConfigurationProperties(WxPayProperties.class) +@AllArgsConstructor +public class WxPayConfiguration { + private WxPayProperties properties; + + @Bean + @ConditionalOnMissingBean + public WxPayService wxService() { + WxPayConfig payConfig = new WxPayConfig(); + payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId())); + payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId())); + payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey())); + payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId())); + payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId())); + payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath())); + + // 可以指定是否使用沙箱环境 + payConfig.setUseSandboxEnv(false); + + WxPayService wxPayService = new WxPayServiceImpl(); + wxPayService.setConfig(payConfig); + return wxPayService; + } + +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java new file mode 100644 index 0000000..c1c4841 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java @@ -0,0 +1,44 @@ +package com.ruoyi.shop.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * wxpay pay properties. + * + * @author Binary Wang + */ +@Data +@ConfigurationProperties(prefix = "wx.pay") +public class WxPayProperties { + /** + * 设置微信公众号或者小程序等的appid + */ + private String appId; + + /** + * 微信支付商户号 + */ + private String mchId; + + /** + * 微信支付商户密钥 + */ + private String mchKey; + + /** + * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除 + */ + private String subAppId; + + /** + * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除 + */ + private String subMchId; + + /** + * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定 + */ + private String keyPath; + +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java index dcc54e9..660a4e7 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java @@ -264,7 +264,7 @@ @RequestMapping(value = "/mgtShopAuth", method = RequestMethod.POST) @Log(title = "商户进件管理", businessType = BusinessType.UPDATE,operContent = "商户进件") @ApiOperation(value = "平台商户进件") - public R mgtShopAuth(@Validated @RequestBody MgtShopAuthDto mgtShopAuthDto) { + public R mgtShopAuth(@Validated @RequestBody MgtShopAuthDto mgtShopAuthDto) throws Exception { Long userId = SecurityUtils.getUserId(); mgtShopAuthDto.setUserId(userId); shopService.mgtShopAuth(mgtShopAuthDto); 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 15d93e7..6df823e 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.binarywang.wxpay.exception.WxPayException; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; @@ -22,6 +23,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.WechatPayUtils; +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.*; @@ -32,6 +35,7 @@ import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.service.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -114,6 +118,9 @@ @Resource private RedisService redisService; + + @Resource + private WechatPayUtils wechatPayUtils; /** * 获取商户详情 @@ -789,8 +796,6 @@ merHomeShopTotalVo.setShopId(shopId); Shop shop = this.getById(shopId); merHomeShopTotalVo.setShopType(shop.getShopType()); - merHomeShopTotalVo.setPlatformCouponFlag(shop.getPlatformCouponFlag()); - merHomeShopTotalVo.setPlatformBirthdayFlag(shop.getPlatformBirthdayFlag()); MerHomeShopTotalVo orderVo = remoteOrderService.getMerHomeTotal(merHomeShopTotalVo).getData(); ShopTotal shopTotal = shopTotalService.getById(shopId); merHomeShopTotalVo.setShopId(shopId); @@ -957,7 +962,7 @@ * @return void */ @Override - public void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto){ + public void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto) throws WxPayException { ShopAuthentication shopAuthentication = shopAuthenticationService.getById(mgtShopAuthDto.getAuthId()); Shop shop = this.getByShopId(shopAuthentication.getShopId()); String applyNumber = IdUtils.simpleUUID(); @@ -965,90 +970,7 @@ 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){ - //受益人 - if(shopAuthentication.getOwner()==1){ - submitInfo.setOwner(true); - }else{ - submitInfo.setOwner(false); - 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); - }*/ - + wechatPayUtils.ecommerceApply(shopAuthentication,applyNumber,shop); } /** diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java index ec140ec..5a664f1 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.github.binarywang.wxpay.exception.WxPayException; import com.ruoyi.shop.domain.dto.*; import com.ruoyi.shop.domain.vo.*; import com.ruoyi.system.api.domain.dto.MerBaseDto; @@ -207,7 +208,7 @@ * @param mgtShopAuthDto * @return void */ - void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto); + void mgtShopAuth(MgtShopAuthDto mgtShopAuthDto) throws WxPayException; /** * @description 获取平台商户统计 diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java new file mode 100644 index 0000000..39a768f --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java @@ -0,0 +1,122 @@ +package com.ruoyi.shop.util; + +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsRequest; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsResult; +import com.github.binarywang.wxpay.bean.ecommerce.ApplymentsStatusResult; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.EcommerceService; +import com.github.binarywang.wxpay.service.WxPayService; +import com.ruoyi.shop.domain.pojo.shop.ShopAuthentication; +import com.ruoyi.system.api.domain.poji.shop.Shop; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 微信支付 + */ +@Component +@AllArgsConstructor +public class WechatPayUtils { + private final WxPayService wxService; + + /** + * 电商二级商户进件(提交申请单) + */ + public void ecommerceApply(ShopAuthentication shopAuthentication, String applyNumber, Shop shop) throws WxPayException { + EcommerceService ecommerceService = wxService.getEcommerceService(); + ApplymentsRequest request = new ApplymentsRequest(); + //生成提交类 + request.setOutRequestNo(applyNumber); + if(shopAuthentication.getMainType()==2){ + request.setOrganizationType("2"); + }else{ + request.setOrganizationType("4"); + } + //营业执照 + ApplymentsRequest.BusinessLicenseInfo business_license_info = new ApplymentsRequest.BusinessLicenseInfo(); + business_license_info.setBusinessLicenseCopy(shopAuthentication.getBlImage()); + business_license_info.setBusinessLicenseNumber(shopAuthentication.getBlNumber()); + business_license_info.setMerchantName(shopAuthentication.getBlShopName()); + business_license_info.setLegalPerson(shopAuthentication.getBlCorporateName()); + business_license_info.setCompanyAddress(shopAuthentication.getBlRegisteredAddress()); + business_license_info.setBusinessTime(shopAuthentication.getBlBusinessDeanline()); + request.setBusinessLicenseInfo(business_license_info); + //法人证件 + request.setIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); + ApplymentsRequest.IdCardInfo id_card_info = new ApplymentsRequest.IdCardInfo(); + id_card_info.setIdCardCopy(shopAuthentication.getLpIcFront()); + id_card_info.setIdCardNational(shopAuthentication.getLpIcBack()); + id_card_info.setIdCardName(shopAuthentication.getLpCorporateName()); + id_card_info.setIdCardNumber(shopAuthentication.getLpIdCard()); + id_card_info.setIdCardValidTimeBegin(shopAuthentication.getLpIcStartDate()); + id_card_info.setIdCardValidTime(shopAuthentication.getLpIcEndDate()); + request.setIdCardInfo(id_card_info); + //企业填写 + if(shopAuthentication.getMainType()==2){ + //受益人 + if(shopAuthentication.getOwner()==1){ + request.setOwner(true); + }else{ + request.setOwner(false); + List<ApplymentsRequest.UboInfo> ubo_info_list = new ArrayList<>(); + ApplymentsRequest.UboInfo uboInfo = new ApplymentsRequest.UboInfo(); + uboInfo.setUboIdDocType("IDENTIFICATION_TYPE_MAINLAND_IDCARD"); + uboInfo.setUboIdDocCopy(shopAuthentication.getUboIcFront()); + uboInfo.setUboIdDocCopyBack(shopAuthentication.getUboIcBack()); + uboInfo.setUboIdDocName(shopAuthentication.getUboName()); + uboInfo.setUboIdDocNumber(shopAuthentication.getUboIdCard()); + uboInfo.setUboIdDocAddress(shopAuthentication.getUboIcAddress()); + uboInfo.setUboIdDocPeriodBegin(shopAuthentication.getUboIcStartDate()); + uboInfo.setUboIdDocCopyBack(shopAuthentication.getUboIcEndDate()); + ubo_info_list.add(uboInfo); + request.setUboInfoList(ubo_info_list); + } + } + //结算账户信息 + ApplymentsRequest.AccountInfo accountInfo = new ApplymentsRequest.AccountInfo(); + if(shopAuthentication.getSettlementAccountType().equals("1")){ + accountInfo.setBankAccountType("74"); + }else{ + accountInfo.setBankAccountType("75"); + } + accountInfo.setAccountBank(shopAuthentication.getSaBank()); + accountInfo.setAccountName(shopAuthentication.getSaAccountName()); + accountInfo.setBankAddressCode(shopAuthentication.getSaBankCityCode()); + accountInfo.setBankName(shopAuthentication.getSaBankName()); + accountInfo.setAccountNumber(shopAuthentication.getSaNumber()); + request.setAccountInfo(accountInfo); + ApplymentsRequest.ContactInfo contactInfo = new ApplymentsRequest.ContactInfo(); + contactInfo.setContactType("65"); + contactInfo.setContactName(shopAuthentication.getLpCorporateName()); + contactInfo.setContactIdCardNumber(shopAuthentication.getLpIdCard()); + contactInfo.setMobilePhone(shopAuthentication.getLpMobilePhone()); + contactInfo.setContactEmail(shopAuthentication.getLpContactEmail()); + request.setContactInfo(contactInfo); + //店铺信息 + ApplymentsRequest.SalesSceneInfo salesSceneInfo = new ApplymentsRequest.SalesSceneInfo(); + salesSceneInfo.setStoreName(shop.getShopName()); + salesSceneInfo.setStoreUrl(""); + salesSceneInfo.setStoreQrCode(""); + request.setSalesSceneInfo(salesSceneInfo); + request.setMerchantShortname(shop.getShopName()); + request.setBusinessAdditionPics(shopAuthentication.getBaPics()); + request.setBusinessAdditionDesc(shopAuthentication.getBaDesc()); + + ApplymentsResult result = ecommerceService.createApply(request); + } + + + /** + * 通过查询申请状态API查询二级商户入驻申请结果 + * @param applyNumber 业务申请编号 + * @return 申请状态 + * @throws WxPayException + */ + public ApplymentsStatusResult queryApplyStatusByOutRequestNo(String applyNumber) throws WxPayException { + return wxService.getEcommerceService().queryApplyStatusByOutRequestNo(applyNumber); + } + +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml index 5e8dd18..2ae1777 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml @@ -25,3 +25,12 @@ # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + +wx: + pay: + appId: #微信公众号或者小程序等的appid + mchId: #微信支付商户号 + mchKey: #微信支付商户密钥 + subAppId: #服务商模式下的子商户公众账号ID + subMchId: #服务商模式下的子商户号 + keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头) -- Gitblit v1.7.1