jiangqs
2023-08-03 cc1181b93c51c60a117846f9640d3f56370e67f3
Merge branch 'master' of ssh://sinata.cn:20202/java/HongRuiTang into master
5个文件已修改
3个文件已添加
325 ■■■■ 已修改文件
ruoyi-modules/ruoyi-shop/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayConfiguration.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/config/WxPayProperties.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/WechatPayUtils.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | 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:开头)