Althars123 il y a 2 ans
Parent
commit
1934a27bba
23 fichiers modifiés avec 718 ajouts et 77 suppressions
  1. 30 8
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  2. 51 0
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxExtractBankController.java
  3. 96 0
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxExtractController.java
  4. 9 1
      sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  5. 1 1
      sdjk-admin/src/main/resources/application-dev.yml
  6. 1 1
      sdjk-admin/src/main/resources/application-prod.yml
  7. 1 1
      sdjk-admin/src/main/resources/application-prodtest.yml
  8. BIN
      sdjk-admin/src/main/resources/wechatpay/apiclient_cert.p12
  9. 15 15
      sdjk-admin/src/main/resources/wechatpay/apiclient_cert.pem
  10. 26 26
      sdjk-admin/src/main/resources/wechatpay/apiclient_key.pem
  11. 9 0
      sdjk-admin/src/main/resources/wechatpay/public.pem
  12. 6 0
      sdjk-common/pom.xml
  13. 27 0
      sdjk-common/src/main/java/com/miaxis/common/config/BeanConfig.java
  14. 94 0
      sdjk-common/src/main/java/com/miaxis/common/config/WxPayConfigImpl.java
  15. 13 2
      sdjk-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java
  16. 127 0
      sdjk-common/src/main/java/com/miaxis/common/utils/RSAUtils.java
  17. 1 1
      sdjk-common/src/main/java/com/miaxis/common/utils/wx/SignUtil.java
  18. 7 0
      sdjk-service/src/main/java/com/miaxis/wx/domain/WxOrder.java
  19. 26 0
      sdjk-service/src/main/java/com/miaxis/wx/dto/WxExtractBankDTO.java
  20. 3 4
      sdjk-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java
  21. 158 9
      sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java
  22. 10 8
      sdjk-system/src/main/java/com/miaxis/system/service/ISysConfigService.java
  23. 7 0
      sdjk-system/src/main/java/com/miaxis/system/service/impl/SysConfigServiceImpl.java

+ 30 - 8
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -12,6 +12,8 @@ import com.miaxis.common.core.domain.entity.UserInfo;
 import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
 import com.miaxis.common.utils.uuid.CommonUtils;
+import com.miaxis.system.domain.SysConfig;
+import com.miaxis.system.service.ISysConfigService;
 import com.miaxis.system.service.ISysDictDataService;
 import com.miaxis.system.service.ISysUserService;
 import com.miaxis.wx.domain.WxOrder;
@@ -67,6 +69,9 @@ public class WxController extends BaseController {
     @Autowired
     private ISysUserService sysUserService;
 
+    @Autowired
+    private ISysConfigService sysConfigService;
+
     @Value("${app.appid}")
     private String appid;
     @Value("${wxpay.notifyUrl}")
@@ -97,7 +102,7 @@ public class WxController extends BaseController {
      */
     @PostMapping(value = "/prepareOrder")
     @ApiOperation("app端微信支付下单")
-    public Response<WxParamEntity> getPrepareOrder(String referralCode) throws Exception{
+    public Response<WxParamEntity> getPrepareOrder(@RequestParam @ApiParam(name="type",value="1-超级vip 2-普通vip 3-升级高级vip",required=true)Integer type) throws Exception{
 
         //创建本地微信订单
         WxOrder order = new WxOrder();
@@ -106,16 +111,33 @@ public class WxController extends BaseController {
         order.setOutTradeNo(orderCode);
         order.setAppOpenid(student.getAppOpenid());
         order.setUnionId(student.getUnionId());
-        order.setGoodsType("1");
-        SysUser sysUser = sysUserService.selectUserByReferralCode(referralCode);
-        if (sysUser != null){
-            order.setReferralUserId(sysUser.getUserId());
-        }
-        wxOrderService.createVipOrder(order);
+        String key =  getKeyByType(type);
+        SysConfig config = sysConfigService.selectConfigObjByKey(key);
+        String goodsName = config.getConfigName();
+        order.setGoodsName(goodsName);
+        order.setOrderDataJson(type.toString());
+        wxOrderService.createVipOrder(order,type);
         wxOrderService.save(order);
-        return Response.success(placeWxOrder(order, "学车vip充值"));
 
+        return Response.success(placeWxOrder(order, goodsName));
+
+
+    }
 
+    private String getKeyByType(Integer type) {
+        if(type == null){
+            throw new CustomException("类型不能为空");
+        }
+        if (type == 1){
+            return "vip_price";
+        }
+        if (type == 2){
+            return "vip_price_recommend";
+        }
+        if (type == 3){
+            return "vip_price_upgrade";
+        }
+        throw new CustomException("类型值有误");
     }
 
 

+ 51 - 0
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxExtractBankController.java

@@ -0,0 +1,51 @@
+package com.miaxis.app.controller.wx;
+
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.page.ResponsePageInfo;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.wx.domain.WxExtractBank;
+import com.miaxis.wx.service.IWxExtractBankService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 【微信提现银行卡】Controller
+ *
+ * @author miaxis
+ * @date 2022-03-07
+ */
+@RestController
+@RequestMapping(Constants.STUDENT_PREFIX +"/wx/bank")
+@Api(tags={"【H5-微信提现银行卡】"})
+public class WxExtractBankController extends BaseController {
+    @Autowired
+    private IWxExtractBankService wxExtractBankService;
+
+    /**
+     * 查询微信提现银行卡列表
+     */
+    @ApiOperation("查询微信提现银行卡列表")
+        @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum",value = "当前页码" ,dataType = "int", paramType = "query", required = false),
+            @ApiImplicitParam(name = "pageSize",value = "每页数据量" , dataType = "int", paramType = "query", required = false),
+    })
+    @GetMapping("/list")
+    public ResponsePageInfo<WxExtractBank> list(){
+        startPage();
+        WxExtractBank wxExtractBank = new WxExtractBank();
+        wxExtractBank.setOpenid(SecurityUtils.getLoginUser().getStudent().getAppOpenid());
+        List<WxExtractBank> list = wxExtractBankService.selectWxExtractBankList(wxExtractBank);
+        return toResponsePageInfo(list);
+    }
+
+
+}

+ 96 - 0
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxExtractController.java

@@ -0,0 +1,96 @@
+package com.miaxis.app.controller.wx;
+
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.page.ResponsePageInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.wx.domain.WxExtract;
+import com.miaxis.wx.dto.WxExtractBankDTO;
+import com.miaxis.wx.service.IWxExtractService;
+import com.miaxis.wx.service.IWxOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 【微信提现】Controller
+ *
+ * @author miaxis
+ * @date 2022-01-24
+ */
+@RestController
+@RequestMapping(Constants.STUDENT_PREFIX +"/wx/extract")
+@Api(tags={"【H5-微信提现】"})
+public class WxExtractController extends BaseController {
+    @Autowired
+    private IWxExtractService wxExtractService;
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+    /**
+     * 查询微信提现列表
+     */
+    @GetMapping("/list")
+    @ApiOperation("查询微信提现列表")
+        @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum",value = "当前页码" ,dataType = "int", paramType = "query", required = false),
+            @ApiImplicitParam(name = "pageSize",value = "每页数据量" , dataType = "int", paramType = "query", required = false),
+    })
+    public ResponsePageInfo<WxExtract> list(){
+        WxExtract wxExtract = new WxExtract();
+        wxExtract.setOpenid(SecurityUtils.getLoginUser().getStudent().getXcxOpenid());
+        startPage();
+        List<WxExtract> list = wxExtractService.selectWxExtractList(wxExtract);
+        return toResponsePageInfo(list);
+    }
+
+    /**
+     * 微信提现
+     */
+    @PostMapping(value = "/withdraw")
+    @ApiOperation("微信提现")
+    public Response wxwithdrawal(Integer amount) throws Exception{
+
+        if (amount == null){
+            throw new CustomException("提现金额不能为空");
+
+        }
+        if (amount > 20000 ){
+            throw new CustomException("提现金额不能超过200元");
+        }
+
+        if (amount < 30 ){
+            throw new CustomException("提现金额不能低于0.3元");
+        }
+        wxOrderService.wxwithdrawal(amount);
+        return Response.success();
+
+
+    }
+
+
+    /**
+     * 银行卡提现
+     */
+    @PostMapping(value = "/wxwithbankdrawal")
+    @ApiOperation("银行卡提现")
+    public Response wxwithbankdrawal(@RequestBody WxExtractBankDTO dto) throws Exception{
+
+
+        return Response.success(wxOrderService.wxwithbankdrawal(dto));
+
+
+    }
+
+
+
+
+}

