Althars123 3 yıl önce
ebeveyn
işleme
e5f0983189

+ 73 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -3,6 +3,11 @@ package com.miaxis.app.controller.wx;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+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.constant.Constants;
 import com.miaxis.common.core.controller.BaseController;
@@ -12,10 +17,13 @@ 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.SecurityUtils;
+import com.miaxis.common.utils.XmlUtil;
 import com.miaxis.common.utils.uuid.CommonUtils;
 import com.miaxis.system.service.ISysDictDataService;
+import com.miaxis.wx.domain.WxExtract;
 import com.miaxis.wx.domain.WxOrder;
 import com.miaxis.wx.dto.WxOrderDTO;
+import com.miaxis.wx.service.IWxExtractService;
 import com.miaxis.wx.service.IWxOrderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -40,6 +48,8 @@ import java.io.File;
 import java.security.PrivateKey;
 import java.security.Signature;
 import java.util.Base64;
+import java.util.Map;
+import java.util.TreeMap;
 
 import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
 
@@ -69,6 +79,10 @@ public class WxController extends BaseController {
     @Autowired
     private ISysDictDataService dictDataService;
 
+
+    @Autowired
+    private IWxExtractService wxExtractService;
+
     @Value("${app.appid}")
     private String appid;
     @Value("${wxpay.notifyUrl}")
@@ -79,6 +93,7 @@ public class WxController extends BaseController {
 
 
 
+
     /**
      * 微信支付获取预订单id
      */
@@ -191,6 +206,64 @@ public class WxController extends BaseController {
         return jsonObject;
     }
 
+
+    /**
+     * 微信提现
+     */
+    @PostMapping(value = "/withdraw")
+    @ApiOperation("微信提现")
+    public Response getPrepareOrder(Integer amount) throws Exception{
+
+        if (amount == null){
+            throw new CustomException("提现金额不能为空");
+
+        }
+        if (amount > 200 && amount <0){
+            throw new CustomException("提现金额必须在200以内");
+        }
+
+        return Response.success(withdrawal(amount));
+
+
+    }
+
+
+
+    private String withdrawal(Integer amount) throws Exception {
+
+        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",SecurityUtils.getLoginUser().getStudent().getOpenid());
+        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(SecurityUtils.getLoginUser().getStudent().getOpenid());
+        wxExtract.setExtractPrice(amount);
+        wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
+        wxExtract.setStatus("1");
+        wxExtractService.save(wxExtract);
+
+        return resMap.get("return_msg");
+    }
+
     private HttpPost initHttpPost() {
         HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
         httpPost.addHeader("Accept", "application/json");

+ 1 - 1
twzd-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java

@@ -137,7 +137,7 @@ public class SysLoginController
     @ApiOperation("用户授权码模式登录--测试")
     public Response<TokenDTO> testloginByAuthorizationCode(String authorizationCode ){
         WxUserInfo wxUserInfo = new WxUserInfo();
-        wxUserInfo.setOpenid("ovKTX5zYvp9OXE43ADwLa1RHna0g");
+        wxUserInfo.setOpenid("ovKTX5-FKLF6_sgTtCIXpG_lz3PY");
         wxUserInfo.setNickname("Sss");
         wxUserInfo.setSex("0");
         wxUserInfo.setHeadimgurl("https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83erGMFzKaOmz6cIaA0J1nicWSlBLdLKY46N5CNCoASiajT7Z3RIfPngPhJsjmqsSjGCFibPU4vCtfz3aw/132");

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

@@ -98,7 +98,7 @@ wxpay:
     v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
     notifyUrl: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/wxpay
     notifyUrlRefund: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/refund
-
+    appId: wx67ca1b8c9816ef28
 
 # 腾讯cos
 cos:

+ 6 - 0
twzd-common/pom.xml

@@ -152,6 +152,12 @@
             <version>5.6.38</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.wxpay</groupId>
+            <artifactId>wxpay-sdk</artifactId>
+            <version>0.0.3</version>
+        </dependency>
+
         <!--腾讯云sdk依赖,排除log4j依赖,解决与框架中logback的冲突-->
         <dependency>
             <groupId>com.qcloud</groupId>

+ 94 - 0
twzd-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:\\twzd\\twzd\\twzd-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 "wx67ca1b8c9816ef28";
+    }
+
+    @Override
+    public String getMchID() {
+        return "1615410794";
+    }
+
+    @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;
+    }
+}

+ 30 - 0
twzd-service/src/main/java/com/miaxis/feign/service/IWxWithdrawalService.java

@@ -0,0 +1,30 @@
+package com.miaxis.feign.service;
+
+import com.miaxis.common.config.FeignConfig;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+
+/**
+ * 微信提现接口
+ * @author chenjian
+ */
+@FeignClient(name="wxWithdrawalService",
+        url = "https://api.mch.weixin.qq.com/mmpaymkttransfers",configuration = FeignConfig.class)
+public interface IWxWithdrawalService {
+
+
+    /**
+     * 提现接口
+     */
+    @PostMapping(value = "/promotion/transfers",consumes = MediaType.APPLICATION_XML_VALUE,produces = MediaType.APPLICATION_XML_VALUE)
+    String transfers(@RequestBody String params);
+
+
+
+
+
+
+}

+ 9 - 3
twzd-service/src/main/java/com/miaxis/wx/domain/WxExtract.java

@@ -33,6 +33,12 @@ public class WxExtract extends BaseBusinessEntity{
     @ApiModelProperty(value = "用户唯一标识(微信)")
     private String openid;
 
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("partner_trade_no")
+    @ApiModelProperty(value = "商户订单号")
+    private String partnerTradeNo;
+
     /** 用户唯一标识(微信) */
     @Excel(name = "备注")
     @TableField("remark")
@@ -43,7 +49,7 @@ public class WxExtract extends BaseBusinessEntity{
     @Excel(name = "提现金额(分)")
     @TableField("extract_price")
     @ApiModelProperty(value = "提现金额(分)")
-    private Long extractPrice;
+    private Integer extractPrice;
 
     /** 状态  1:提现成功、2:提现失败 */
     @Excel(name = "状态  1:提现成功、2:提现失败")
@@ -65,11 +71,11 @@ public class WxExtract extends BaseBusinessEntity{
     public String getOpenid(){
         return openid;
     }
-    public void setExtractPrice(Long extractPrice){
+    public void setExtractPrice(Integer extractPrice){
         this.extractPrice = extractPrice;
     }
 
-    public Long getExtractPrice(){
+    public Integer getExtractPrice(){
         return extractPrice;
     }
     public void setStatus(String status){