Kaynağa Gözat

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

H5支付调试

See merge request quanshu/mp-server!1039
Evan 2 yıl önce
ebeveyn
işleme
75b77198ab

+ 8 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -17,6 +17,7 @@ import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.PromoterVO;
 import com.qs.mp.channel.service.IPromoterUserService;
+import com.qs.mp.common.constant.PayConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
@@ -256,11 +257,11 @@ public class UserTicketOrderController extends BaseApiController {
         Long userId = SecurityUtils.getLoginUser().getUserId();
         SysUser sysUser = sysUserService.selectUserById(userId);
         String openId = "";
-        if (param.getPayType() == 1) {
+        if (PayConstants.ALI_PAY_TYPE.equals(param.getPayType())) {
             if (StringUtils.isBlank(sysUser.getAliuserId())) {
                 return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
             }
-        } else {
+        } else if (PayConstants.WX_PAY_TYPE.equals(param.getPayType())){
             AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(param.getAppSource());
             if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
                 if (StringUtils.isBlank(sysUser.getMsdqOpenId())) {
@@ -278,10 +279,14 @@ public class UserTicketOrderController extends BaseApiController {
         UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
         JSONObject jsonObject;
         try {
-            if (param.getPayType() == 1) {
+            if (PayConstants.ALI_PAY_TYPE.equals(param.getPayType())) {
                 // 支付宝支付
                 jsonObject = walletService.directAliPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getAliuserId(),
                     ticketOrder.getPayAmt(), ticketOrder.getTitle());
+            } else if ((PayConstants.H5_PAY_TYPE.equals(param.getPayType()))) {
+                // H5支付
+                jsonObject = walletService.h5Pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(),
+                    ticketOrder.getPayAmt(), ticketOrder.getTitle());
             } else {
                 // 微信支付
                 jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), openId,

+ 10 - 0
mp-admin/src/main/resources/application-dev.yml

@@ -141,3 +141,13 @@ shipping:
     channel: 7
 bind:
     channelId: 2
+
+# 银盛支付配置
+ys-pay:
+    private-key-path: /Users/cup/WORK/data/ysPay/ysPayPre.pfx
+    public-key-path: /Users/cup/WORK/data/ysPay/ysPayPub.cer
+    # 支付完后跳转
+    return-url: https://test-mp-h5.quanshu123.com
+    # 回调地址
+    notify-url: https://www.quanshu123.com
+

+ 11 - 0
mp-admin/src/main/resources/application.yml

@@ -158,6 +158,17 @@ pay:
   msdq-shopNo: 1657242588900
   msdq-sign: e39069383c6944a18abc0b03a4ad0217
 
+# 银盛支付配置
+ys-pay:
+  serverUrl: https://openapi.ysepay.com/gateway.do
+  # 商户号
+  partner-id: ecoloshare
+  private-key-pass: FAl9S8TmGB80
+  # 主收款商户号
+  master-seller-id: 0000400267870283
+  # 子商户号
+  child-seller-id: 0000400267870291
+
 #幸运数字加密密钥对
 rsa:
   private-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJsdnYuNQGwzutcBPzVXXP9oizi5nVMlI4IohcoLH5iV2dZ39XkcWMbjithn4FBe2Y7N7lougVCRtSyOCLc63vJ9V2w7NrqHnQVIOkse9XhiBNEpQy9PKEm1lM9lZZL6fya4UDaYzGZUD9qq7FzNBBvXwhlXP3Bj4uSodf1M4HmBAgMBAAECgYB43EJ9Ebo4lLXoANi3PzL+7v5LXJTwy+c260wTeUdNJLVvHljt3OBvV6w/ofBtrvnlAx/MtJ+dn2qDJMg1vHEpWPVwTvL+8cqih5RwD6TBG9WH4ERF1fb40Z5FD+muDHK5ubgZNGicPH7T0/L6GYrGCeF9PS6sP+FvdywE5xHKgQJBANI2cpqM8B4c+LC3yQEQDJFbid1EaJEWeX9pHglAn7HhAJgpVCPO3vLainZ9Y2mgyR9ZntWW46YmtRWEOha/Lp0CQQC85u9CE1JPJGyYhIPw8+VVvdWlXzOzYIxtuQjr7ryMMYJttXLbp2q30rCRICyzsmpR26s+GXFGgo5XusvRoS81AkEAwID8EmxeuDTvyWWEvWRlHfgmGGs9FyDtwrAQwYhcthjG4pF2bBRWNy/K/Rd2opSLmhoISrETaGSqEDo2t/38QQJAK69sXWeCfXL6+jqLGMoOm0mPgvMFTdJiJ23HNmi7ieBZPW3c5hdNgr1iv+0k6Vm1ZMDcVTwlCh1fNcKpKA2SkQJBAL0DAXA26tk6LUWdBkXp54dJV/nm4/NDN6KWB+Tu5kcqteW7qCqgBToWJsxv6wLIcd5T20875gns1Btt1Vsq9Ss=

+ 90 - 4
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -9,8 +9,17 @@ import cn.hutool.crypto.SecureUtil;
 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.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.eptok.yspay.opensdkjava.fund.MercFundApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.Base64Utils;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.SrcDesUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
+import com.eptok.yspay.opensdkjava.util.YsfSignUtil;
 import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.GoodsCard;
@@ -27,6 +36,7 @@ import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.common.utils.WebhookService;
 import com.qs.mp.common.utils.html.EscapeUtil;
+import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.common.utils.uuid.IdUtils;
 import com.qs.mp.common.utils.uuid.UUID;
 import com.qs.mp.framework.service.IWxSubscribeMessage;
@@ -41,10 +51,12 @@ import com.qs.mp.utils.SecurityUtils;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.http.client.methods.HttpRequestBase;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import java.io.IOException;
@@ -102,11 +114,85 @@ public class MyTest {
     @Autowired
     private TicketOrderTask ticketOrderTask;
 
-    public static void main(String[] args) {
-        WebhookService.sendAlertDing("mayday,mayday,上上下下,左右左右,BABA");
+    @Value("${ys-pay.serverUrl}")
+    private String serverUrl;
 
-        String decrypt = AESUtil.decrypt("75213771c6c781d62136e39180303be03f0a99761114c1264f116051a9e95108");
-        System.out.println("decrypt = " + decrypt);
+    @Value("${ys-pay.partner-id}")
+    private String partnerId;
+
+    @Value("${ys-pay.private-key-pass}")
+    private String privateKeyPass;
+
+
+    @Test
+    void test18() {
+        walletService.h5Pay(null,"023902109123",100,"测试测试测试");
+    }
+
+    @Test
+    void test17() {
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        //请求路径,建议配置在项目的配置文件里面
+        String reqUrl = "https://commonapi.ysepay.com/gateway.do";
+        //私钥证书存放路径,建议配置在项目的配置文件里面
+        String privateKeyFilePath = "/Users/cup/Downloads/ysPayPre.pfx";
+        //ys公钥证书存放地址 建议配置在项目的配置文件里面
+        String publicKeyFilePath = "/Users/cup/Downloads/ysPayPub.cer";
+        //私钥证书密钥,建议配置在项目的配置文件里面
+        String privateKeyPassworde = "FAl9S8TmGB80";
+
+        //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
+        req.setPartnerId(partnerId);
+        req.setReqUrl(reqUrl);
+        req.setPrivateKeyFilePath(privateKeyFilePath);
+        req.setPrivateKeyPassword(privateKeyPassworde);
+        req.setYsPublicKeyFilePath(publicKeyFilePath);
+        //商户余额查询业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        bizContent.put("merchant_usercode", partnerId);//商户号
+        req.setParamData(bizContent);
+        String result = null;
+        try{
+            logger.info("账户余额查询调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+            result = MercFundApi.getFundAccount(req);
+        }catch (Exception e){
+            logger.info("账户余额查询失败:"+ e.getMessage());
+        }
+    }
+
+    @Test
+    void test16() throws Exception {
+
+        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");
+        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("bank_account_no", "6212260488888888888");
+        json.put("id_card", SrcDesUtil.encryptData("ecolosha","41022319940916602X"));
+        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){
+            System.err.println("签名异常" + e);
+        }
+
+        String post = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
+        System.out.println("返回" + post);
 
     }
 

+ 17 - 0
mp-common/src/main/java/com/qs/mp/common/constant/PayConstants.java

@@ -0,0 +1,17 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 支付相关常量定义
+ * @author Evan
+ * @date 2023/3/27
+ */
+public class PayConstants {
+
+    /** 支付宝*/
+    public static Integer ALI_PAY_TYPE = 1;
+    /** 微信*/
+    public static Integer WX_PAY_TYPE = 2;
+    /** H5*/
+    public static Integer H5_PAY_TYPE = 3;
+
+}

+ 14 - 0
mp-common/src/main/java/com/qs/mp/common/constant/YsPayMethodConstants.java

@@ -0,0 +1,14 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 银盛相关方法常量
+ * @author Evan
+ * @date 2023/3/28
+ */
+public class YsPayMethodConstants {
+
+    /** H5支付方法 */
+    public static String H5_PAY_METHOD = "ysepay.online.wap.directpay.createbyuser";
+
+
+}

+ 14 - 0
mp-common/src/main/java/com/qs/mp/common/constant/YsServerApiConstants.java

@@ -0,0 +1,14 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 盈盛服务API地址常量
+ * @author Evan
+ * @date 2023/3/28
+ */
+public class YsServerApiConstants {
+
+    public static String OPEN_API = "https://openapi.ysepay.com/gateway.do";
+
+    public static String SEARCH_API = "https://search.ysepay.com/gateway.do";
+
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java

@@ -15,7 +15,7 @@ public class OrderPayParam {
 	private String orderId;
 
 	@NotNull(message = "支付方式不能为空")
-	@ApiModelProperty(value = "支付方式:1支付宝,2微信",required=true)
+	@ApiModelProperty(value = "支付方式:1支付宝,2微信,3-H5",required=true)
 	private Integer payType;
 
 

+ 4 - 0
mp-service/src/main/java/com/qs/mp/pay/domain/PayOrder.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qs.mp.common.enums.BizTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -26,6 +27,9 @@ public class PayOrder implements Serializable {
   @TableId(value = "order_id" , type = IdType.INPUT)
   private String orderId;
 
+  @ApiModelProperty("商户系统生成的订单号")
+  private String tradeNo;
+
   /**
    * 订单类型,1:渠道订单,2用户订单
    */

+ 12 - 0
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -11,6 +11,18 @@ import com.qs.mp.pay.domain.PayOrder;
  */
 public interface IWalletService {
 
+
+  /**
+   * 银盛h5支付
+   * @param bizType
+   * @param bizId
+   * @param money
+   * @param orderRemark
+   * @return
+   */
+  JSONObject h5Pay(BizTypeEnum bizType, String bizId, int money, String orderRemark);
+
+
   /**
    * 支付宝直连支付
    * @param bizType

+ 67 - 0
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -9,7 +9,15 @@ import com.alipay.api.request.AlipayTradeCreateRequest;
 import com.alipay.api.response.AlipayTradeCreateResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.eptok.yspay.opensdkjava.common.Constants;
+import com.eptok.yspay.opensdkjava.orderpay.AppPayApi;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.HttpClientUtil;
+import com.eptok.yspay.opensdkjava.util.StringUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
 import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.constant.YsPayMethodConstants;
+import com.qs.mp.common.constant.YsServerApiConstants;
 import com.qs.mp.common.enums.AppSourceEnum;
 import com.qs.mp.common.enums.AsyncTaskTypeEnum;
 import com.qs.mp.common.enums.BizTypeEnum;
@@ -17,6 +25,7 @@ import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.PayOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
+import com.qs.mp.common.service.IYsCallLogService;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
@@ -75,6 +84,9 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IAsyncTaskService asyncTaskService;
 
+  @Autowired
+  private IYsCallLogService ysCallLogService;
+
   @Value("${pay.notifyUrl}")
   private String notifyUrl;  //支付成功前端跳转地址
   @Value("${pay.callbackUrl}")
@@ -129,6 +141,61 @@ public class WalletServiceImpl implements IWalletService {
   private AlipayClient alipayClient = null;
 
 
+  @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;
+
+  @Value("${ys-pay.master-seller-id}")
+  private String masterSellerId;
+
+  @Value("${ys-pay.child-seller-id}")
+  private String childSellerId;
+
+  @Value("${ys-pay.return-url}")
+  private String ysReturnUrl;
+  @Value("${ys-pay.notify-url}")
+  private String ysNotifyUrl;
+
+  @Override
+  public JSONObject h5Pay(BizTypeEnum bizType, String bizId, int money, String orderRemark) {
+    Map<String, String> params = new HashMap<>();
+    String orderId = String.valueOf(bizIdGenerator.newId());
+    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+    params.put("method", YsPayMethodConstants.H5_PAY_METHOD);
+    params.put("partner_id", partnerId);
+    params.put("timestamp", DateUtil.getDateNow());
+    params.put("charset", Constants.CHARSET_UTF_8);
+    params.put("sign_type", "RSA");
+    params.put("notify_url", ysNotifyUrl);
+    params.put("return_url", ysReturnUrl);
+    params.put("seller_id", partnerId);
+    params.put("version","3.0");
+    params.put("out_trade_no", tradeNo);
+    params.put("shopdate", DateUtil.getDateNowYmd());
+    params.put("subject", orderRemark);
+    params.put("total_amount", new BigDecimal(money).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+    params.put("timeout_express","96h");
+    params.put("business_code", "3010002");
+    try {
+      String sign = YsOnlineSignUtils.sign(params, privateKeyPass, privateKeyPath);
+      params.put("sign", sign);
+    } catch (Exception e) {
+      logger.error("签名失败,bizId=" + bizId, e);
+      throw new ServiceException("支付发起签名失败");
+    }
+    JSONObject data = JSONObject.parseObject(params.toString());
+    return data;
+  }
+
+
   @Override
   public JSONObject directAliPay(BizTypeEnum bizType, String bizId, String openId, int money, String orderRemark) {
     if (null == alipayClient) {