Ver Fonte

Merge branch 'dev' into 'mp-server-test'

Dev

See merge request quanshu/mp-server!1047
Evan há 2 anos atrás
pai
commit
f600063757

+ 122 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java

@@ -10,12 +10,22 @@
 
 package com.qs.mp.web.controller.api.channel;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.eptok.yspay.opensdkjava.fund.BankAuthorityApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.SrcDesUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelBank;
 import com.qs.mp.channel.domain.ChannelBankCard;
 import com.qs.mp.channel.domain.ChannelCart;
 import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.param.ChannelBankCardCreateParam;
 import com.qs.mp.channel.domain.param.ChannelCartParam;
 import com.qs.mp.channel.domain.param.ChannelWithdrawParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
@@ -24,24 +34,33 @@ import com.qs.mp.channel.service.IChannelBankCardService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.constant.YsServerApiConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.YsCallLog;
 import com.qs.mp.common.domain.param.BatchLongIdsParam;
 import com.qs.mp.common.enums.ChannelStatusEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
+import com.qs.mp.common.service.IYsCallLogService;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.system.service.ISysConfigService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -52,7 +71,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/api/v1/mp/channel")
 @Api(tags = "渠道提现接口")
-@AllArgsConstructor
 public class ChannelWithdrawController extends BaseApiController {
 
 
@@ -82,6 +100,109 @@ public class ChannelWithdrawController extends BaseApiController {
    */
   private final String FEE_RATE_DEFAULT_VALUE = "0.8";
 
+
+  @Value("${ys-pay.partner-id}")
+  private String partnerId;
+
+  @Value("${ys-pay.private-key-pass}")
+  private String privateKeyPass;
+
+  @Value("${ys-pay.private-key-path}")
+  private String privateKeyPath;
+
+  @Value("${ys-pay.public-key-path}")
+  private String publicKeyPath;
+
+  @Autowired
+  private IYsCallLogService ysCallLogService;
+
+  @ApiOperation(value = "银行卡实名认证绑定")
+  @PostMapping("/withdraw/bankCardAuth")
+  public AjaxResult bankCardAuth(@Validated @RequestBody ChannelBankCardCreateParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+
+    // 判断是否已经绑定过银行卡
+    int count = channelBankCardService.count(new LambdaQueryWrapper<ChannelBankCard>()
+        .eq(ChannelBankCard::getChannelId, channelId));
+    if (count > 0) {
+      return AjaxResult.error("已经绑定过银行卡");
+    }
+
+
+    Map<String, String> mapData = new HashMap<>();
+    mapData.put("partner_id", partnerId);
+    mapData.put("method", "ysepay.authenticate.three.key.element.precise");
+    mapData.put("timestamp", DateUtil.getDateNow());
+    mapData.put("sign_type", "RSA");
+    mapData.put("charset", "utf-8");
+    mapData.put("version", "3.0");
+
+    JSONObject json = new JSONObject();
+    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+    json.put("out_trade_no", tradeNo);
+    json.put("shopdate", DateUtil.getDateNowYmd());
+    json.put("bank_account_name", param.getUserName());
+    json.put("bank_account_no", param.getCardNo());
+    json.put("id_card", param.getIdCard());
+    mapData.put("biz_content", json.toString());
+    //参数签名
+    try {
+      String sign = YsOnlineSignUtils.sign(mapData, privateKeyPass, privateKeyPath);
+      mapData.put("sign", sign);
+      logger.info("认证信息签名成功,sign = " + sign);
+    } catch (Exception e) {
+      System.err.println("签名异常" + e);
+    }
+
+    String result = null;
+    try {
+      logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(mapData));
+      result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
+    } catch (Exception e) {
+      logger.info("银行实名认证三要素失败:"+ e.getMessage());
+
+    }
+
+    // 保存银行认证的请求记录
+    YsCallLog ysCallLog = new YsCallLog();
+    ysCallLog.setBizId(tradeNo);
+    ysCallLog.setBizType(YsCallBizTypeEnum.BANK_CARD_AUTH);
+    ysCallLog.setReqJson(JSONObject.toJSONString(mapData));
+    ysCallLog.setResJson(result);
+    ysCallLogService.save(ysCallLog);
+
+    if (result == null) {
+      logger.error("银行实名认证三要素失败,res为空,req =" + JSONObject.toJSONString(mapData));
+      return AjaxResult.error("认证失败");
+    }
+
+    // 解析结果
+    JSONObject jsonObject = JSON.parseObject(result, Feature.OrderedField);
+    // 加签内容
+    JSONObject content = JSON.parseObject(
+        (String) jsonObject.get("ysepay_authenticate_three_key_element_precise_response"));
+
+    // 校验结果
+    String orderStatus = (String) content.get("order_status");
+    if (StringUtils.isNotBlank(orderStatus) && !"SUCCESS".equals(orderStatus)) {
+      return AjaxResult.error("绑卡认证失败,请核实信息正确性");
+    }
+
+    // 进行绑卡
+    ChannelBankCard channelBankCard = new ChannelBankCard();
+    channelBankCard.setChannelId(channelId);
+    channelBankCard.setBankName(param.getBankName());
+    channelBankCard.setIdCard(param.getIdCard());
+    channelBankCard.setCardNo(param.getCardNo());
+    channelBankCard.setUserName(param.getUserName());
+    boolean res = channelBankCardService.save(channelBankCard);
+    if (!res) {
+      return AjaxResult.error("绑卡失败");
+    }
+    return AjaxResult.success();
+  }
+
+
   /**
    * 渠道提现计算手续费
    */

+ 102 - 36
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -10,9 +10,13 @@ import cn.hutool.crypto.symmetric.DES;
 import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
 import cn.hutool.crypto.symmetric.SymmetricCrypto;
 import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.eptok.yspay.opensdkjava.fund.BankAuthorityApi;
 import com.eptok.yspay.opensdkjava.fund.MercFundApi;
 import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
 import com.eptok.yspay.opensdkjava.util.Base64Utils;
@@ -28,6 +32,7 @@ import com.qs.mp.admin.service.ICouponChannelService;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.IGoodsCardService;
+import com.qs.mp.common.constant.YsServerApiConstants;
 import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.UserTypeEnum;
@@ -48,6 +53,7 @@ import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.MarketingUserCode;
 import com.qs.mp.user.service.IMarketingUserCodeService;
 import com.qs.mp.utils.SecurityUtils;
+import com.taobao.api.Constants;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -69,6 +75,7 @@ import java.util.*;
  */
 @SpringBootTest
 public class MyTest {
+
     protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
 
@@ -126,9 +133,57 @@ public class MyTest {
     @Value("${ys-pay.private-key-path}")
     private String privateKeyPath;
 
+    @Value("${ys-pay.public-key-path}")
+    private String publicKeyPath;
+
+
+    /**
+     * 提现测试方法
+     */
+    @Test
+    void test20() {
+
+    }
+
+    @Test
+    void test19() {
+        // 调用接口校验
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        req.setReqUrl(YsServerApiConstants.OPEN_API);
+        req.setPartnerId(partnerId);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+
+        //银行实名认证三要素下单业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+        //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+        bizContent.put("out_trade_no", tradeNo);
+        //商户日期(该参数做交易与查询时需要一致)该日期需在当日的前后一天时间范围之内
+        bizContent.put("shopdate", DateUtil.getDateNowYmd());
+        //实名认证姓名--请填写真实信息
+        bizContent.put("bank_account_name", "张三");
+        //银行帐号,支持对公对私
+        bizContent.put("bank_account_no", "6212260488888888888");
+        //证件号码,目前只支持身份证
+        bizContent.put("id_card", "41022319940916602X");
+        req.setParamData(bizContent);
+
+        String result = null;
+        try {
+            logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:" + JSONObject.toJSONString(req));
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+            result = BankAuthorityApi.sendBankAuthThreePrecise(req);
+        } catch (Exception e) {
+            logger.info("银行实名认证三要素失败:" + e.getMessage());
+        }
+        System.out.println("result = " + result);
+    }
+
     @Test
     void test18() {
-        walletService.h5Pay(null,"0239021091223",100,"测试测试测试");
+        walletService.h5Pay(null, "0239021091224323", 100, "测试测试测试");
     }
 
     @Test
@@ -154,47 +209,59 @@ public class MyTest {
         bizContent.put("merchant_usercode", partnerId);//商户号
         req.setParamData(bizContent);
         String result = null;
-        try{
-            logger.info("账户余额查询调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+        try {
+            logger.info("账户余额查询调用sdk接口addScanMerc请求入参为:" + JSONObject.toJSONString(req));
             //根据返回结果处理自己的业务逻辑,result内容详见接口文档
             result = MercFundApi.getFundAccount(req);
-        }catch (Exception e){
-            logger.info("账户余额查询失败:"+ e.getMessage());
+        } catch (Exception e) {
+            logger.info("账户余额查询失败:" + e.getMessage());
         }
     }
 
+    /**
+     * 实名认证测试方法
+     * @throws Exception
+     */
     @Test
     void test16() throws Exception {
 
-        Map<String,String> mapData = new HashMap<>();
+        Map<String, String> mapData = new HashMap<>();
         mapData.put("partner_id", partnerId);
-        mapData.put("method","ysepay.authenticate.three.key.element.precise");
+        mapData.put("method", "ysepay.authenticate.three.key.element.precise");
         mapData.put("timestamp", DateUtil.getDateNow());
         mapData.put("sign_type", "RSA");
         mapData.put("charset", "utf-8");
         mapData.put("version", "3.0");
-        mapData.put("notify_url","http://127.0.0.1");
 //        mapData.put("out_trade_no", "202003276843192280647119");
 
         JSONObject json = new JSONObject();
         json.put("out_trade_no", DateUtil.getDateNowYmd() + DateUtil.getRandom(6));
-        json.put("shopdate","20200328");
-        json.put("bank_account_name", "张三");
+        json.put("shopdate", DateUtil.getDateNowYmd());
+        json.put("bank_account_name", "蒋浩");
         json.put("bank_account_no", "6212260488888888888");
-        json.put("id_card", SrcDesUtil.encryptData("ecolosha","41022319940916602X"));
-        mapData.put("biz_content",json.toString());
+        json.put("id_card", SrcDesUtil.encryptData(partnerId, "331081199909124619"));
+        mapData.put("biz_content", json.toString());
         //参数签名
-        try{
-            String mp1688 = YsfSignUtil.sign(mapData, "/Users/cup/Downloads/ysPayPre.pfx",privateKeyPass);
-            System.out.println("mp1688 = " + mp1688);
-            mapData.put("sign", mp1688);
-
-        } catch (Exception e){
+        try {
+            String sign = YsOnlineSignUtils.sign(mapData, privateKeyPass, privateKeyPath);
+            mapData.put("sign", sign);
+            System.out.println("sign = " + sign);
+        } catch (Exception e) {
             System.err.println("签名异常" + e);
         }
 
-        String post = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
-        System.out.println("返回" + post);
+        String result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
+
+        // 结果验签
+        JSONObject jsonObject = JSON.parseObject(result, Feature.OrderedField);
+        // 加签内容
+        String content = JSONObject.toJSONString(
+            jsonObject.get("ysepay_authenticate_three_key_element_precise_response"),
+            SerializerFeature.WriteMapNullValue);
+
+
+        System.out.println("返回" + result);
+        System.out.println("content = " + content);
 
     }
 
@@ -206,7 +273,7 @@ public class MyTest {
 
     @Test
     void test14() {
-        distributedLocker.tryLock("goods_card_lock_key_466",0,-1, TimeUnit.SECONDS);
+        distributedLocker.tryLock("goods_card_lock_key_466", 0, -1, TimeUnit.SECONDS);
     }
 
     @Test
@@ -233,9 +300,9 @@ public class MyTest {
 
 
     @Test
-    void test10(){
+    void test10() {
         for (int i = 0; i < 1; i++) {
-            couponService.distributeByMarketing(188L,"56");
+            couponService.distributeByMarketing(188L, "56");
         }
 
     }
@@ -250,7 +317,7 @@ public class MyTest {
     }
 
     @Test
-    void test8(){
+    void test8() {
         dayStatTask.stat("20220713");
     }
 
@@ -265,34 +332,34 @@ public class MyTest {
 
 
     @Test
-    void test6(){
+    void test6() {
 //        List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
 //                .select(MarketingUserCode::getUserId)
 //                .eq(MarketingUserCode::getMarketingId, 102)
 ////                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
 //                .groupBy(MarketingUserCode::getUserId));
         List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
-                .select(MarketingUserCode::getUserId)
-                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
-                .groupBy(MarketingUserCode::getUserId));
+            .select(MarketingUserCode::getUserId)
+            .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
+            .groupBy(MarketingUserCode::getUserId));
         userCodeList.forEach(System.out::println);
     }
 
     @Test
     void test5() {
-        Set<String> testSet =new HashSet<>();
+        Set<String> testSet = new HashSet<>();
         testSet.add("test1");
         testSet.add("test2");
         testSet.add("test3");
         testSet.add("test4");
-        redisCache.setCacheSet("testSet",testSet);
+        redisCache.setCacheSet("testSet", testSet);
         List<Object> list = new ArrayList<>();
         list.add("test1");
         list.add("test3");
         list.add("test5");
         list.add("test6");
         list.add("test7");
-        redisCache.removeSetValueByKey("testSet",list);
+        redisCache.removeSetValueByKey("testSet", list);
 
 
     }
@@ -311,7 +378,7 @@ public class MyTest {
 //        wxSubscribeMessage.sendMarketingHelp(188L, marketing);
 //        wxSubscribeMessage.sendMarketingHelp(79L, marketing);
     }
-    
+
     @Test
     void test2() throws IOException {
         marketingTask.lottery();
@@ -319,7 +386,7 @@ public class MyTest {
     }
 
     @Test
-    void test3(){
+    void test3() {
         for (int i = 0; i < 20; i++) {
             System.out.println("bizIdGenerator = " + bizIdGenerator.newId());
         }
@@ -327,10 +394,9 @@ public class MyTest {
     }
 
 
-
     @Test
-    void test1(){
-        walletService.refund("968527112497659906",10,"测试");
+    void test1() {
+        walletService.refund("968527112497659906", 10, "测试");
     }
 
 }

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/enums/YsCallBizTypeEnum.java

@@ -15,7 +15,12 @@ public enum YsCallBizTypeEnum implements IEnum<Integer> {
 
     ORDER_PAY(1,"订单支付"),
 
-    DIVISION(2,"分账");
+    DIVISION(2,"分账"),
+
+
+    BANK_CARD_AUTH(3, "银行卡身份认证"),
+
+    ;
 
 
     private final int value;

+ 34 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelBankCardCreateParam.java

@@ -0,0 +1,34 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 渠道银行卡创建入参类
+ * @author Evan
+ * @date 2023/3/30
+ */
+@ApiModel("渠道银行卡创建入参类")
+@Data
+public class ChannelBankCardCreateParam {
+
+    @NotBlank(message = "姓名不内外空")
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    @NotBlank(message = "身份证号不能为空")
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    @NotBlank(message = "银行名称不能为空")
+    @ApiModelProperty("银行名称")
+    private String bankName;
+
+    @NotBlank(message = "银行卡号不能为空")
+    @ApiModelProperty("银行卡号")
+    private String cardNo;
+
+
+}

+ 19 - 8
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -204,14 +204,25 @@ public class WalletServiceImpl implements IWalletService {
 
 //    String result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", params);
 //
-//    // 保存调用记录
-//    YsCallLog ysCallLog = new YsCallLog();
-//    ysCallLog.setBizId(orderId);
-//    ysCallLog.setBizType(YsCallBizTypeEnum.ORDER_PAY);
-//    ysCallLog.setInterfaceId(YsPayMethodConstants.H5_PAY_METHOD);
-//    ysCallLog.setReqJson(JSONObject.toJSONString(params));
-//    ysCallLog.setResJson(result);
-//    ysCallLogService.save(ysCallLog);
+    // 保存调用记录
+    YsCallLog ysCallLog = new YsCallLog();
+    ysCallLog.setBizId(orderId);
+    ysCallLog.setBizType(YsCallBizTypeEnum.ORDER_PAY);
+    ysCallLog.setInterfaceId(YsPayMethodConstants.H5_PAY_METHOD);
+    ysCallLog.setReqJson(JSONObject.toJSONString(params));
+    ysCallLogService.save(ysCallLog);
+
+//
+//    String result = "https://openapi.ysepay.com/gateway.do?";
+//    for (String key : params.keySet()) {
+//      result += key + "=" + params.get(key);
+//      // 如果是最后一个,则不再末尾加上&
+//      if (key != params.keySet().toArray()[params.keySet().size() - 1]) {
+//          result += "&";
+//      }
+//    }
+//    System.out.println("result = " + result);
+
 //
 //    //保存订单记录
 //    PayOrder payOrder = new PayOrder();