Ver código fonte

分账功能

zhangbin 1 ano atrás
pai
commit
aff1bbe8ed

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

@@ -118,6 +118,7 @@ gzh3:
 
 # 小程序
 xcx:
+    mchId: 1639487489
     appId: wx97bbc22daac9362a
     appSecret: e67435002c220ef2f69a1b43508c61ec
 

+ 1 - 0
nbjk-admin/src/main/resources/application-local.yml

@@ -119,6 +119,7 @@ gzh3:
 
 # 小程序
 xcx:
+    mchId: 1639487489
     appId: wx97bbc22daac9362a
     appSecret: e67435002c220ef2f69a1b43508c61ec
 

+ 18 - 0
nbjk-admin/src/test/java/com/miaxis/test/Test3.java

@@ -0,0 +1,18 @@
+package com.miaxis.test;
+
+public class Test3 {
+
+    public static void main(String[] args) {
+
+        double f =  990-(990*0.01);
+
+        System.out.println(f);
+
+      //  double f2 = Math.floor(f);
+
+      //  System.out.println(f2);
+
+
+    }
+
+}

+ 31 - 0
nbjk-admin/src/test/java/com/miaxis/test/WxFenZhangTest.java

@@ -0,0 +1,31 @@
+package com.miaxis.test;
+
+import com.miaxis.NbjkApplication;
+import com.miaxis.wx.service.IWxGzhService;
+import com.miaxis.wx.service.IWxOrderService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@SpringBootTest(classes = NbjkApplication.class)
+@RunWith(SpringRunner.class)
+public class WxFenZhangTest {
+
+    @Autowired
+    private IWxGzhService wxGzhService;
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+    @Test
+    public void test1() throws Exception {
+
+        wxOrderService.wxAddFenZhang();
+
+    }
+
+
+
+}
+

+ 2 - 2
nbjk-common/src/main/java/com/miaxis/common/config/WxPayConfigImpl.java