+ 9 - 1
sdjk-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -121,7 +121,15 @@ public class WxNotifyController {
         vipCodeEntity.setActivationUserId(userInfo.getId());
         vipCodeEntity.setActivationTime(new Date());
         vipCodeService.updateById(vipCodeEntity);
-        userInfo.setIsVip(1);
+        String s = wxOrder.getOrderDataJson();
+        Integer type = Integer.valueOf(s);
+        if (type == 1 || type ==3){
+            userInfo.setIsVip(1);
+        }
+        if (type == 2){
+            userInfo.setIsVip(2);
+        }
+
         userInfoService.updateById(userInfo);
 
 

+ 1 - 1
sdjk-admin/src/main/resources/application-dev.yml

@@ -128,7 +128,7 @@ wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/app
     v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
     merchantId: 1611324484
-    serialNumber: 26C02FEDDE8C9F0F69A71CA37226F58CCBB164DE
+    serialNumber: 53EBF541F383371B121D7B57B25305FC0BB04F42
     v3key: 7hM14893GvG3JK05575jk1l6P4tF042B
     notifyUrl: http://1.15.26.233:8080/sdjk-admin/open-api/wx/notify/wxpay
     notifyUrlRefund: http://1.15.26.233:8080/sdjk-admin/open-api/wx/notify/refund

+ 1 - 1
sdjk-admin/src/main/resources/application-prod.yml

@@ -121,7 +121,7 @@ wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/app
     v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
     merchantId: 1611324484
-    serialNumber: 26C02FEDDE8C9F0F69A71CA37226F58CCBB164DE
+    serialNumber: 53EBF541F383371B121D7B57B25305FC0BB04F42
     v3key: 7hM14893GvG3JK05575jk1l6P4tF042B
     notifyUrl: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/wxpay
     notifyUrlRefund: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/refund

+ 1 - 1
sdjk-admin/src/main/resources/application-prodtest.yml

@@ -122,7 +122,7 @@ wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/app
     v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
     merchantId: 1611324484
-    serialNumber: 26C02FEDDE8C9F0F69A71CA37226F58CCBB164DE
+    serialNumber: 53EBF541F383371B121D7B57B25305FC0BB04F42
     v3key: 7hM14893GvG3JK05575jk1l6P4tF042B
     notifyUrl: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/wxpay
     notifyUrlRefund: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/refund

BIN
sdjk-admin/src/main/resources/wechatpay/apiclient_cert.p12


+ 15 - 15
sdjk-admin/src/main/resources/wechatpay/apiclient_cert.pem

@@ -1,24 +1,24 @@
 -----BEGIN CERTIFICATE-----
-MIID8DCCAtigAwIBAgIUJsAv7d6Mnw9ppxyjcib1jMuxZN4wDQYJKoZIhvcNAQEL
+MIID8DCCAtigAwIBAgIUU+v1QfODNxsSHXtXslMF/AuwT0IwDQYJKoZIhvcNAQEL
 BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
 FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
-Q0EwHhcNMjExMDIxMDM0NDM4WhcNMjYxMDIwMDM0NDM4WjCBgTETMBEGA1UEAwwK
+Q0EwHhcNMjIwMTI2MDYwNjM0WhcNMjcwMTI1MDYwNjM0WjCBgTETMBEGA1UEAwwK
 MTYxMTMyNDQ4NDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
 DCTnpo/lu7rkuK3mjK/nvZHnu5znp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYM
 AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAK7KvPLRrGlNHseksGVM65qY3NYqmg+bh2OQw+Qzdc/qaSnrxpBEUP7S
-eYU/GHACExquKEob621MsaAoyQ6GpPmJTMebF6eVN/F33L2XQnWhi9odF7VR4cf4
-bz7kKS4hFBvTyx/5N96ZN9QCXJu69OZVo0V3uLNn73dPuvs/TNDAzS0j4AxDM5mX
-QOjEndFqpQeZALuS70FRjW5pt70BBTdzzY9Ncob4L/ytWLgMNAqQQpPks8Nv2Gmd
-Qh2/ttK9rs9P4mLRgHpNoMezyV8YFj9taO+RzEXXh4wmBowugP17wCAzrkCrH90D
-xG2s1ByZKmhcuty+bclpyCHYuRtqcHsCAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD
+AQoCggEBAJSCafbJ6jctCm3Wqm7Hp8jPwyxiuLRrB6w+6booqhWjqrTSyH9oWd0a
+vkbqdsKsh4xRkzyGFN1M0axge7BbqZYhEkB/StIsPn/jNcSTwZzqDsyQ1iv2eNrI
+e0/vK+11NJAZC9Bp7ATIacOuxUYRuj2dKoLKivUi55CLUbg3dg6HksyqPuhLyai7
+FR40tqVNeHRcS9YHtsWn8qMMX31K5l8sv1ukVF0KbpOrvaIlD6zWQOcFfV7dGqVy
+GnRfxrC6Oms/yBlKF5Zu5GyA5M7jJa9dqS/CgY/XCgXv/6lAFLLyC2i5Qgv5ICz0
+1aiS0Eix7rrHIij91ZoDChbQiQYH4M8CAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD
 VR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNv
 bS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1
-NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAPzIagWMOPax5qK/E
-B/k5nqC0KjgFsu68BfSNNTwJuBnl4baZiml5oqz1gagoDuIQLah8QMg4ABukb4ZW
-SSraodZruZ+YwA5ZDQ6Q9dVB89UewomL6bQV4ZY/5+59ruya6KgCE8MTbO+NRfVC
-t4MlXta2+xFLkrOBBeMQw4dgRIPqGw8Ep8Zf/EjmEnqzw3DYckpkTMWtqdlZEID3
-Vo/eA7qbWC5D0lon8ECnOnIpHmsY4tx+zTubBCbjU5mNNAeFSdzM2Rxi9nl6N74S
-PQKm/XMtCpwgPi7YGggH/eELWIdO1Hif/cE4M7U3u7dftAObRO3yJcKgSzIo3DTk
-UotQ0Q==
+NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEASGhYlRSryI2yC4Cj
+Tc7A9r6qXmCo6fcSzM8mQ0whj8H9QoQc+p3HnX4ZDVFpi9DDc1LgCYmBg06AhNgE
+hrMIEuJ2PMla0c1v9iMsE174+lmAFh2dQ4x7UGHt/ui2FE6WmqaSEs/iLF0o6qU6
+AIXAHo+G+e1mlVbLhxTC6/ntO7v3qka/0Te77vKMaguE5zYWvvSbXB0rgaMnvrQo
+gsvj8i0LIJHljKMUUttjA7vJehiLigr2sMlO6ovcrGdo5wNPg6vMqkSOnBpDf/XP
+C/Vz8KuJIvTtsFjGuJ+iCLCCpxsjF8dArJQrRAp8VC1o/mmRyZns1nVbZrPFHmYv
+TMhTvw==
 -----END CERTIFICATE-----

+ 26 - 26
sdjk-admin/src/main/resources/wechatpay/apiclient_key.pem

@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuyrzy0axpTR7H
-pLBlTOuamNzWKpoPm4djkMPkM3XP6mkp68aQRFD+0nmFPxhwAhMarihKG+ttTLGg
-KMkOhqT5iUzHmxenlTfxd9y9l0J1oYvaHRe1UeHH+G8+5CkuIRQb08sf+TfemTfU
-AlybuvTmVaNFd7izZ+93T7r7P0zQwM0tI+AMQzOZl0DoxJ3RaqUHmQC7ku9BUY1u
-abe9AQU3c82PTXKG+C/8rVi4DDQKkEKT5LPDb9hpnUIdv7bSva7PT+Ji0YB6TaDH
-s8lfGBY/bWjvkcxF14eMJgaMLoD9e8AgM65Aqx/dA8RtrNQcmSpoXLrcvm3Jacgh
-2LkbanB7AgMBAAECggEAHuJ72Hvr9v9FfQlAkeWxi7OO8di9OBzHI3Sk6GGfY4mL
-43hhsYQgu6X9CupHKyNytLgpLk8Ynkt6503NmN95rw3vnyVsXJQlOmlve6CKgbZ1
-u6iAU+2P84GWRoqSLDB0GSanMZMbqB1ym+d+7ZVvSHPBUbkBzdGDopVX+KUKsafU
-tkclyPAL2xzMpY6dZGeyboxOKJI8kqh3OOqtprupk+MvGmhf1C4DRSKmD9rz6fWy
-JIF75DktDpFP6cPGuGSciELKWi4MLl/kVVBmjKEOWG0cyISjb1JSardpQzSw3tuQ
-HYg374DDPAkDSoZ2zG4qvGXb/CMbU2lXXAPLg426oQKBgQDgdgdRR9Jdr4uFlAVL
-b4jXIwtkfk4VbWdG1A2EN2W80SwvQfUeVXF+0VvCdUAFtyily99UlQl3o7VYVgzm
-9HzrMgz4MXU8/oea0djokwOiGHPoZhjn4IiHxZf2HE85FeLD3TYMmyVD8LQtOXrF
-CP3VD9Y81rBCzqv9FfpqJD3udQKBgQDHWhaLDS1CQe3ZKu/kZjDiiQ7J2VYRsdjm
-+zxPbx3ic52Xz8nSR65R82O7hbcj3v9aaVKPmiuiIJS8WSuBhFYODToDo4M1U1w0
-AT77ZC9ycHh1W+Z0ti6B60z7PqmxDlHSw7wpeogCXyx/3ng94S5oemFYCzRK2K6F
-sEZ8ySnlLwKBgQCl/mM29thZtEKIDIlF2jvmbeI09TslmXyw4o0EZDt2wXHdmPd+
-8U03rfgf/LnWADetNPH6CSWxNn4bz7dG7TOcc60nttuuucTq95ljlaUwMMk26pos
-kN4nGjdhKFpmKwtCMcuQ0wNiFRYKA+II6Lde45FZ+KLtJQ4H4kMIT7kFKQKBgCc9
-UFqmiVYVbB/nF7k5dD3jBIouwYZSH4O3yDNKh/NfFpIfUHaXrXRsGCF9PINPDaxa
-NuoVSqlrCFvaoXmo9tdlOxokQVtpwShrZl5NZhl8kfln0YD/qz/fdROvTe+QBgMa
-jBsOB1+QJE43GCv1+xCNpkOSUQS6if++puFBJ4H5AoGAE8UVWN2gi1gEgweG6HiX
-YKwho+E3sijd11PMCS2rorIoPvXx+LeWN3UG72YCoqncDzaINyr6UaF6kwGBCSHa
-q24GzRjv8Ts/7mj/cJnBM2jnwKFo+ZEUokA52/480taVYuL+1YSQ60OlfFR0XTiv
-2l5GZtSlRWmtNHL+r8J5lEw=
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCUgmn2yeo3LQpt
+1qpux6fIz8MsYri0awesPum6KKoVo6q00sh/aFndGr5G6nbCrIeMUZM8hhTdTNGs
+YHuwW6mWIRJAf0rSLD5/4zXEk8Gc6g7MkNYr9njayHtP7yvtdTSQGQvQaewEyGnD
+rsVGEbo9nSqCyor1IueQi1G4N3YOh5LMqj7oS8mouxUeNLalTXh0XEvWB7bFp/Kj
+DF99SuZfLL9bpFRdCm6Tq72iJQ+s1kDnBX1e3Rqlchp0X8awujprP8gZSheWbuRs
+gOTO4yWvXakvwoGP1woF7/+pQBSy8gtouUIL+SAs9NWoktBIse66xyIo/dWaAwoW
+0IkGB+DPAgMBAAECggEBAIAG1bbtZr7eU2lRcGhEMr8JbSZsjPLsehbhvbjAqbAy
+Ak4UkMhVe3MDRRn5sxwshEZRZO7+YCpPuUozey4UN2S3afa0RhpeDhtOEuI+xuCx
+XsS38ArCVnm176h/dY0mR4QaM3ceeVu+Mn+BwYugaMAJJ8bNOXIO/zY7BN4c4eev
+ZIu0Zz86boDsHR1D9Zmx2SMe7V02ka8GGN/PAd1N47iZdzGUWYrchkg7KFqCn4KF
+HObRmodVf1OuSJyqOomJkU4uaj0UsW/ww7DgVIk898EHmkdulR6DC/45rCKpPd3D
+jQ93SiSb0oPZRyC/Pk/z/DAauet+/SIMT5qbI4XmWhECgYEAw/1OQPIN/XWSzvtT
+sFMCit4GLZll/HeYLj856RWw2/Jqn4/ZlBp0BBmrr1HT3m1TZq1UCjP0OyNYtKGu
+a8inzjYvricplfq9avwc0q1leAwj+sxnevJ6/qs2h6aX1a1uJZVFUNQTyY1oAyR2
+eUBqrNWLAI48CcIiUF0Ug+0vb6MCgYEAwfte16Oj6ZnLNE30xsmXQ80gZ2MHZK1q
+b4NeUBsr8pkRQcG3gbmXzBnX0RmBDyaRp1vyPS3vs/oO5v4GVeoOXjddsMofNUF1
+l7MWzv/fRj8G2FLXGEf5X0GUBZkFbAnQObqaQmFmtMpvBWswEqJMnyL/yRej17XM
+EvwVw1GDLOUCgYEAkkBPCeXXDMGU6QHhRJ3dMtVVlOd4lHqGRFSIGWhHTwpKCIHm
+4j8PPhQN6slMKho491D2epqkcRECW+Ce8O2OUzJaSEIPJU0z1kcGFyyvoHKm0rt/
+qN6Ta8FF8todSaWeoUsPq65miawM5vNpuTeZoxnDHYoGQV3uDzw2V/BByrMCgYA1
+6tCpz2o3++9nUmO+/Tl2NwXStsvPSARVioYkbekBPVp2lImVHSj8KhK6pAQjWe0S
+P5RNPP9rXw3VVrYcGzpzJaB9CzExdEhjKfwk/SnqNIqKhjwTG65Ms8WY6LeBGBkw
+cpV97eTGS54gO3LZOxNhCDFgi5mW04ktnbPO3lE/oQKBgQC3B4ZlyruLELcx0BpU
+FY5t8BendO8J5h62CTvk+dIn+1VrwJw4ucgdw3aoewumhgQR1uxfjLMpx+xkw38v
+eXdYPq89S2NiBHE553GLgG+luBQJOYcLQO69L2VgRGiFuaasZF73NgxTN2jyRKW2
+5LyLH3avp2Q27rBYaL7l/HRMRw==
 -----END PRIVATE KEY-----

+ 9 - 0
sdjk-admin/src/main/resources/wechatpay/public.pem

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5cD6KUwdmiiQ8UoKoyIr
++yo6IKc/hWAaSCpRK3LO2nFKDzmAIFqBnWDvzYu7E70vL/tq7NQFr/QX7I1MJjER
+3sJkIXXOvyh5ajsF57nsKfLc9qS+I9TClH2fVlieIoMaGhpnnpyeauVEK7cvboYO
+gC5yDmyr6e8F6u/X8vJk+YDCWkYWpfMgs7NvPmjIgo8hug58k2xApmQkfwfQ54qE
+5ymZdV37dONaMSgxiYsAETjYybOb17vvMsB5hV2GwOCwjvpXQeR6/PnKSY5p/uM9
+7mAKECDuExQpkrbow6i27AlVkrG9QPlp0d4yaSBjW7LUUshVtS0Rz1RjEgTGVsCp
+KQIDAQAB
+-----END PUBLIC KEY-----

+ 6 - 0
sdjk-common/pom.xml

@@ -260,6 +260,12 @@
             <version>0.2.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.wxpay</groupId>
+            <artifactId>wxpay-sdk</artifactId>
+            <version>0.0.3</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 27 - 0
sdjk-common/src/main/java/com/miaxis/common/config/BeanConfig.java

@@ -5,13 +5,19 @@ import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
 import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
 import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
 import org.apache.http.client.HttpClient;
+import org.bouncycastle.util.io.pem.PemObject;
+import org.bouncycastle.util.io.pem.PemReader;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.ClassPathResource;
 
 import java.io.File;
+import java.io.FileReader;
+import java.security.KeyFactory;
 import java.security.PrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.X509EncodedKeySpec;
 
 
 @Configuration
@@ -50,6 +56,27 @@ public class BeanConfig {
     }
 
 
+    /**
+     * 创建微信公钥 对象
+     * @return
+     * @throws Exception
+     */
+    @Bean
+    public RSAPublicKey readPublicKey() throws Exception {
+        KeyFactory factory = KeyFactory.getInstance("RSA");
+
+        File file = new ClassPathResource("wechatpay/public.pem").getFile();
+        try (FileReader keyReader = new FileReader(file);
+             PemReader pemReader = new PemReader(keyReader)) {
+
+            PemObject pemObject = pemReader.readPemObject();
+            byte[] content = pemObject.getContent();
+            X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
+            return (RSAPublicKey) factory.generatePublic(pubKeySpec);
+        }
+    }
+
+
 
 
 }

