ruoyi-modules/ruoyi-shop/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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> ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java
New file @@ -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; } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java
New file @@ -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; } 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); 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); } /** 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 获取平台商户统计 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java
New file @@ -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); } } 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:开头)