@@ -51,7 +51,7 @@ public class WxPayConfigImpl implements WXPayConfig {
 
     @Override
     public String getAppID() {
-        return "wx3043c2c1decb01ed";
+        return "wx97bbc22daac9362a";
     }
 
     @Override
@@ -61,7 +61,7 @@ public class WxPayConfigImpl implements WXPayConfig {
 
     @Override
     public String getKey() {
-        return "qqwweerrttyyuuiioopp123456789000";
+        return "PIQKEpG1FEoBEELgv0GUxkUJKTkc0jGB";
     }
 
     @Override

+ 13 - 1
nbjk-service/src/main/java/com/miaxis/order/domain/OrderInfo.java

@@ -90,13 +90,25 @@ public class OrderInfo extends BaseBusinessEntity{
     @ApiModelProperty(value = "退款订单编号")
     private String outRefundNo;
 
+    /** 分账订单编号 */
+    @Excel(name = "订单编号")
+    @TableField("out_split_no")
+    @ApiModelProperty(value = "订单编号")
+    private String outSplitNo;
 
-    /** 总金额*/
+
+    /** 总金额 */
     @Excel(name = "总金额")
     @TableField("total")
     @ApiModelProperty(value = "总金额")
     private Integer total;
 
+    /** 分账金额 */
+    @Excel(name = "分账金额")
+    @TableField("split_price")
+    @ApiModelProperty(value = "分账金额")
+    private Integer splitPrice;
+
     /** 交易状态 1、支付成功2、支付失败*/
     @Excel(name = "交易状态 1、支付成功2、支付失败")
     @TableField("trade_type")

+ 5 - 3
nbjk-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java

@@ -1,6 +1,7 @@
 package com.miaxis.wx.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.miaxis.common.core.domain.entity.SysDictData;
 import com.miaxis.wx.domain.WxOrder;
 import com.miaxis.wx.dto.*;
@@ -13,13 +14,14 @@ import java.util.List;
 public interface IWxOrderService extends IService<WxOrder>{
 
 
-    WxOrder getByOutTradeNo(String outTradeNo);
+    String wxAddFenZhang() throws Exception;
+
+    String wxProfitsharing(WxOrder wxOrder) throws  Exception;
 
+    WxOrder getByOutTradeNo(String outTradeNo);
 
     String wxwithdrawal(Integer amount) throws Exception;
 
     String wxwithbankdrawal(WxExtractBankDTO amount) throws Exception;
 
-    @Transactional
-    String wxfenZhang(Integer amount) throws Exception;
 }

+ 109 - 75
nbjk-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

@@ -3,27 +3,24 @@ package com.miaxis.wx.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.core.domain.entity.SysDictData;
 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.order.domain.OrderInfo;
+import com.miaxis.order.service.IOrderInfoService;
 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.IWxExtractBankService;
@@ -31,10 +28,6 @@ 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.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -42,7 +35,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.io.ByteArrayOutputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -59,8 +51,6 @@ import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
 @Slf4j
 public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> implements IWxOrderService {
 
-    @Autowired
-    private HttpClient httpClient;
 
     @Resource
     private WxOrderMapper wxOrderMapper;
@@ -68,6 +58,9 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
     @Autowired
     private IWxExtractService wxExtractService;
 
+    @Autowired
+    private IOrderInfoService orderInfoService;
+
     @Autowired
     private RSAUtils rsaUtils;
 
@@ -82,12 +75,96 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
     @Autowired
     private IWxExtractBankService wxExtractBankService;
 
-    @Value("${gzh.appid}")
-    private String appid;
-
-    @Value("${xcx.appid}")
+    @Value("${xcx.appId}")
     private String xcxAppid;
 
+    @Value("${xcx.mchId}")
+    private String mchId;
+
+
+    @Override
+    @Transactional
+    public String wxAddFenZhang() throws Exception {
+        String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
+
+        String nonceStr = RandomStringUtils.randomAlphanumeric(32);
+        //用于签名
+        Map<String, String> sortMap = new TreeMap<String, String>();
+        sortMap.put("mch_id", mchId);
+        sortMap.put("appid", xcxAppid);
+        sortMap.put("nonce_str", nonceStr);
+        sortMap.put("sign_type", "HMAC-SHA256");
+        Map<String, String> receiverMap = new TreeMap<String, String>();
+        receiverMap.put("type", "PERSONAL_OPENID");
+        receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
+        receiverMap.put("relation_type", "SERVICE_PROVIDER");  //合作合伙
+        ObjectMapper objectMapper = new ObjectMapper();
+        String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
+        sortMap.put("receiver", receiverMapJson);
+
+        WXPayConfig config = new WxPayConfigImpl();
+        String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
+        sortMap.put("sign", sign);
+
+        WXPay pay = new WXPay(config);
+        String xmlStr = pay.requestWithoutCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
+
+        Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
+        if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
+            throw new CustomException("微信添加分账出错");
+        }
+        System.out.println(xmlStr);
+        return null;
+    }
+
+
+    /**
+     * @return
+     * @throws Exception
+     */
+    @Override
+    @Transactional
+    public String wxProfitsharing(WxOrder wxOrder) throws Exception {
+        String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
+        String nonceStr = RandomStringUtils.randomAlphanumeric(32);
+        //用于签名
+        Map<String, String> sortMap = new TreeMap<String, String>();
+        sortMap.put("mch_id", mchId);
+        sortMap.put("appid", xcxAppid);
+        sortMap.put("nonce_str", nonceStr);
+        sortMap.put("sign_type", "HMAC-SHA256");
+        sortMap.put("transaction_id", wxOrder.getTransactionId());
+        String orderCode = getOrderCode(wxOrder.getUserId()); //商户分账单号
+        sortMap.put("out_order_no", orderCode);
+
+        //扣除手续费后
+        double commission = wxOrder.getTotal() * 0.01;
+        double total = wxOrder.getTotal() - commission;
+        int amount = (int) Math.floor(total * 0.3);
+
+        Map<String, Object> receiverMap = new TreeMap<String, Object>();
+        receiverMap.put("type", "PERSONAL_OPENID");
+        receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
+        receiverMap.put("amount", amount);
+        receiverMap.put("description", "分到个人");  //合作合伙
+        ObjectMapper objectMapper = new ObjectMapper();
+        String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
+        sortMap.put("receiver", receiverMapJson);
+
+        WXPayConfig config = new WxPayConfigImpl();
+        String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
+        sortMap.put("sign", sign);
+
+        WXPay pay = new WXPay(config);
+        String xmlStr = pay.requestWithoutCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
+
+        //更新成交订单表
+        OrderInfo orderInfo = orderInfoService.getByOutTradeNo(wxOrder.getOutTradeNo());
+        orderInfo.setOutSplitNo(orderCode);
+        orderInfoService.updateById(orderInfo);
+
+        return null;
+    }
 
 
     @Override
@@ -106,14 +183,14 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
 //        }
 
         Map<String, String> sortMap = new TreeMap<String, String>();
-        sortMap.put("mch_appid",appid);
-        sortMap.put("mchid",wxpayConfig.getMerchantId());
+        sortMap.put("mch_appid", mchId);
+        sortMap.put("mchid", wxpayConfig.getMerchantId());
         sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
-        sortMap.put("partner_trade_no",getOrderCode(null));
+        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","用户提现");
+        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);
@@ -124,7 +201,7 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
         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"))){
+        if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
             throw new CustomException(resMap.get("return_msg"));
         }
         //新增提现记录
@@ -152,20 +229,18 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
 //        }
 
         Map<String, String> sortMap = new TreeMap<String, String>();
-        sortMap.put("mch_id",wxpayConfig.getMerchantId());
+        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("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());
+        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();
@@ -177,7 +252,7 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
         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"))){
+        if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
             throw new CustomException(resMap.get("return_msg"));
         }
         //新增提现记录
@@ -190,7 +265,7 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
 
         //如果此卡之前未存储,则加入到银行卡列表
         List<WxExtractBank> bankList = wxExtractBankService.list(new QueryWrapper<WxExtractBank>().eq("enc_bank_no", dto.getEncBankNo()));
-        if (CollectionUtils.isEmpty(bankList)){
+        if (CollectionUtils.isEmpty(bankList)) {
             WxExtractBank wxExtractBank = new WxExtractBank();
             wxExtractBank.setBankCode(dto.getBankCode());
             wxExtractBank.setEncBankNo(dto.getEncBankNo());
@@ -208,45 +283,4 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
     }
 
 
-    @Override
-    @Transactional
-    public String wxfenZhang(Integer amount) throws Exception {
-        HttpPost httpPost = initHttpPost("https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver");
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        ObjectNode rootNode = objectMapper.createObjectNode();
-        String nonceStr = RandomStringUtils.randomAlphanumeric(32);
-        rootNode.put("mchid",wxpayConfig.getMerchantId());
-        rootNode.put("appid",xcxAppid);
-        rootNode.put("nonce_str", nonceStr);
-
-        //用于签名
-        Map<String,String> sortMap = new TreeMap<String,String>();
-        sortMap.put("mchid",wxpayConfig.getMerchantId());
-        sortMap.put("appid",xcxAppid);
-        sortMap.put("nonce_str",nonceStr);
-
-        WXPayConfig config = new WxPayConfigImpl();
-        String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
-        rootNode.put("sign", sign);
-        rootNode.put("sign_type", "HMAC-SHA256");
-
-        String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
-        httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
-        HttpResponse response = httpClient.execute(httpPost);
-
-
-
-
-        return null;
-    }
-
-    private HttpPost initHttpPost(String url) {
-        HttpPost httpPost = new HttpPost(url);
-        httpPost.addHeader("Accept", "application/json");
-        httpPost.addHeader("Content-type","application/json; charset=utf-8");
-        return httpPost;
-    }
-
 }

+ 2 - 1
nbjk-service/src/main/resources/mapper/order/OrderInfoMapper.xml

@@ -13,7 +13,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="appOpenid"    column="app_openid"    />
         <result property="xcxOpenid"    column="xcx_openid"    />
         <result property="gzhOpenid"    column="gzh_openid"    />
-        <result property="out_trade_no"    column="outTradeNo"    />
+        <result property="outTradeNo"    column="out_trade_no"    />
+        <result property="outSplitNo"    column="out_split_no"    />
         <result property="outRefundNo"    column="out_refund_no"    />
         <result property="total"    column="total"    />
         <result property="tradeType"    column="trade_type"    />