diff --git a/pluss-api-page/src/assembly/assembly.xml b/pluss-api-page/src/assembly/assembly.xml new file mode 100644 index 0000000..8795933 --- /dev/null +++ b/pluss-api-page/src/assembly/assembly.xml @@ -0,0 +1,39 @@ + + + release + + zip + + + + src/assembly + . + + *.sh + *.bat + + + + src/main/resources + . + + *.yml + + + + + + + + + true + libs + runtime + + + + \ No newline at end of file diff --git a/pluss-api-page/src/assembly/startup.bat b/pluss-api-page/src/assembly/startup.bat new file mode 100644 index 0000000..2c07727 --- /dev/null +++ b/pluss-api-page/src/assembly/startup.bat @@ -0,0 +1,5 @@ +@echo off +setLocal enableDelayedExpansion +set cp=. +FOR %%i IN ("%~dp0libs\*.jar") DO set cp=!cp!;%%~fsi +start "bidservice" java -cp %cp% Shell diff --git a/pluss-api-page/src/assembly/startup.sh b/pluss-api-page/src/assembly/startup.sh new file mode 100644 index 0000000..a8dcd34 --- /dev/null +++ b/pluss-api-page/src/assembly/startup.sh @@ -0,0 +1,10 @@ +#!/bin/bash --login +shopt -s expand_aliases + +baseDir=$(cd "$(dirname "$0")"; pwd) +cp=. +for file in $baseDir/libs/*.jar +do + cp=$cp:$file +done +java -cp $cp com.goodcoupons.GoodCoupons >>stdout.out 2>&1 & diff --git a/pluss-api-page/src/main/java/cn/pluss/platform/controller/MerchantOrderController.java b/pluss-api-page/src/main/java/cn/pluss/platform/controller/MerchantOrderController.java index f691bda..e93a1c3 100644 --- a/pluss-api-page/src/main/java/cn/pluss/platform/controller/MerchantOrderController.java +++ b/pluss-api-page/src/main/java/cn/pluss/platform/controller/MerchantOrderController.java @@ -25,6 +25,7 @@ import cn.pluss.platform.ryx.pay.RyxPayService; import cn.pluss.platform.sxf.pay.SxfPayService; import cn.pluss.platform.user.impl.GeneralPushUtil; import cn.pluss.platform.userApp.UserAppService; +import cn.pluss.platform.util.IpUtils; import cn.pluss.platform.util.StringUtil; import cn.pluss.platform.util.TokenUtil; import cn.pluss.platform.vo.MemberScanVO; @@ -46,6 +47,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.text.SimpleDateFormat; import java.util.*; @@ -417,7 +419,7 @@ public class MerchantOrderController { @ApiOperation(tags = {"页面-收款"}, value = "扫码支付", notes = "扫码支付", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "MerchantOrderVo", value = "扫码支付需要传递的参数实例", paramType = "body", dataType = "MerchantOrderVo", required = true)}) - public Result scanPay(@RequestBody MerChantOrderDTO merchantOrderDTO) { + public Result scanPay(HttpServletRequest request, @RequestBody MerChantOrderDTO merchantOrderDTO) { UserApp tokenUa = userAppService.queryUserAppByToken(); merchantOrderDTO.setMerchantCode(tokenUa.getMerchantCode()); //校验金额 @@ -425,7 +427,7 @@ public class MerchantOrderController { MsgException.throwException("金额异常"); } try { - return merchantOrderService.toActivePay(merchantOrderDTO); + return merchantOrderService.toActivePay(merchantOrderDTO, IpUtils.getIpAddr(request)); } catch (Exception e){ e.printStackTrace(); return ResultGenerator.genFailResult(e.getMessage()); @@ -437,7 +439,7 @@ public class MerchantOrderController { * @return */ @PostMapping("/posScanPay") - public Result posScanPay(@RequestBody MerChantOrderDTO merchantOrderDTO) { + public Result posScanPay(HttpServletRequest request,@RequestBody MerChantOrderDTO merchantOrderDTO) { //首先验签 verify(merchantOrderDTO.getTimestamp(), merchantOrderDTO.getRequestId(), merchantOrderDTO.getAppId(), merchantOrderDTO.getToken()); //通过后查询商户信息 @@ -451,7 +453,7 @@ public class MerchantOrderController { } //进行支付操作 try { - Result activePay = merchantOrderService.toActivePay(merchantOrderDTO); + Result activePay = merchantOrderService.toActivePay(merchantOrderDTO,IpUtils.getIpAddr(request)); String result = activePay.toString(); JSONObject jsonData = JSONObject.parseObject(result); Object orderNumber = jsonData.getJSONObject("data").get("orderNumber"); diff --git a/pluss-api-page/src/main/java/cn/pluss/platform/controller/merchant/callback/AuditCallbackController.java b/pluss-api-page/src/main/java/cn/pluss/platform/controller/merchant/callback/AuditCallbackController.java index b464059..988ff7b 100644 --- a/pluss-api-page/src/main/java/cn/pluss/platform/controller/merchant/callback/AuditCallbackController.java +++ b/pluss-api-page/src/main/java/cn/pluss/platform/controller/merchant/callback/AuditCallbackController.java @@ -3,6 +3,7 @@ package cn.pluss.platform.controller.merchant.callback; import cn.hutool.crypto.symmetric.DES; import cn.pluss.platform.channel.MerchantAuditService; import cn.pluss.platform.channel.ys.YSAuditServiceV3; +import cn.pluss.platform.entity.MerchantChannelStatus; import cn.pluss.platform.entity.RyxAccessModel; import cn.pluss.platform.klk.service.impl.LaKalaInterfaceImpl; import cn.pluss.platform.ryx.RyxService; @@ -151,4 +152,12 @@ public class AuditCallbackController { public String lklCallBack(@RequestBody Map map) throws Exception { return lklMerAuditService.merchantAuditCallback(map); } + + + @GetMapping("queryMerchantChannelStatus") + public MerchantChannelStatus queryMerchantChannelStatus(String customerNo, String externalCustomerNo ) throws Exception { + return lklMerAuditService.queryMerchantChannelStatus(customerNo, externalCustomerNo); + } + + } diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/DateUtils.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/DateUtils.java index 2cf3ed8..9d44c3a 100644 --- a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/DateUtils.java +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/DateUtils.java @@ -611,12 +611,23 @@ public class DateUtils { return Math.abs(hours); } private final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss"); + private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); public static String getSdfTimes() { return sdfTimes.format(new Date()); } + public static Date convertDate(String date) { + try { + return sdf.parse(date); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + public static void main(String[] args) throws ParseException { + + System.out.println(convertDate("20230603163342")); //List last6Months = getLast6Months(); // List last6Months = new ArrayList<>(); // last6Months.add("2019-11"); diff --git a/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SnowFlakeUtil.java b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SnowFlakeUtil.java new file mode 100644 index 0000000..05c57bc --- /dev/null +++ b/pluss-common-bundle/src/main/java/cn/pluss/platform/util/SnowFlakeUtil.java @@ -0,0 +1,23 @@ +package cn.pluss.platform.util; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Exrickx + */ +@Slf4j +public class SnowFlakeUtil { + + /** + * 派号器workid:0~31 + * 机房datacenterid:0~31 + */ + private static Snowflake snowflake = IdUtil.createSnowflake(1, 1); + + public static Long nextId() { + return snowflake.nextId(); + } +} + diff --git a/pluss-common-bundle/src/main/resources/config/application-common.yml b/pluss-common-bundle/src/main/resources/config/application-common.yml index d2fca34..a16e87b 100644 --- a/pluss-common-bundle/src/main/resources/config/application-common.yml +++ b/pluss-common-bundle/src/main/resources/config/application-common.yml @@ -162,7 +162,7 @@ express: USERID: 1778214 APIKEY: 63e75d64-e8fd-4dcc-93fa-17dc710cdf04 lkl: - privateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAK870Q31bo4bvLvZVRZmKWLibwOUP5Myh+AiX3o49f19EFLshyDegirGZTbTEVuKzAnZwJTojWBsTsYMzXgKKEtB3brFblP/xOYcJpUUXLVv0BYc0ruxbdo13YorU8jeHiBLfw0PyOq92v/xhlII0XYo6g57cXXsWpV5wF2r7VVlAgMBAAECgYAFDkSWUq30DgB7KlE7pQqYTpslrx8fHUFGqgc3ggbgNOhbKXWD8ReFVMBdKBLN9tUIiw6fh+QdqOekQYCjcCZAarcZ5c3VyKqmM6NJe4KZ7jQxtIhwa2UDYPW7yRyqu8CqktNDTCd2R/RBVcwd4wvhjO9ZJZF8s3qbuncicUzjgQJBANT8TCGQLU3UOlfLhI5epnuspSCh9JgO3TR3xtYg1Km29PJ8Wy6ZtCznf+odr/RM3MKFEd84/Mz/wIic44bo50ECQQDSn69ej8smC8/azzaBVSrZCyaxY/vyQJ+5sXsCo94aFU3w5SnHW4Rb8Ok+EVOlCHqCxbwElpPvLof8PI8vGqklAkAdtqEMYafgXsZQ70Sr9Ap34Isc9VtBR3mW00r7HpNspeigV7cE1k6roRRYXhHpHDwEKzpmEPY7x0ZeCL05Wg7BAkBoFSVSc3iOapPiqzdiHjY4X3xVePVON4U2/G+vVE8zUIfdnUFSFPWJgbmhRGqzSUdRTGmnUsn0DmiAy2RugJxJAkBGCmZzkXmCA844EjwdDllJFY0hhjNguqUJXnm90v245Fyx86ox0rFOMS0WoZY7/8r/AQx2VUsrAKDyxajtUbR2 + privateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIcHuPuAbeKgueevtuy4RdMCH/xhLFKniVAhgZb2BfQiSDP0moBF2DiISdTq2A2KvEDol2DQBaAslDFAERkyTDIrZl9iB6xiGUmS/pZULy/k6Q6uED01JDeJLomxh6Cxk7QYlJO0tBpM4Xxahs9h7k0j55ZTV9HPZnLGVaUqyEF5AgMBAAECgYAmugRHvXHGiapH1JF2GvOLrRRXYddAbWRoYvOzxCO4/QwQOpsFJwL4U745HpGQcLXFN/ASiBbU9XQbG/DLdS182qAjvdZVJOA2e3H3LhpY3D8ec3webO+0nGk6e4oWGG1efJLM88Nb0FtQiQ0E6z17Paw5AGvxMVBPbL5SoQfq8QJBANHQmvFkAWlBL2XTLPUXaj+NAJzolE90ctAquxfDcTtfEXv0JitC5bwTg87uNl7n4PUTmtMDIkse+D5vQ2CIF78CQQCkwOIMzedKtWhOEbdGxiz1Y/jkuA8yF7HREeC7X2Av0z2Gi3yltoJd0s6zLn+6zowQp1O/5U6ifrYCIObWlTTHAkA0WOZ/eWL8vr2zmvdpgtkIWAaiH0j5deU7WJ3rNODoXjS/h0+KlZs5zGijVT2Nei7fFnAXW33P3j8zXJEj4XCDAkAcrG0rKVLNz9C9dZveN3NvqdyRge8zGqiZ6HCia7ED4dHdbr1c4ezCg4Px72/PhU8fPt/2j+Qlp8PpjuxeAE3VAkBqUiVV9XZptFEXa/77rgHP3SWrC3TcrrS5jtNTGfA4VISV95YXnZzWjYfpgs2WoxdAXjsrM5TB7L3V4um4o6Dp appid: OP00000462 #接入方唯一编号 mchSerialNo: 00dfba8194c41b84cf #证书序列号 merchantNo: 8221210594300JY #商户号 @@ -173,7 +173,7 @@ lkl: certificatePath: D:\\project\\chaozhanggui\\pluss-common-bundle\\src\\main\\resources\\lakalaConf\\OP00000003_cert.cer returncatePath: D:\\project\\chaozhanggui\\pluss-common-bundle\\src\\main\\resources\\lakalaConf\\lkl-apigw-v2.cer callBackUrl: https://p40312246f.goho.co/api/auditCallback/tradeCallBack - pubKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvO9EN9W6OG7y72VUWZili4m8DlD+TMofgIl96OPX9fRBS7Icg3oIqxmU20xFbiswJ2cCU6I1gbE7GDM14CihLQd26xW5T/8TmHCaVFFy1b9AWHNK7sW3aNd2KK1PI3h4gS38ND8jqvdr/8YZSCNF2KOoOe3F17FqVecBdq+1VZQIDAQAB + pubKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHB7j7gG3ioLnnr7bsuEXTAh/8YSxSp4lQIYGW9gX0Ikgz9JqARdg4iEnU6tgNirxA6Jdg0AWgLJQxQBEZMkwyK2ZfYgesYhlJkv6WVC8v5OkOrhA9NSQ3iS6JsYegsZO0GJSTtLQaTOF8WobPYe5NI+eWU1fRz2ZyxlWlKshBeQIDAQAB diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/ali/device/impl/AliScanCodeDeviceServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/ali/device/impl/AliScanCodeDeviceServiceImpl.java index 2ccc1ca..2cf8cc3 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/ali/device/impl/AliScanCodeDeviceServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/ali/device/impl/AliScanCodeDeviceServiceImpl.java @@ -139,7 +139,7 @@ public class AliScanCodeDeviceServiceImpl implements AliDeviceService { dto.setDeviceNo(entity.getCode()); dto.setRemark(entity.getRemark()); try { - Result mapResult = merchantOrderService.toActivePay(dto); + Result mapResult = merchantOrderService.toActivePay(dto,null); Object data = mapResult.getData(); if (ResultCode.TRANSUNKNOW.code() == mapResult.getCode()) { return RespDeviceEntity.await(mapResult.getMessage(),((Map)data).get("orderNumber")); diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LakalaConfig.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LakalaConfig.java index cb86eff..b97fc16 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LakalaConfig.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/LakalaConfig.java @@ -19,11 +19,14 @@ public class LakalaConfig { private String apiUrl; private String privateKeyPath; private String certificatePath; + private String returncatePath; + private String callBackUrl; private String pubKey; + @Bean public void init(){ System.out.println("qqqqqqq"); diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/controller/LaKaLaController.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/controller/LaKaLaController.java index 09b7e56..66adb61 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/controller/LaKaLaController.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/controller/LaKaLaController.java @@ -1,5 +1,6 @@ package cn.pluss.platform.klk.controller; +import cn.hutool.json.JSONUtil; import cn.pluss.platform.klk.service.impl.LaKalaInterfaceImpl; import cn.pluss.platform.klk.vo.TuoKeVo; import org.springframework.web.bind.annotation.*; @@ -42,4 +43,10 @@ public class LaKaLaController { public void callBackToke(@RequestBody Map map){ laKalaInterface.tuoKeCallBack(map); } + + + @RequestMapping("/tradeCallBack") + public void tradeCallBack(@RequestBody Map map){ + System.out.println("拉卡拉交易回调:"+ JSONUtil.toJsonStr(map)); + } } diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LkLPayServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LkLPayServiceImpl.java index a6e554a..d5ed025 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LkLPayServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LkLPayServiceImpl.java @@ -1,14 +1,25 @@ package cn.pluss.platform.klk.service; +import cn.hutool.core.util.ObjectUtil; +import cn.pluss.platform.api.ResultCode; import cn.pluss.platform.dto.MemberScanPayDTO; import cn.pluss.platform.dto.MerChantOrderDTO; import cn.pluss.platform.entity.*; +import cn.pluss.platform.exception.MsgException; +import cn.pluss.platform.klk.LakalaConfig; +import cn.pluss.platform.mapper.MerchantBackLklMapper; import cn.pluss.platform.pay.PayService; +import cn.pluss.platform.util.DateUtils; +import cn.pluss.platform.util.SnowFlakeUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; @Service("lkLPayService") @@ -16,6 +27,16 @@ import java.util.Map; public class LkLPayServiceImpl implements PayService { @Resource LklPayService lklPayService; + + @Autowired + MerchantBackLklMapper merchantBackLklMapper; + + + @Autowired + LakalaConfig lakalaConfig; + + + @Override public JSONObject tradePay(MerchantOrder order, MerchantChannelStatus channel, MerchantBaseInfo merchant) { return null; @@ -23,7 +44,93 @@ public class LkLPayServiceImpl implements PayService { @Override public JSONObject tradePay(MerChantOrderDTO merchantOrderDTO, MerchantOrder order) { - return null; + + + QueryWrapper queryWrapper=new QueryWrapper<>(); + queryWrapper.eq("merchant_code",merchantOrderDTO.getMerchantCode()); + queryWrapper.eq("channel","5"); + queryWrapper.eq("user_no","20000101"); + + MerchantBackLkl merchantBackLkl=merchantBackLklMapper.selectOne(queryWrapper); + MsgException.checkNull(merchantBackLkl,"进件信息不存在"); + + + + JSONObject obj = new JSONObject(6); + + String req_time= DateUtils.getSdfTimes(); + Long order_amt = new BigDecimal(order.getConsumeFee()).multiply(new BigDecimal(100)).longValue(); + String out_trade_no= "LKL".concat(SnowFlakeUtil.nextId().toString()); + + +// String body="{\n" + +// "\t\"req_data\": {\n" + +// "\t\t\"out_trade_no\": \""+out_trade_no+"\",\n" + +// "\t\t\"merchant_no\": \""+lakalaConfig.getMerchantNo()+"\",\n" + +// "\t\t\"term_no\": \""+lakalaConfig.getTermNo()+"\",\n" + +// "\t\t\"auth_code\": \""+merchantOrderDTO.getAuthCode()+"\",\n" + +// "\t\t\"total_amount\": \""+order_amt+"\",\n" + +// "\t\t\"notify_url\": \""+lakalaConfig.getCallBackUrl()+"\",\n" + +// "\t\t\"location_info\": \"{\"request_ip\":\""+order.getIp()+"\"}\"\n" + +// "\t},\n" + +// "\t\"version\": \"3.0\",\n" + +// "\t\"req_time\": \""+req_time+"\"\n" + +// "}"; + + + String body="{\n" + + "\t\"req_data\": {\n" + + "\t\t\"merchant_no\": \""+lakalaConfig.getMerchantNo()+"\",\n" + + "\t\t\"term_no\": \""+lakalaConfig.getTermNo()+"\",\n" + + "\t\t\"out_trade_no\": \""+out_trade_no+"\",\n" + + "\t\t\"total_amount\": \""+order_amt+"\",\n" + + "\t\t\"subject\": \"测试\",\n" + + "\t\t\"acc_busi_fields\": {},\n" + + "\t\t\"notify_url\": \""+lakalaConfig.getCallBackUrl()+"\",\n" + + "\t\t\"location_info\": {\n" + + "\t\t\t\"request_ip\": \""+order.getIp()+"\"\n" + + "\t\t},\n" + + "\t\t\"auth_code\": \""+merchantOrderDTO.getAuthCode()+"\"\n" + + "\t},\n" + + "\t\"out_org_code\": \""+lakalaConfig.getAppid()+"\",\n" + + "\t\"version\": \"3.0\",\n" + + "\t\"req_time\": "+req_time+"\n" + + "}"; + + + + + + + + + String response=lklPayService.req(body,"api/v3/labs/trans/micropay"); + if(ObjectUtil.isNotEmpty(response)){ + JSONObject object= JSON.parseObject(response); + if(object.containsKey("code")&&"BBS10000".equals(object.get("code"))){ + obj.put("code",ResultCode.TRANSUNKNOW.code()); + obj.put("msg","用户支付中"); + obj.put("channelOrderNo",object.getJSONObject("resp_data").get("trade_no")); + obj.put("transNo",object.getJSONObject("resp_data").get("log_no")); + obj.put("payStatus","1"); + return obj; + }else if(object.containsKey("code")&&"BBS00000".equals(object.get("code"))){ + obj.put("code",ResultCode.SUCCESS.code()); + obj.put("msg","成功"); + obj.put("channelOrderNo",object.getJSONObject("resp_data").get("trade_no")); + obj.put("transNo",object.getJSONObject("resp_data").get("log_no")); + obj.put("payStatus","1"); + obj.put("payTime",DateUtils.convertDate(object.getJSONObject("resp_data").getString("trade_time"))); + return obj; + }else { + obj.put("code",ResultCode.FAIL.code()); + obj.put("msg",object.get("msg")); + return obj; + } + } + obj.put("code",ResultCode.FAIL.code()); + obj.put("msg","失败"); + return obj; } @Override @@ -54,14 +161,14 @@ public class LkLPayServiceImpl implements PayService { @Override public Map getUnionInfo(String userAuthCode, String paymentApp, String merchantId) throws Exception { Map result = new HashMap<>(); - JSONObject reqData = new JSONObject(2); - Map stringObjectMap=lklPayService.authUserId(userAuthCode, paymentApp); - reqData.put("data",stringObjectMap.get("userId")); - reqData.put("userAuthCode",userAuthCode); - reqData.put("appUpIdentifier",paymentApp); - result.put("data",reqData); - result.put("code","1"); - result.put("msg","获取成功"); +// JSONObject reqData = new JSONObject(2); +// Map stringObjectMap=lklPayService.authUserId(userAuthCode, paymentApp); +// reqData.put("data",stringObjectMap.get("userId")); +// reqData.put("userAuthCode",userAuthCode); +// reqData.put("appUpIdentifier",paymentApp); +// result.put("data",reqData); +// result.put("code","1"); +// result.put("msg","获取成功"); return result; } diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LklPayService.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LklPayService.java index a7eead5..f1f0c6f 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LklPayService.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/LklPayService.java @@ -1,12 +1,21 @@ package cn.pluss.platform.klk.service; +import cn.hutool.core.util.ObjectUtil; +import cn.pluss.platform.api.ResultCode; +import cn.pluss.platform.dto.MerChantOrderDTO; +import cn.pluss.platform.entity.MerchantBackLkl; import cn.pluss.platform.entity.MerchantBaseInfo; import cn.pluss.platform.entity.MerchantChannelStatus; import cn.pluss.platform.entity.MerchantOrder; +import cn.pluss.platform.exception.MsgException; import cn.pluss.platform.klk.LakalaConfig; +import cn.pluss.platform.mapper.MerchantBackLklMapper; import cn.pluss.platform.util.DateUtils; +import cn.pluss.platform.util.SnowFlakeUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.commons.io.IOUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; @@ -28,6 +37,7 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.servlet.http.HttpServletRequest; import java.io.*; +import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.cert.*; @@ -35,6 +45,7 @@ import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.Map; @Service @@ -57,35 +68,23 @@ public class LklPayService { private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final SecureRandom RANDOM = new SecureRandom(); - private String appId = "OP00000354"; - // private String appId="OP00000657"; - private String mchSerialNo = "00dfba8194c41b84cf"; - private String merchantNo = "8221210594300JY"; - private String termNo = "A0073841"; - // private String privateKeyPath="classpath:lakalaConf/OP00000003_private_key.pem"; - private String privateKeyPath = "C:\\Users\\Administrator\\Desktop\\dr\\OP00000003_private_key.pem"; - // private String cerPath="C:\\Users\\Administrator\\Desktop\\dr\\lkl-apigw-v1.cer"; - private String cerPath = "C:\\Users\\Administrator\\Desktop\\dr\\OP00000003_cert.cer"; - private String apiUrl = "https://test.wsmsd.cn/sit"; - String apiPath = "/api/v2/saas/query/wx_openid_query"; - - // private String apiUrl="https://s2.lakala.com"; @Autowired LakalaConfig lakalaConfig; - @Test - public void test1() { - LaKaLaVO laVO = new LaKaLaVO(); - createOrder(laVO, "127.0.0.1"); - } + @Autowired + MerchantBackLklMapper merchantBackLklMapper; public JSONObject tradePay(MerchantOrder order, MerchantChannelStatus channel, MerchantBaseInfo merchant){ String req_time= DateUtils.getSdfTimes(); + + + + String body="{\n" + " \"req_time\": \""+req_time+"\",\n" + " \"version\": \"3.0\",\n" + @@ -115,180 +114,80 @@ public class LklPayService { + public Map tradePay(String amount,MerchantChannelStatus channel,String authCode,String ip,String paymentApp){ + QueryWrapper queryWrapper=new QueryWrapper<>(); + queryWrapper.eq("merchant_code",channel.getMerchantCode()); + queryWrapper.eq("merchant_id",channel.getMerchantId()); + queryWrapper.eq("channel","5"); + queryWrapper.eq("user_no","22241007"); - public String createOrder(LaKaLaVO laVO, String ip) { -//public String createOrder(String body,String apiPath,String ip) { -// String apiPath = "/api/v2/mms/openApi/addMer"; -// String apiPath = "/api/v3/labs/trans/preorder"; + MerchantBackLkl merchantBackLkl=merchantBackLklMapper.selectOne(queryWrapper); + MsgException.checkNull(merchantBackLkl,"进件信息不存在"); -// String apiPath = "/api/v3/labs/relation/revoked"; -// String apiPath = "/api/v2/mms/openApi/addMer"; - //ordCode存在异议 -// String body ="{ \n" + -// " \"reqData\":{ \n" + -// " \"version\":\"1.0\", \n" + -// " \"orderNo\":\"2021031215011012345678\", \n" + -// " \"posType\":\"SUPER_POS\", \n" + -// " \"orgCode\":\"1\", \n" + -// " \"merRegName\":\"开放平台商户进件注册名称\", \n" + -// " \"merBizName\":\"开放平台商户进件经营名称\", \n" + -// " \"merRegDistCode\":\"290012\", \n" + -// " \"merRegAddr\":\"五星路102号\", \n" + -// " \"mccCode\":\"7011\", \n" + -// " \"merBusiContent\":\"640\", \n" + -// " \"larName\":\"张三丰\", \n" + -// " \"larIdType\":\"01\", \n" + -// " \"larIdcard\":\"33088119690117459X\", \n" + -// " \"larIdcardExpDt\":\"2051-01-10\", \n" + -// " \"merContactMobile\":\"15878559969\", \n" + -// " \"merContactName\":\"张三丰\", \n" + -// " \"settlePeriod\":\"T+1\", \n" + -// " \"openningBankCode\":\"102100000030\", \n" + -// " \"openningBankName\":\"中国工商银行股份有限公司北京市分行营业部\", \n" + -// " \"clearingBankCode\":\"102100099996\", \n" + -// " \"acctNo\":\"6212260200102400000\", \n" + -// " \"acctName\":\"仲涛飘\", \n" + -// " \"acctTypeCode\":\"58\", \n" + -// " \"acctIdcard\":\"33088119690117459X\", \n" + -// " \"devSerialNo\":\"yp13293921932131\", \n" + -// " \"devTypeName\":\"V8\", \n" + -// " \"termVer\":\"1.0\", \n" + -// " \"salesStaff\":\"销售3356\", \n" + -// " \"retUrl\":\"http://10.177.93.135:8082/notify\", \n" + -// " \"feeData\":[\n" + -// " { \n" + -// " \"feeRateTypeCode\":\"300\", \n" + -// " \"feeRatePct\":\"0.38\", \n" + -// " \"feeUpperAmtPcnt\":\"20\", \n" + -// " \"feeLowerAmtPcnt\":\"10\"\n" + -// " },\n" + -// " { \n" + -// " \"feeRateTypeCode\":\"301\", \n" + -// " \"feeRatePct\":\"0.58\"\n" + -// " },\n" + -// " { \n" + -// " \"feeRateTypeCode\":\"302\", \n" + -// " \"feeRatePct\":\"0.48\"\n" + -// " },\n" + -// " { \n" + -// " \"feeRateTypeCode\":\"303\", \n" + -// " \"feeRatePct\":\"0.48\"\n" + -// " }\n" + -// " ], \n" + -// " \"fileData\":[\n" + -// " { \n" + -// " \"attType\":\"ID_CARD_FRONT\", \n" + -// " \"attFileId\":\"G1/M00/00/61/CrFdEl3IyceAVVd8AAA0ADuZsA0911.jpg\"\n" + -// " }\n" + -// " ]\n" + -// " }, \n" + -// " \"ver\":\"1.0.0\", \n" + -// " \"timestamp\":\"1541589957000\", \n" + -// " \"reqId\":\"baff59de4694438ca9089862253517a5\"\n" + -// "}"; - Integer type = null; - String subAppid = ""; - String subOpenid = ""; - String body = ""; - String orderNumber = ""; - String consumeFee = ""; - HttpServletRequest request = null; - body = "{ \n" + - " \"ver\": \"1.0.0\",\n" + - " \"timestamp\": \"1541589957000\",\n" + - " \"reqId\": \"ca9089862253517a5\",\n" + - " \"reqData\": {\n" + - " \"mercId\": \"" + merchantNo + "\",\n" + - " \"termNo\": \"" + termNo + "\",\n" + - " \"authCode\": \"136519690623734145\",\n" + - " \"tradeCode\":\"030304\"\n" + - " }\n" + + String req_time= DateUtils.getSdfTimes(); + + + Long order_amt = new BigDecimal(amount).multiply(new BigDecimal(100)).longValue(); + String out_trade_no= "LKL".concat(SnowFlakeUtil.nextId().toString()); + + + String body="{\n" + + "\t\"req_data\": {\n" + + "\t\t\"out_trade_no\": \""+out_trade_no+"\",\n" + + "\t\t\"merchant_no\": \""+lakalaConfig.getMerchantNo()+"\",\n" + + "\t\t\"term_no\": \""+lakalaConfig.getTermNo()+"\",\n" + + "\t\t\"auth_code\": \""+authCode+"\",\n" + + "\t\t\"total_amount\": \""+order_amt+"\",\n" + + "\t\t\"notify_url\": \""+lakalaConfig.getCallBackUrl()+"\",\n" + + "\t\t\"location_info\": \"{\\\"request_ip\\\":\\\""+ip+"\\\",\\\"base_station\\\":\\\"陕西省西安市未央区\\\",\\\"location\\\":\\\"34.34727,108.94647\\\"}\"\n" + + "\t},\n" + + "\t\"version\": \"3.0\",\n" + + "\t\"req_time\": \""+req_time+"\"\n" + "}"; -// if (type==51||type==71){ -// -// body="{\n" + -// " \"out_org_code\":\""+appId+"\",\n" + -// " \"req_data\":{\n" + -// " \"acc_busi_fields\":{\n" + -// " \"detail\":\"{\\\"goods_detail\\\":[{\\\\\\\"goods_id\\\\\\\":\\\\\\\"100734033\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"quantity\\\\\\\":\\\\\\\"1\\\\\\\"}]}\",\n" + -// " \"goods_tag\":\"ceshi\",\n" + -// " \"sub_appid\":\""+subAppid+"\",\n" + -// " \"user_id\":\""+subOpenid+"\"\n" + -// " },\n" + -// " \"account_type\":\"WECHAT\",\n" + -// " \"location_info\":{\n" + -// " \"request_ip\":\""+IpUtils.getIpAddr(request)+"\"\n" + -// " },\n" + -// " \"merchant_no\":\""+merchantNo+"\",\n" + -// " \"notify_url\":\"https://testca/notify\",\n" + -// " \"out_trade_no\":\""+orderNumber+"\",\n" + -// " \"term_no\":\""+ laVO.getTermNum()+"\",\n" + -// " \"total_amount\":\""+consumeFee+"\",\n" + -// " \"trans_type\":\""+type+"\"\n" + -// " },\n" + -// " \"req_time\":\""+getNowDate()+"\",\n" + -// " \"version\":\"3.0\"\n" + -// "}"; -// }else if (type==41){ -// body="{\n" + -// " \"out_org_code\":\""+appId+"\",\n" + -// " \"req_data\":{\n" + -// " \"acc_busi_fields\":{\n" + -// " \"detail\":\"{\\\"goods_detail\\\":[{\\\\\\\"goods_id\\\\\\\":\\\\\\\"100734033\\\\\\\",\\\\\\\"price\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"quantity\\\\\\\":\\\\\\\"1\\\\\\\"}]}\",\n" + -// " \"goods_tag\":\"ceshi\",\n" + -// " \"sub_appid\":\""+subAppid+"\",\n" + -// " \"user_id\":\""+subOpenid+"\"\n" + -// " },\n" + -// " \"account_type\":\"WECHAT\",\n" + -// " \"location_info\":{\n" + -// " \"request_ip\":\""+IpUtils.getIpAddr(request)+"\"\n" + -// " },\n" + -// " \"merchant_no\":\""+merchantNo+"\",\n" + -// " \"notify_url\":\"https://testca/notify\",\n" + -// " \"out_trade_no\":\""+orderNumber+"\",\n" + -// " \"term_no\":\""+ laVO.getTermNum()+"\",\n" + -// " \"total_amount\":\""+consumeFee+"\",\n" + -// " \"trans_type\":\""+type+"\"\n" + -// " },\n" + -// " \"req_time\":\""+getNowDate()+"\",\n" + -// " \"version\":\"3.0\"\n" + -// "}"; -// } - return ""; + String response=req(body,"api/v3/labs/trans/micropay"); + if(ObjectUtil.isNotEmpty(response)){ + JSONObject object= JSON.parseObject(response); + if(object.containsKey("code")&&"BBS10000".equals(object.get("code"))){ + Map result = new HashMap<>(2); + result.put("data", object.get("resp_data")); + result.put("code", "1"); + result.put("msg", "获取成功"); + return result; + + }else { + JSONObject reqData = new JSONObject(2); + reqData.put("userAuthCode", authCode); + reqData.put("paymentApp", paymentApp); + reqData.put("code", ResultCode.FAIL.code()); + + reqData.put("msg",object.get("msg")); + + return reqData; + } + } + JSONObject reqData = new JSONObject(2); + reqData.put("code", ResultCode.FAIL.code()); + reqData.put("msg","失败"); + return reqData; } - public Map authUserId(String authCode, String appUpIdentifier) { - String body = "{ \n" + - " \"ver\": \"1.0.0\",\n" + - " \"timestamp\": \"1541589957000\",\n" + - " \"reqId\": \"ca9089862253517a5\",\n" + - " \"reqData\": {\n" + - " \"mercId\": \"" + merchantNo + "\",\n" + - " \"termNo\": \"" + termNo + "\",\n" + - " \"authCode\": \"" + authCode + "\",\n" + - " \"tradeCode\":\"030304\",\n" + - " \"appUpIdentifier\":\"" + appUpIdentifier + "\"\n" + - " }\n" + - "}"; - Map map = (Map) JSONArray.parse(req(body)); - return (Map) JSONArray.parse(map.get("reqData").toString()); - } - public String req(String body) { + public String req(String body,String mothod) { String encode = encode("client_id:client_secret".getBytes()); System.out.println("base64:" + encode); try { - String authorization = getAuthorization(body, appId, mchSerialNo, privateKeyPath); - HttpResponse lakalaResponse = post(apiUrl + apiPath, body, authorization, "utf-8"); + String authorization = getAuthorization(body, lakalaConfig.getAppid(), lakalaConfig.getMchSerialNo(), lakalaConfig.getPrivateKeyPath()); + HttpResponse lakalaResponse = post(lakalaConfig.getApiUrl() + mothod, body, authorization, "utf-8"); if (lakalaResponse.getStatusLine().getStatusCode() != 200) { log.error("请求失败,statusCode:{},message:{}", lakalaResponse.getStatusLine(), IOUtils.toString(lakalaResponse.getEntity().getContent(), "utf-8")); + MsgException.throwException(IOUtils.toString(lakalaResponse.getEntity().getContent(), "utf-8")); } String appid = getHeadValue(lakalaResponse, "Lklapi-Appid"); @@ -301,10 +200,7 @@ public class LklPayService { String source = appid + "\n" + lklapiSerial + "\n" + timestamp + "\n" + nonce + "\n" + responseStr + "\n"; log.info("请求的数据为:{}", source); - -// X509Certificate lklCertificate = loadCertificate(new FileInputStream(new File(privateKeyPath))); - X509Certificate lklCertificate = loadCertificate(new FileInputStream(new File(cerPath))); - + X509Certificate lklCertificate = loadCertificate(new FileInputStream(new File(lakalaConfig.getCertificatePath()))); boolean verify = verify(lklCertificate, source.getBytes("utf-8"), signature); if (verify) { diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LaKalaInterfaceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LaKalaInterfaceImpl.java index 46968a6..9c6b7b1 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LaKalaInterfaceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LaKalaInterfaceImpl.java @@ -1,6 +1,7 @@ package cn.pluss.platform.klk.service.impl; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import cn.pluss.platform.BankCardService; import cn.pluss.platform.IdCardService; import cn.pluss.platform.MerchantAuditRecordService; @@ -9,7 +10,9 @@ import cn.pluss.platform.dto.AccountDTO; import cn.pluss.platform.entity.*; import cn.pluss.platform.exception.MsgException; import cn.pluss.platform.klk.LaKaLaUtility; +import cn.pluss.platform.klk.LakalaConfig; import cn.pluss.platform.klk.service.*; +import cn.pluss.platform.klk.util.RSAUtil; import cn.pluss.platform.klk.vo.*; import cn.pluss.platform.mapper.MerchantChannelStatusMapper; @@ -24,6 +27,8 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.Data; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.core.io.ByteArrayResource; @@ -44,6 +49,7 @@ import java.net.URISyntaxException; import java.util.*; @Service +@Slf4j public class LaKalaInterfaceImpl implements LaKalaInterface { @Resource LklPayService lklPayService; @@ -88,10 +94,15 @@ public class LaKalaInterfaceImpl implements LaKalaInterface { MccReflectService service; @Resource PlussMerchantLklService merchantLklService; + + @Lazy + @Autowired + LakalaConfig lakalaConfig; + private static final String client_id = "chaozhanggui"; private static final String client_secret = "Y54Gqy6aLpxld3dp"; private static final String grant_type = "client_credentials"; - private static final String userNo = "22241007"; + public static final String userNo = "22241007"; /** * 商户进件 */ @@ -244,16 +255,23 @@ public class LaKalaInterfaceImpl implements LaKalaInterface { startSb.append(merchantBaseInfo.getBussAuthStartTime().substring(5,7)); startSb.append("-"); startSb.append(merchantBaseInfo.getBussAuthStartTime().substring(8,10)); + }else { + startSb.append(merchantBaseInfo.getBussAuthStartTime()); } if(ObjectUtil.isEmpty(merchantBaseInfo.getBuslicType()) ||"长期".equals(merchantBaseInfo.getBuslicType())){ endSb.append("2099-12-31"); }else { - endSb.append(merchantBaseInfo.getBussAuthStartTime().substring(0,4)); - endSb.append("-"); - endSb.append(merchantBaseInfo.getBussAuthStartTime().substring(5,7)); - endSb.append("-"); - endSb.append(merchantBaseInfo.getBussAuthStartTime().substring(8,10)); + if(merchantBaseInfo.getBussAuthEndTime().contains("年")){ + endSb.append(merchantBaseInfo.getBussAuthEndTime().substring(0,4)); + endSb.append("-"); + endSb.append(merchantBaseInfo.getBussAuthEndTime().substring(5,7)); + endSb.append("-"); + endSb.append(merchantBaseInfo.getBussAuthEndTime().substring(8,10)); + }else { + endSb.append(merchantBaseInfo.getBussAuthEndTime()); + } + } @@ -317,7 +335,7 @@ public class LaKalaInterfaceImpl implements LaKalaInterface { MsgException.checkNull(accountV4,"结算信息不存在"); object1.put("accountNo", accountV4.getBankCard().getBankCardNo()); //结算人银行卡号 - object1.put("accountName", accountV4.getBankCard().getBranchName()); //结算人账户名称 + object1.put("accountName", accountV4.getBankCard().getBankHolder()); //结算人账户名称 object1.put("accountType", accountV4.getBankCard().getAccountType().equals("01")?"58":"57"); //结算账户类型 57 对公 58 对私 // object1.put("accountIdType",tuoKeVo.getUserNo()); //结算⼈证件类型 为空同法⼈ object1.put("accountIdCard", accountV4.getIdcard().getCertNo()); //结算⼈证件号码 @@ -559,6 +577,46 @@ public class LaKalaInterfaceImpl implements LaKalaInterface { } + + + + + + + + public Map queryMerchat(String customerNo,String externalCustomerNo){ + Map map = getToken(); + try{ + JSONObject object=new JSONObject(); + if(ObjectUtil.isNotEmpty(customerNo)){ + object.put("customerNo",customerNo); + } + + if(ObjectUtil.isNotEmpty(externalCustomerNo)){ + object.put("externalCustomerNo",externalCustomerNo); + } + + JSONObject req=new JSONObject(); + byte[] privateKey = Base64.decodeBase64(lakalaConfig.getPrivateKey()); + byte[] bytes = RSAUtil.encryptByPrivateKey(object.toString().getBytes(), privateKey); + + req.put("data", Base64.encodeBase64String(bytes)); + + log.info("请求参数:加密前:{},加密后:{}",object.toString(),req.toString()); + String result = cn.hutool.http.HttpRequest.post("https://tkapi.lakala.com/htkmerchants/open/merchant/info") + .header("Authorization", "bearer " + map.get("access_token")).header("content-type", "application/json") + .body(req.toJSONString()).execute().body(); + Map arry = (Map) JSONArray.parse(result); + log.info("返回参数:",JSONUtil.toJsonStr(arry)); + return arry; + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } + + // 加密 public static String getBase64() { @@ -869,10 +927,26 @@ public class LaKalaInterfaceImpl implements LaKalaInterface { } public static void main(String[] args) { -// getToken(); - LaKalaInterfaceImpl laKalaInterface = new LaKalaInterfaceImpl(); - laKalaInterface.getOrganCode("1"); + Map map = getToken(); + String result=""; + try{ + JSONObject object=new JSONObject(); + object.put("customerNo","123627687"); + + result = cn.hutool.http.HttpRequest.post("https://tkapi.lakala.com/htkmerchants/open/merchant/info") + .header("Authorization", "bearer " + map.get("access_token")).header("content-type", "application/json") + .body(object.toString()).execute().body(); + Map arry = (Map) JSONArray.parse(result); + System.out.println(JSONUtil.toJsonStr(arry)); + }catch (Exception e){ + e.printStackTrace(); + } + + + +// LaKalaInterfaceImpl laKalaInterface = new LaKalaInterfaceImpl(); +// laKalaInterface.getOrganCode("1"); // try { // laKalaInterface.laKaLaFileUpload1(); // } catch (IOException e) { diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LklChangeRateNewServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LklChangeRateNewServiceImpl.java new file mode 100644 index 0000000..0f061ae --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/service/impl/LklChangeRateNewServiceImpl.java @@ -0,0 +1,29 @@ +package cn.pluss.platform.klk.service.impl; + +import cn.pluss.platform.channel.BaseMchChannelRateNewService; +import cn.pluss.platform.entity.MerchantRateNew; +import org.springframework.stereotype.Service; + +@Service("lklChangeRateNewService") +public class LklChangeRateNewServiceImpl extends BaseMchChannelRateNewService { + @Override + public void process(String userId, MerchantRateNew merchantRate) { + + } + + @Override + public String getChannelId() { + return "5"; + } + + @Override + public MerchantRateNew getDefaultRate() { + MerchantRateNew rateNew = new MerchantRateNew(); + rateNew.setChannel(5); + rateNew.setWxRate(38); + rateNew.setAliRate(38); + rateNew.setBankRate(38); + rateNew.setBankRateLarge(38); + return rateNew; + } +} diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/util/RSAUtil.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/util/RSAUtil.java new file mode 100644 index 0000000..7ce4f52 --- /dev/null +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/klk/util/RSAUtil.java @@ -0,0 +1,101 @@ +package cn.pluss.platform.klk.util; + +import org.apache.tomcat.util.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.io.ByteArrayOutputStream; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +public class RSAUtil { + public static final String KEY_ALGORITHM = "RSA"; + private static final String PUBLIC_KEY = "RSAPublicKey"; + private static final String PRIVATE_KEY = "RSAPrivateKey"; + private static final int KEY_SIZE = 1024; + /** + * RSA + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + /** + * RSA + */ + private static final int MAX_DECRYPT_BLOCK = 128; + public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + int inputLen = data.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(data, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return encryptedData; + } + public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception { + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + int inputLen = data.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offSet = 0; + byte[] cache; + int i = 0; + // + while (inputLen - offSet > 0) { + if (inputLen - offSet > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(data, offSet, inputLen - offSet); + } + out.write(cache, 0, cache.length); + i++; + offSet = i * MAX_DECRYPT_BLOCK; + } + byte[] dencryptedData = out.toByteArray(); + out.close(); + return dencryptedData; + } + + public static void main(String[] args) throws Exception { + String req="{\"customerNo\":\"123627687\"}"; + String pubKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHB7j7gG3ioLnnr7bsuEXTAh/8YSxSp4lQIYGW9gX0Ikgz9JqARdg4iEnU6tgNirxA6Jdg0AWgLJQxQBEZMkwyK2ZfYgesYhlJkv6WVC8v5OkOrhA9NSQ3iS6JsYegsZO0GJSTtLQaTOF8WobPYe5NI+eWU1fRz2ZyxlWlKshBeQIDAQAB"; + String priKey="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIcHuPuAbeKgueevtuy4RdMCH/xhLFKniVAhgZb2BfQiSDP0moBF2DiISdTq2A2KvEDol2DQBaAslDFAERkyTDIrZl9iB6xiGUmS/pZULy/k6Q6uED01JDeJLomxh6Cxk7QYlJO0tBpM4Xxahs9h7k0j55ZTV9HPZnLGVaUqyEF5AgMBAAECgYAmugRHvXHGiapH1JF2GvOLrRRXYddAbWRoYvOzxCO4/QwQOpsFJwL4U745HpGQcLXFN/ASiBbU9XQbG/DLdS182qAjvdZVJOA2e3H3LhpY3D8ec3webO+0nGk6e4oWGG1efJLM88Nb0FtQiQ0E6z17Paw5AGvxMVBPbL5SoQfq8QJBANHQmvFkAWlBL2XTLPUXaj+NAJzolE90ctAquxfDcTtfEXv0JitC5bwTg87uNl7n4PUTmtMDIkse+D5vQ2CIF78CQQCkwOIMzedKtWhOEbdGxiz1Y/jkuA8yF7HREeC7X2Av0z2Gi3yltoJd0s6zLn+6zowQp1O/5U6ifrYCIObWlTTHAkA0WOZ/eWL8vr2zmvdpgtkIWAaiH0j5deU7WJ3rNODoXjS/h0+KlZs5zGijVT2Nei7fFnAXW33P3j8zXJEj4XCDAkAcrG0rKVLNz9C9dZveN3NvqdyRge8zGqiZ6HCia7ED4dHdbr1c4ezCg4Px72/PhU8fPt/2j+Qlp8PpjuxeAE3VAkBqUiVV9XZptFEXa/77rgHP3SWrC3TcrrS5jtNTGfA4VISV95YXnZzWjYfpgs2WoxdAXjsrM5TB7L3V4um4o6Dp"; + + + + String data="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"; + + byte[] privateKey = Base64.decodeBase64(priKey); + byte[] publicKey = Base64.decodeBase64(pubKey); + byte[] bytes = encryptByPrivateKey(req.getBytes(), privateKey); + String encrypt = Base64.encodeBase64String(bytes); + byte[] bytes1 = decryptByPublicKey(Base64.decodeBase64(data), publicKey); + +// System.out.println("加密后的数据:======"+encrypt); + + System.out.println("解密后的数据:====="+new String(bytes1)); + + + + } +} diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchant/impl/MerchantRateNewServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchant/impl/MerchantRateNewServiceImpl.java index f32fb54..fbc896a 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchant/impl/MerchantRateNewServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchant/impl/MerchantRateNewServiceImpl.java @@ -77,6 +77,9 @@ public class MerchantRateNewServiceImpl extends ServiceImpl data = (Map) userIdData; - userId = data.get("data"); - }else{ - userId = userIdData.toString(); + if(channel.getChannel()==5){ + userId=userIdData.toString(); + }else { + if(userIdData instanceof Map){ + Map data = (Map) userIdData; + userId = data.get("data"); + }else{ + userId = userIdData.toString(); + } } + + view.addObject("userId", userId); } }catch (Exception e){ diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/MerchantOrderService.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/MerchantOrderService.java index c22318b..1841e3f 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/MerchantOrderService.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/MerchantOrderService.java @@ -261,7 +261,7 @@ public interface MerchantOrderService extends IService { * @param merchantOrderDTO ignored * @return ignored */ - Result toActivePay(MerChantOrderDTO merchantOrderDTO); + Result toActivePay(MerChantOrderDTO merchantOrderDTO,String ip); /** * 主扫会员卡支付 diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/impl/MerchantOrderServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/impl/MerchantOrderServiceImpl.java index cb6d2ef..343be20 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/impl/MerchantOrderServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/merchantOrder/impl/MerchantOrderServiceImpl.java @@ -18,6 +18,8 @@ import cn.pluss.platform.entitiy.SettleTypeEnum; import cn.pluss.platform.entity.*; import cn.pluss.platform.enums.UserRoleEnum; import cn.pluss.platform.exception.MsgException; +import cn.pluss.platform.klk.service.LkLPayServiceImpl; +import cn.pluss.platform.klk.service.LklPayService; import cn.pluss.platform.mapper.*; import cn.pluss.platform.memberOrder.MemberOrderService; import cn.pluss.platform.merchant.MerchantCashPlaceService; @@ -128,6 +130,9 @@ public class MerchantOrderServiceImpl extends ServiceImpl toActivePay(MerChantOrderDTO dto) { + public Result toActivePay(MerChantOrderDTO dto,String ip) { //校验参数 checkActivePayParamsMap(dto); //组装订单参数 @@ -787,6 +792,7 @@ public class MerchantOrderServiceImpl extends ServiceImpl * - * + * * @author Administrator * @since JDK 1.8 */ @@ -1417,6 +1426,11 @@ public class MerchantOrderServiceImpl extends ServiceImpl { */ void batchInsert(Vector profitList); - /** - * 创建分润V2.0模式 - * @date: 2022/1/21 15:14 - * @param order: - * @param type - */ - void createOrderProfitV2(MerchantOrder order,String type); - /** * 统计按条件分润信息 * @date: 2022/2/9 19:38 @@ -82,6 +74,14 @@ public interface MerchantProfitService extends IService { */ Map getProfitAmtCount(MerchantProfit condition); + /** + * 创建分润V2.0模式 + * @date: 2022/1/21 15:14 + * @param order: + * @param type + */ + void createOrderProfitV2(MerchantOrder order,String type); + /** * 推送收益消息 * @param userApp diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/sxf/audit/LklMerAuditServiceImpl.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/sxf/audit/LklMerAuditServiceImpl.java index 08c0b7b..bdcb3ae 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/sxf/audit/LklMerAuditServiceImpl.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/sxf/audit/LklMerAuditServiceImpl.java @@ -1,6 +1,7 @@ package cn.pluss.platform.sxf.audit; import cn.hutool.json.JSONUtil; +import cn.pluss.platform.entity.MerchantChannelStatus; import cn.pluss.platform.klk.LaKaLaUtility; import cn.pluss.platform.klk.LakalaConfig; import cn.pluss.platform.task.LklMerAuditHandler; @@ -54,4 +55,16 @@ public class LklMerAuditServiceImpl { "\t\"msg\": \"失败\"\n" + "}"; } + + + + public MerchantChannelStatus queryMerchantChannelStatus(String customerNo,String externalCustomerNo){ + return lklMerAuditHandler.queryMerchatChannelstatus(customerNo, externalCustomerNo); + } + + + + + + } diff --git a/pluss-service-bundle/src/main/java/cn/pluss/platform/task/LklMerAuditHandler.java b/pluss-service-bundle/src/main/java/cn/pluss/platform/task/LklMerAuditHandler.java index 865ece9..edda43a 100644 --- a/pluss-service-bundle/src/main/java/cn/pluss/platform/task/LklMerAuditHandler.java +++ b/pluss-service-bundle/src/main/java/cn/pluss/platform/task/LklMerAuditHandler.java @@ -4,11 +4,16 @@ import cn.hutool.core.util.ObjectUtil; import cn.pluss.platform.MerchantAuditRecordService; import cn.pluss.platform.entity.*; import cn.pluss.platform.exception.MsgException; +import cn.pluss.platform.klk.LaKaLaUtility; +import cn.pluss.platform.klk.LakalaConfig; +import cn.pluss.platform.klk.service.LklPayService; +import cn.pluss.platform.klk.service.impl.LaKalaInterfaceImpl; import cn.pluss.platform.mapper.*; import cn.pluss.platform.merchant.MerchantBaseInfoService; import cn.pluss.platform.merchant.MerchantCashPlaceService; import cn.pluss.platform.util.IpUtils; import cn.pluss.platform.util.LogExceptionUtils; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; @@ -21,9 +26,11 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Date; +import java.util.HashMap; import java.util.Map; @Slf4j @@ -63,9 +70,16 @@ public class LklMerAuditHandler{ private final MerchantStoreMapper merchantStoreMapper; private final MerchantImageMapper merchantImageMapper; + private final LaKalaInterfaceImpl laKalaInterface; + private final RestTemplate restTemplate; + @Lazy + @Autowired + private LakalaConfig lakalaConfig; + + public void auditHandler(Map map) { execute(map); } @@ -73,6 +87,7 @@ public class LklMerAuditHandler{ public void execute(Map map) { + if(ObjectUtil.isEmpty(map)||!map.containsKey("status")){ log.error("回调数据为空"); return; @@ -108,6 +123,36 @@ public class LklMerAuditHandler{ + public MerchantChannelStatus queryMerchatChannelstatus(String customerNo,String externalCustomerNo ){ + Map map= laKalaInterface.queryMerchat(customerNo, externalCustomerNo); + if(ObjectUtil.isEmpty(map)){ + return null; + } + if(map.containsKey("code")&&"000000".equals(map.get("code").toString())&&map.containsKey("data")&&ObjectUtil.isNotEmpty(map.get("data"))){ + String data = LaKaLaUtility.decrypt(lakalaConfig.getPubKey(),map.get("data").toString()); + JSONObject object=JSONObject.parseObject(data); + Map reqMap=new HashMap<>(); + + reqMap.put("customerNo",object.getJSONObject("customer").getString("customerNo")); + reqMap.put("contractId","query".concat(object.getJSONObject("customer").getString("openTime"))); + reqMap.put("userNo",LaKalaInterfaceImpl.userNo); + reqMap.put("externalCustomerNo",object.getJSONObject("customer").getString("externalCustomerNo")); + reqMap.put("termNos",object.getJSONObject("customer").getString("termNo")); + + reqMap.put("agencyNo",object.getJSONObject("customer").getString("agencyNo")); + reqMap.put("activeNo",object.getJSONObject("customer").getString("activeNo")); + reqMap.put("coreTermIds",object.getJSONArray("terminalInfo").toString()); + + return auditCallback(reqMap); + + } + return null; + + + } + + + @Transactional(rollbackFor = Exception.class) public MerchantChannelStatus auditCallback(Map map) { MerchantChannelStatus merchantChannelStatus = new MerchantChannelStatus()