+ 94 - 0
sdjk-common/src/main/java/com/miaxis/common/config/WxPayConfigImpl.java

@@ -0,0 +1,94 @@
+package com.miaxis.common.config;
+
+import com.github.wxpay.sdk.WXPayConfig;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+
+public class WxPayConfigImpl implements WXPayConfig {
+    public static String url = "你设置的回调接口";
+    private static WxPayConfigImpl wxPayConfig;
+    private byte[] certData = null;
+
+
+//    @Resource
+//    private WxpayConfig wxpayConfigBean;
+
+    @Value("${app.appid}")
+    private String appid;
+
+    public static WxPayConfigImpl getInstance() {
+        if (wxPayConfig == null) {
+            synchronized (WxPayConfigImpl.class) {
+                wxPayConfig = new WxPayConfigImpl();
+            }
+        }
+        return wxPayConfig;
+    }
+
+    public WxPayConfigImpl() {
+        try {
+            //这个证书的位置不是瞎鸡儿填的,你要在这个路径真的有一个证书
+            // InputStream is = new FileInputStream("F:\\jpcj\\jpcj\\jpcj-admin\\src\\main\\resources\\wechatpay\\apiclient_cert.p12");
+            InputStream is = new FileInputStream(new ClassPathResource("wechatpay/apiclient_cert.p12").getFile());
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            byte[] bs = new byte[1024];
+            int cnt = -1;
+            while ((cnt = is.read(bs)) != -1) {
+                baos.write(bs, 0, cnt);
+            }
+            is.close();
+            certData = baos.toByteArray();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public String getAppID() {
+        return "wx3043c2c1decb01ed";
+    }
+
+    @Override
+    public String getMchID() {
+        return "1611324484";
+    }
+
+    @Override
+    public String getKey() {
+        return "12345678123456781234567812345678";
+    }
+
+    @Override
+    public InputStream getCertStream() {
+        ByteArrayInputStream certBis;
+        certBis = new ByteArrayInputStream(this.certData);
+        return certBis;
+    }
+
+    @Override
+    public int getHttpConnectTimeoutMs() {
+        // TODO Auto-generated method stub
+        return 8000;
+    }
+
+    @Override
+    public int getHttpReadTimeoutMs() {
+        // TODO Auto-generated method stub
+        return 10000;
+    }
+
+
+    public String getPrimaryDomain() {
+        return "api.mch.weixin.qq.com";
+    }
+
+    public String getNotifyUrl(){
+        return url;
+    }
+}

+ 13 - 2
sdjk-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java

@@ -64,6 +64,13 @@ public class UserInfo extends BaseBusinessEntity{
     @ApiModelProperty(value = "小程序端openid")
     private String xcxOpenid;
 
+    /** 微信openid */
+    @Excel(name = "公众号端openid")
+    @TableField("gzh_openid")
+    @ApiModelProperty(value = "公众号端openid")
+    private String gzhOpenid;
+
+
 
 
 
@@ -74,9 +81,9 @@ public class UserInfo extends BaseBusinessEntity{
     private Integer status;
 
     /** 0 否 1是 */
-    @Excel(name = "是否是vip 0 否 1")
+    @Excel(name = "是否是vip 0-否 1-超级vip 2-普通vip")
     @TableField("is_vip")
-    @ApiModelProperty(value = "是否是vip 0 否 1是")
+    @ApiModelProperty(value = "是否是vip 0-否 1-超级vip 2-普通vip")
     private Integer isVip;
 
 
@@ -105,5 +112,9 @@ public class UserInfo extends BaseBusinessEntity{
     @ApiModelProperty(value = "绑定推荐码")
     private String bindRecommendCode;
 
+    @ApiModelProperty(value = "直接收益金额,单位分")
+    @TableField("profit_price")
+    private Integer profitPrice;
+
 
 }

+ 127 - 0
sdjk-common/src/main/java/com/miaxis/common/utils/RSAUtils.java

@@ -0,0 +1,127 @@
+package com.miaxis.common.utils;
+
+
+
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.security.PublicKey;
+import java.security.interfaces.RSAPublicKey;
+
+/**
+ * 描述:
+ *
+ * @author chen_q_i@163.com
+ * 2018/5/10 : 14:23.
+ * @version : 1.0
+ */
+@Component
+public class RSAUtils {
+    Logger log = LoggerFactory.getLogger(RSAUtils.class);
+    private static String RSA = "RSA";
+
+
+
+    @Autowired
+    private RSAPublicKey rsaPublicKey;
+
+    private static final int KEYLENGTH = 2048;
+    private static final int RESERVESIZE = 11;
+    /**
+     * 指定填充模式
+     */
+    private static final String CIPHERALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING";
+
+
+    /**
+     * 用公钥加密 <br>
+     * 每次加密的字节数,不能超过密钥的长度值减去11
+     *
+     * @param plainBytes 需加密数据的byte数据
+     * @param publicKey  公钥
+     * @return 加密后的byte型数据
+     */
+    public String encrypt(byte[] plainBytes, PublicKey publicKey) throws Exception {
+        int keyByteSize = KEYLENGTH / 8;
+        int encryptBlockSize = keyByteSize - RESERVESIZE;
+        int nBlock = plainBytes.length / encryptBlockSize;
+        if ((plainBytes.length % encryptBlockSize) != 0) {
+            nBlock += 1;
+        }
+        ByteArrayOutputStream outbuf = null;
+        try {
+            Cipher cipher = Cipher.getInstance(CIPHERALGORITHM);
+            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+
+            outbuf = new ByteArrayOutputStream(nBlock * keyByteSize);
+            for (int offset = 0; offset < plainBytes.length; offset += encryptBlockSize) {
+                int inputLen = plainBytes.length - offset;
+                if (inputLen > encryptBlockSize) {
+                    inputLen = encryptBlockSize;
+                }
+                byte[] encryptedBlock = cipher.doFinal(plainBytes, offset, inputLen);
+                outbuf.write(encryptedBlock);
+            }
+            outbuf.flush();
+            byte[] encryptedData = outbuf.toByteArray();
+            return Base64.encodeBase64String(encryptedData);
+        } catch (Exception e) {
+            throw new Exception("ENCRYPT ERROR:", e);
+        } finally {
+            try {
+                if (outbuf != null) {
+                    outbuf.close();
+                }
+            } catch (Exception e) {
+                throw new Exception("CLOSE ByteArrayOutputStream ERROR:", e);
+            }
+        }
+    }
+
+
+
+
+
+
+    /***
+     * decode by Base64
+     */
+    public byte[] decodeBase64(String input) throws Exception {
+        return Base64.decodeBase64(input);
+
+    }
+
+    /**
+     * encodeBase64
+     */
+    public String encodeBase64(byte[] input) throws Exception {
+        return Base64.encodeBase64String(input);
+    }
+
+    /**
+     * 打印公钥信息
+     *
+     * @param publicKey
+     */
+    public  void printPublicKeyInfo(PublicKey publicKey) {
+        RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
+        log.info("----------RSAPublicKey----------");
+        log.info("Modulus.length=" + rsaPublicKey.getModulus().bitLength());
+        log.info("Modulus=" + rsaPublicKey.getModulus().toString());
+        log.info("PublicExponent.length=" + rsaPublicKey.getPublicExponent().bitLength());
+        log.info("PublicExponent=" + rsaPublicKey.getPublicExponent().toString());
+    }
+
+    public String encryptData(String data) throws Exception {
+        return encrypt(data.getBytes("UTF-8"), rsaPublicKey);
+    }
+
+
+
+}
+

+ 1 - 1
sdjk-common/src/main/java/com/miaxis/common/utils/wx/SignUtil.java

@@ -11,7 +11,7 @@ import java.util.Arrays;
  */
 public class SignUtil {
 
-    private static String token = "jpcj";// 与微信公众号上的token一致,是服务器令牌(token),这里写什么。服务器就填什么
+    private static String token = "sdjk";// 与微信公众号上的token一致,是服务器令牌(token),这里写什么。服务器就填什么
 
     /**
      * 校验签名

+ 7 - 0
sdjk-service/src/main/java/com/miaxis/wx/domain/WxOrder.java

@@ -29,6 +29,13 @@ public class WxOrder extends BaseBusinessEntity {
     @ApiModelProperty(value = "id")
     private Long id;
 
+
+    /** 商品名称 */
+    @Excel(name = "商品名称")
+    @TableField("goods_name")
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
     /** 商户订单号 */
     @Excel(name = "商户订单号")
     @TableField("out_trade_no")

+ 26 - 0
sdjk-service/src/main/java/com/miaxis/wx/dto/WxExtractBankDTO.java

@@ -0,0 +1,26 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class WxExtractBankDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "银行编号",required = true)
+    private Integer bankCode;
+
+    @ApiModelProperty(value = "银行卡",required = true)
+    private String encBankNo;
+
+    @ApiModelProperty(value = "收款人姓名",required = true)
+    private String encTrueName;
+
+    @ApiModelProperty(value = "提现金额",required = true)
+    private Integer amount;
+
+
+
+
+
+}

+ 3 - 4
sdjk-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java

@@ -1,9 +1,6 @@
 package com.miaxis.wx.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.miaxis.feign.dto.FilmDTO;
-import com.miaxis.feign.dto.fulu.FuluCommonApiDTO;
-import com.miaxis.feign.dto.fulu.FuluDTO;
 import com.miaxis.wx.domain.WxOrder;
 import com.miaxis.wx.dto.*;
 
@@ -15,12 +12,14 @@ public interface IWxOrderService extends IService<WxOrder>{
 
 
 
-    void createVipOrder(WxOrder order);
+    void createVipOrder(WxOrder order, Integer type);
 
     WxOrder getByOutTradeNo(String outTradeNo);
 
     List<WxOrder> selectPcOrderList(PcWxOrderListDTO pcWxOrderListDTO);
 
+    String wxwithdrawal(Integer amount) throws Exception;
 
+    String wxwithbankdrawal(WxExtractBankDTO amount) throws Exception;
     List<WxOrder> QuerySchoolOrderList(QuerySchoolOrderListDTO dto);
 }

+ 158 - 9
sdjk-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

@@ -1,23 +1,45 @@
 package com.miaxis.wx.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.wxpay.sdk.WXPay;
+import com.github.wxpay.sdk.WXPayConfig;
+import com.github.wxpay.sdk.WXPayConstants;
+import com.github.wxpay.sdk.WXPayUtil;
+import com.miaxis.common.config.WxPayConfigImpl;
+import com.miaxis.common.config.WxpayConfig;
 import com.miaxis.common.core.domain.entity.UserInfo;
 import com.miaxis.common.enums.OrderStatusEnum;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.RSAUtils;
 import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.common.utils.XmlUtil;
 import com.miaxis.system.service.ISysConfigService;
 import com.miaxis.user.service.IUserInfoService;
+import com.miaxis.wx.domain.WxExtract;
+import com.miaxis.wx.domain.WxExtractBank;
 import com.miaxis.wx.domain.WxOrder;
 import com.miaxis.wx.dto.PcWxOrderListDTO;
 import com.miaxis.wx.dto.QuerySchoolOrderListDTO;
+import com.miaxis.wx.dto.WxExtractBankDTO;
 import com.miaxis.wx.mapper.WxOrderMapper;
-import com.miaxis.wx.service.IRefundRecordService;
+import com.miaxis.wx.service.IWxExtractBankService;
+import com.miaxis.wx.service.IWxExtractService;
 import com.miaxis.wx.service.IWxOrderService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
 
 /**
  * 电影订单Service业务层处理
@@ -31,29 +53,45 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
     @Resource
     private WxOrderMapper wxOrderMapper;
 
+    @Autowired
+    private IWxExtractService wxExtractService;
 
+    @Autowired
+    private RSAUtils rsaUtils;
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
     @Autowired
     private ISysConfigService configService;
 
     @Autowired
     private IUserInfoService userInfoService;
+    @Autowired
+    private IWxExtractBankService wxExtractBankService;
 
+    @Value("${zzgzh.appid}")
+    private String appid;
 
 
     @Override
-    public void createVipOrder(WxOrder wxOrder) {
+    public void createVipOrder(WxOrder wxOrder, Integer type) {
         String price = null ;
+        if (type == 1){
+            price = configService.selectConfigByKey("vip_price");
+        }
         UserInfo student = SecurityUtils.getLoginUser().getStudent();
         UserInfo userInfo = userInfoService.getById(student.getId());
-        if (userInfo.getBindRecommendCode()!=null){
-            price = configService.selectConfigByKey("vip_price_recommend");
-        }else{
-            if (wxOrder.getReferralUserId() == null){
-                price = configService.selectConfigByKey("vip_price");
-            }else {
-                price = configService.selectConfigByKey("vip_price_referral");
+        if (type == 2){
+            if (userInfo.getBindRecommendCode()!=null){
+                price = configService.selectConfigByKey("vip_price_recommend");
+            }else{
+                throw new CustomException("该学员未绑定推荐码,不能使用此套餐");
             }
         }
+        if (type == 3){
+            price = configService.selectConfigByKey("vip_price_upgrade");
+        }
+
 
         Double dprice = Double.valueOf(price);
         Double v =dprice* 100;
@@ -76,5 +114,116 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
         return wxOrderMapper.QuerySchoolOrderList(dto);
     }
 
+    @Override
+    @Transactional
+    public String wxwithdrawal(Integer amount) throws Exception {
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        UserInfo dbUserInfo = userInfoService.getById(student.getId());
+        if (dbUserInfo.getProfitPrice() < amount){
+            throw new CustomException("提现金额不能大于可提现金额");
+        }
+
+        Map<String, String> sortMap = new TreeMap<String, String>();
+        sortMap.put("mch_appid",appid);
+        sortMap.put("mchid",wxpayConfig.getMerchantId());
+        sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
+        sortMap.put("partner_trade_no",getOrderCode(null));
+        sortMap.put("openid",student.getGzhOpenid());
+        sortMap.put("check_name","NO_CHECK");
+        sortMap.put("amount",String.valueOf(amount));
+        sortMap.put("desc","用户提现");
+
+        WXPayConfig config = new WxPayConfigImpl();
+        String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
+        sortMap.put("sign", sign);
+        WXPay pay = new WXPay(config);
+
+        String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
+        Map<String, String> resMap;
+        String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
+        resMap = XmlUtil.xmlToMap(xmlStr);
+        if (!"SUCCESS".equals(resMap.get("return_code"))||!"SUCCESS".equals(resMap.get("result_code"))){
+            throw new CustomException(resMap.get("return_msg"));
+        }
+        //新增提现记录
+        WxExtract wxExtract = new WxExtract();
+        wxExtract.setOpenid(student.getGzhOpenid());
+        wxExtract.setExtractPrice(amount);
+        wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
+        wxExtract.setStatus("1");
+        wxExtractService.save(wxExtract);
+
+        //更新余额
+        dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-amount);
+        userInfoService.updateById(dbUserInfo);
+
+        return resMap.get("return_msg");
+    }
+
+    @Override
+    @Transactional
+    public String wxwithbankdrawal(WxExtractBankDTO dto) throws Exception {
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        UserInfo dbUserInfo = userInfoService.getById(student.getId());
+        if (dbUserInfo.getProfitPrice() < dto.getAmount()){
+            throw new CustomException("提现金额不能大于可提现金额");
+        }
+
+        Map<String, String> sortMap = new TreeMap<String, String>();
+        sortMap.put("mch_id",wxpayConfig.getMerchantId());
+        sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
+        sortMap.put("partner_trade_no",getOrderCode(null));
+        sortMap.put("amount",String.valueOf(dto.getAmount()));
+        sortMap.put("desc","用户银行卡提现");
+
+
+
+
+        // 进行签名服务
+
+        sortMap.put("enc_true_name",rsaUtils.encryptData(dto.getEncTrueName()) );
+        sortMap.put("enc_bank_no",rsaUtils.encryptData(dto.getEncBankNo()));
+        sortMap.put("bank_code",dto.getBankCode().toString());
+
+
+        WXPayConfig config = new WxPayConfigImpl();
+        String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
+        sortMap.put("sign", sign);
+        WXPay pay = new WXPay(config);
+
+        String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
+        Map<String, String> resMap;
+        String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
+        resMap = XmlUtil.xmlToMap(xmlStr);
+        if (!"SUCCESS".equals(resMap.get("return_code"))||!"SUCCESS".equals(resMap.get("result_code"))){
+            throw new CustomException(resMap.get("return_msg"));
+        }
+        //新增提现记录
+        WxExtract wxExtract = new WxExtract();
+        wxExtract.setOpenid(student.getGzhOpenid());
+        wxExtract.setExtractPrice(dto.getAmount());
+        wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
+        wxExtract.setStatus("1");
+        wxExtractService.save(wxExtract);
+
+        //如果此卡之前未存储,则加入到银行卡列表
+        List<WxExtractBank> bankList = wxExtractBankService.list(new QueryWrapper<WxExtractBank>().eq("enc_bank_no", dto.getEncBankNo()));
+        if (CollectionUtils.isEmpty(bankList)){
+            WxExtractBank wxExtractBank = new WxExtractBank();
+            wxExtractBank.setBankCode(dto.getBankCode());
+            wxExtractBank.setEncBankNo(dto.getEncBankNo());
+            wxExtractBank.setEncTrueName(dto.getEncTrueName());
+            wxExtractBank.setOpenid(SecurityUtils.getLoginUser().getStudent().getGzhOpenid());
+            wxExtractBankService.save(wxExtractBank);
+        }
+
+
+        //更新余额
+        dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-dto.getAmount());
+        userInfoService.updateById(dbUserInfo);
+
+        return resMap.get("return_msg");
+    }
+
 
 }

+ 10 - 8
sdjk-system/src/main/java/com/miaxis/system/service/ISysConfigService.java

@@ -6,14 +6,14 @@ import java.util.List;
 
 /**
  * 参数配置 服务层
- * 
+ *
  * @author miaxis
  */
 public interface ISysConfigService
 {
     /**
      * 查询参数配置信息
-     * 
+     *
      * @param configId 参数配置ID
      * @return 参数配置信息
      */
@@ -21,7 +21,7 @@ public interface ISysConfigService
 
     /**
      * 根据键名查询参数配置信息
-     * 
+     *
      * @param configKey 参数键名
      * @return 参数键值
      */
@@ -29,7 +29,7 @@ public interface ISysConfigService
 
     /**
      * 查询参数配置列表
-     * 
+     *
      * @param config 参数配置信息
      * @return 参数配置集合
      */
@@ -37,7 +37,7 @@ public interface ISysConfigService
 
     /**
      * 新增参数配置
-     * 
+     *
      * @param config 参数配置信息
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface ISysConfigService
 
     /**
      * 修改参数配置
-     * 
+     *
      * @param config 参数配置信息
      * @return 结果
      */
@@ -53,7 +53,7 @@ public interface ISysConfigService
 
     /**
      * 批量删除参数信息
-     * 
+     *
      * @param configIds 需要删除的参数ID
      * @return 结果
      */
@@ -66,9 +66,11 @@ public interface ISysConfigService
 
     /**
      * 校验参数键名是否唯一
-     * 
+     *
      * @param config 参数信息
      * @return 结果
      */
     public String checkConfigKeyUnique(SysConfig config);
+
+    SysConfig selectConfigObjByKey(String key);
 }

+ 7 - 0
sdjk-system/src/main/java/com/miaxis/system/service/impl/SysConfigServiceImpl.java

@@ -185,6 +185,13 @@ public class SysConfigServiceImpl implements ISysConfigService
         return UserConstants.UNIQUE;
     }
 
+    @Override
+    public SysConfig selectConfigObjByKey(String key) {
+        SysConfig sysConfig = new SysConfig();
+        sysConfig.setConfigKey(key);
+        return configMapper.selectConfig(sysConfig);
+    }
+
     /**
      * 设置cache key
      *