diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/controller/mobile/LakalaController.java b/mall-pay/src/main/java/com/suisung/mall/pay/controller/mobile/LakalaController.java index 78677a63..76d5e33f 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/controller/mobile/LakalaController.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/controller/mobile/LakalaController.java @@ -8,62 +8,60 @@ package com.suisung.mall.pay.controller.mobile; -import cn.hutool.json.JSONObject; -import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.service.impl.BaseControllerImpl; -import com.suisung.mall.pay.service.LakalaPayService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import org.springframework.util.Base64Utils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Api(tags = "拉卡拉相关接口 - 前端控制器") @RestController @RequestMapping("/mobile/pay/lakala") public class LakalaController extends BaseControllerImpl { - - @Resource - private LakalaPayService lakalaPayService; +// +// @Resource +// private LakalaPayService lakalaPayService; @ApiOperation(value = "本地文件转base64", notes = "本地文件转base64") @RequestMapping(value = "/file2base64", method = RequestMethod.POST) public String file2Base64(@RequestParam("file") MultipartFile file) throws IOException { - String str=Base64Utils.encodeToString(file.getBytes()); + String str = Base64Utils.encodeToString(file.getBytes()); return str; } - @ApiOperation(value = "商户分账业务开通申请", notes = "商户分账业务开通申请") - @RequestMapping(value = "/ledger/applyLedgerMer", method = RequestMethod.POST) - public CommonResult ledgerApplyLedgerMer(@RequestBody JSONObject paramsJSON) { - return lakalaPayService.applyLedgerMer(paramsJSON); - } - - @ApiOperation(value = "商户分账业务开通申请异步回调回调", notes = "商户分账业务开通申请异步回调回调") - @RequestMapping(value = "/ledger/applyLedgerMerNotify", method = RequestMethod.POST) - public JSONObject ledgerApplyLedgerMerNotify(HttpServletRequest request) { - return lakalaPayService.applyLedgerMerNotify(request); - } - - @ApiOperation(value = "分账接收方创建申请", notes = "分账接收方创建申请") - @RequestMapping(value = "/ledger/applyLedgerReceiver", method = RequestMethod.POST) - public CommonResult applyLedgerReceiver(@RequestBody JSONObject paramsJSON) { - return lakalaPayService.applyLedgerReceiver(paramsJSON); - } - - @ApiOperation(value = "分账关系绑定申请", notes = "分账关系绑定申请") - @RequestMapping(value = "/ledger/applyBind", method = RequestMethod.POST) - public CommonResult applyBind(@RequestBody JSONObject paramsJSON) { - return lakalaPayService.applyLedgerMerReceiverBind(paramsJSON); - } - - @ApiOperation(value = "分账关系绑定申请异步回调通知", notes = "分账关系绑定申请异步回调通知") - @RequestMapping(value = "/ledger/applyBindNotify", method = RequestMethod.POST) - public JSONObject applyBindNotify(HttpServletRequest request) { - return lakalaPayService.applyLedgerMerReceiverBindNotify(request); - } +// @ApiOperation(value = "商户分账业务开通申请", notes = "商户分账业务开通申请") +// @RequestMapping(value = "/ledger/applyLedgerMer", method = RequestMethod.POST) +// public CommonResult ledgerApplyLedgerMer(@RequestBody JSONObject paramsJSON) { +// return lakalaPayService.applyLedgerMer(paramsJSON); +// } +// +// @ApiOperation(value = "商户分账业务开通申请异步回调回调", notes = "商户分账业务开通申请异步回调回调") +// @RequestMapping(value = "/ledger/applyLedgerMerNotify", method = RequestMethod.POST) +// public JSONObject ledgerApplyLedgerMerNotify(HttpServletRequest request) { +// return lakalaPayService.applyLedgerMerNotify(request); +// } +// +// @ApiOperation(value = "分账接收方创建申请", notes = "分账接收方创建申请") +// @RequestMapping(value = "/ledger/applyLedgerReceiver", method = RequestMethod.POST) +// public CommonResult applyLedgerReceiver(@RequestBody JSONObject paramsJSON) { +// return lakalaPayService.applyLedgerReceiver(paramsJSON); +// } +// +// @ApiOperation(value = "分账关系绑定申请", notes = "分账关系绑定申请") +// @RequestMapping(value = "/ledger/applyBind", method = RequestMethod.POST) +// public CommonResult applyBind(@RequestBody JSONObject paramsJSON) { +// return lakalaPayService.applyLedgerMerReceiverBind(paramsJSON); +// } +// +// @ApiOperation(value = "分账关系绑定申请异步回调通知", notes = "分账关系绑定申请异步回调通知") +// @RequestMapping(value = "/ledger/applyBindNotify", method = RequestMethod.POST) +// public JSONObject applyBindNotify(HttpServletRequest request) { +// return lakalaPayService.applyLedgerMerReceiverBindNotify(request); +// } } diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/LakalaPayService.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/LakalaPayService.java index 498ec846..8e6b6b82 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/LakalaPayService.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/LakalaPayService.java @@ -9,11 +9,8 @@ package com.suisung.mall.pay.service; import cn.hutool.json.JSONObject; -import com.suisung.mall.common.api.CommonResult; import org.springframework.data.util.Pair; -import javax.servlet.http.HttpServletRequest; - public interface LakalaPayService { Boolean initLKLSDK(); @@ -26,6 +23,7 @@ public interface LakalaPayService { * @param termNo 终端号 * @param xcxAppId 小程序appid * @param openId openid + * @param storeId 店铺Id * @param orderId 订单号 * @param subject 订单标题 * @param totalAmount 订单金额 @@ -36,6 +34,26 @@ public interface LakalaPayService { */ JSONObject lklTransPreOrder(String merchantNo, String termNo, String xcxAppId, String openId, String storeId, String orderId, String subject, String totalAmount, String notifyURL, String requestIP, String remark); + /** + * 拉卡拉合单预下单 + * 参考:https://o.lakala.com/#/home/document/detail?id=208 + * + * @param merchantNo 商户号(商城商家) + * @param termNo 终端号 + * @param agentMerchantNo 运费代理商商户号 + * @param xcxAppId 小程序appid + * @param openId openid + * @param storeId 店铺Id + * @param orderId 订单号 + * @param subject 订单标题 + * @param totalAmount 订单总金额 + * @param agentAmount 代理商收取金额 + * @param notifyURL 回调地址 + * @param requestIP 请求ip + **/ + JSONObject lklTransMergePreOrder(String merchantNo, String termNo, String agentMerchantNo, String xcxAppId, String openId, String storeId, String orderId, String subject, String totalAmount, String agentAmount, String notifyURL, String requestIP, String remark); + + /** * 执行内部拉卡拉交易退款 * 参考地址:https://o.lakala.com/#/home/document/detail?id=113 @@ -62,52 +80,52 @@ public interface LakalaPayService { JSONObject uploadFile(String orderNo, String attType, String attExtName, String attContext); - /** - * 商户分账业务开通申请 - * 参考:https://o.lakala.com/#/home/document/detail?id=379 - * - * @param paramsJSON - * @return - */ - CommonResult applyLedgerMer(JSONObject paramsJSON); - - /** - * 商户分账业务开通申请回调 - * 参考:https://o.lakala.com/#/home/document/detail?id=379 - * - * @param request - * @return - */ - JSONObject applyLedgerMerNotify(HttpServletRequest request); - - /** - * 分账接收方创建申请 - * 参考:https://o.lakala.com/#/home/document/detail?id=380 - * - * @param paramsJSON - * @return - */ - CommonResult applyLedgerReceiver(JSONObject paramsJSON); - - - /** - * 分账关系绑定申请 - * 参考:https://o.lakala.com/#/home/document/detail?id=386 - * - * @param paramsJSON - * @return - */ - CommonResult applyLedgerMerReceiverBind(JSONObject paramsJSON); - - - /** - * 分账关系绑定申请回调 - * 参考:https://o.lakala.com/#/home/document/detail?id=379 - * - * @param request - * @return - */ - JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request); +// /** +// * 商户分账业务开通申请 +// * 参考:https://o.lakala.com/#/home/document/detail?id=379 +// * +// * @param paramsJSON +// * @return +// */ +// CommonResult applyLedgerMer(JSONObject paramsJSON); +// +// /** +// * 商户分账业务开通申请回调 +// * 参考:https://o.lakala.com/#/home/document/detail?id=379 +// * +// * @param request +// * @return +// */ +// JSONObject applyLedgerMerNotify(HttpServletRequest request); +// +// /** +// * 分账接收方创建申请 +// * 参考:https://o.lakala.com/#/home/document/detail?id=380 +// * +// * @param paramsJSON +// * @return +// */ +// CommonResult applyLedgerReceiver(JSONObject paramsJSON); +// +// +// /** +// * 分账关系绑定申请 +// * 参考:https://o.lakala.com/#/home/document/detail?id=386 +// * +// * @param paramsJSON +// * @return +// */ +// CommonResult applyLedgerMerReceiverBind(JSONObject paramsJSON); +// +// +// /** +// * 分账关系绑定申请回调 +// * 参考:https://o.lakala.com/#/home/document/detail?id=379 +// * +// * @param request +// * @return +// */ +// JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request); } diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java index 84ef10f2..26d43b56 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/LakalaPayServiceImpl.java @@ -16,18 +16,15 @@ import cn.hutool.json.JSONUtil; import com.ijpay.core.kit.IpKit; import com.lkl.laop.sdk.LKLSDK; import com.lkl.laop.sdk.exception.SDKException; -import com.lkl.laop.sdk.request.*; +import com.lkl.laop.sdk.request.V2MmsOpenApiUploadFileRequest; +import com.lkl.laop.sdk.request.V3LabsRelationRefundRequest; +import com.lkl.laop.sdk.request.V3LabsTransPreorderRequest; import com.lkl.laop.sdk.request.model.V3LabsTradeLocationInfo; import com.lkl.laop.sdk.request.model.V3LabsTradePreorderWechatBus; -import com.suisung.mall.common.api.CommonResult; import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.feignService.ShopService; -import com.suisung.mall.common.modules.lakala.LklLedgerMember; -import com.suisung.mall.common.modules.lakala.LklLedgerMerReceiverBind; -import com.suisung.mall.common.modules.lakala.LklLedgerReceiver; import com.suisung.mall.common.modules.store.ShopStoreBase; import com.suisung.mall.common.utils.I18nUtil; -import com.suisung.mall.common.utils.StringUtils; import com.suisung.mall.pay.service.LakalaPayService; import com.suisung.mall.pay.service.LklLedgerMemberService; import com.suisung.mall.pay.service.LklLedgerMerReceiverBindService; @@ -43,9 +40,6 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; @Slf4j @@ -187,6 +181,95 @@ public class LakalaPayServiceImpl implements LakalaPayService { } } + /** + * 拉卡拉合单预下单(主要有运费的订单使用合单) + * 参考:https://o.lakala.com/#/home/document/detail?id=208 + * + * @param merchantNo 商户号(商城商家) + * @param termNo 终端号 + * @param agentMerchantNo 运费代理商商户号 + * @param xcxAppId 小程序appid + * @param openId openid + * @param storeId 店铺Id + * @param orderId 订单号 + * @param subject 订单标题 + * @param totalAmount 订单总金额 + * @param agentAmount 代理商收取金额 + * @param notifyURL 回调地址 + * @param requestIP 请求ip + * @param remark + **/ + @Override + public JSONObject lklTransMergePreOrder(String merchantNo, String termNo, String agentMerchantNo, String xcxAppId, String openId, String storeId, String orderId, String subject, String totalAmount, String agentAmount, String notifyURL, String requestIP, String remark) { + // 1. 配置初始化 + initLKLSDK(); + + if (StrUtil.isBlank(merchantNo) || StrUtil.isBlank(termNo)) { + throw new ApiException("缺少商户号或终端号!"); + } + + if (StrUtil.isBlank(agentMerchantNo)) { + throw new ApiException("缺少代理商商户号!"); + } + + //2. 装配数据 + /*** 微信主扫场景示例 */ + + + V3LabsTransPreorderRequest v3LabsTransPreorderWechatReq = new V3LabsTransPreorderRequest(); + + v3LabsTransPreorderWechatReq.setMerchantNo(merchantNo); + v3LabsTransPreorderWechatReq.setTermNo(termNo); + v3LabsTransPreorderWechatReq.setOutTradeNo(orderId); + v3LabsTransPreorderWechatReq.setSubject(subject); + //微信:WECHAT 支付宝:ALIPAY 银联:UQRCODEPAY 翼支付: BESTPAY 苏宁易付宝: SUNING 拉卡拉支付账户:LKLACC 网联小钱包:NUCSPAY 京东钱包:JD + v3LabsTransPreorderWechatReq.setAccountType("WECHAT"); + // 41:NATIVE((ALIPAY,云闪付支持,京东白条分期)51:JSAPI(微信公众号支付,支付宝服务窗支付,银联JS支付,翼支付JS支付、拉卡拉钱包支付)71:微信小程序支付 61:APP支付(微信APP支付) + v3LabsTransPreorderWechatReq.setTransType("51"); + v3LabsTransPreorderWechatReq.setTotalAmount(totalAmount); // 应支付金额,单位:分 + v3LabsTransPreorderWechatReq.setSettleType("1"); //“0”或者空,常规结算方式,如需接拉卡拉分账通需传“1”,商户未开通分账之前切记不用上送此参数。; + v3LabsTransPreorderWechatReq.setNotifyUrl(notifyURL); + v3LabsTransPreorderWechatReq.setRemark(remark); + + //地址位置信息 + V3LabsTradeLocationInfo v3LabsTradePreorderLocationInfo = new V3LabsTradeLocationInfo(requestIP); + v3LabsTransPreorderWechatReq.setLocationInfo(v3LabsTradePreorderLocationInfo); + + //微信主扫场景下 acc_busi_fields 域内容 + V3LabsTradePreorderWechatBus wechatBus = new V3LabsTradePreorderWechatBus(); + wechatBus.setSubAppid(xcxAppId); // 小程序appId + wechatBus.setUserId(openId); // 微信 openId + wechatBus.setDeviceInfo("WEB"); // 终端设备号(门店号或收银设备ID),注意:PC网页或JSAPI支付请传”WEB” + // wechatBus.setAttach(storeId); // 附加数据,商户自定义数据,在查询交易结果时原样返回。 + v3LabsTransPreorderWechatReq.setAccBusiFields(wechatBus); + + try { + log.info("拉卡拉预下单请求参数:{}", JSONUtil.toJsonStr(v3LabsTransPreorderWechatReq)); + + //3. 发送请求 + String responseStr = LKLSDK.httpPost(v3LabsTransPreorderWechatReq); + log.info("拉卡拉预下单响应数据:{}", responseStr); + if (StrUtil.isBlank(responseStr)) { + return null; + } + + JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); + + if (lakalaRespJSON != null && lakalaRespJSON.getStr("code").equals("BBS00000")) { + // 新增一个拉卡拉订单记录 shop_order_lkl 表 + JSONObject lklPayReqAndRespJson = new JSONObject(); + lklPayReqAndRespJson.put("req", JSONUtil.parseObj(v3LabsTransPreorderWechatReq)); + lklPayReqAndRespJson.put("resp", lakalaRespJSON); + shopService.lklPayAddShopOrderLkl(lklPayReqAndRespJson); + } + //4. 响应 + return lakalaRespJSON; + } catch (SDKException e) { + log.error("拉卡拉支付出错:", e); + throw new ApiException(I18nUtil._("支付失败!"), e); + } + } + /** * 执行内部拉卡拉交易退款 @@ -319,330 +402,330 @@ public class LakalaPayServiceImpl implements LakalaPayService { } } - @Override - public CommonResult applyLedgerMer(JSONObject paramsJSON) { - // 1. 配置初始化 - initLKLSDK(); - - //2. 装配数据 - V2MmsOpenApiLedgerApplyLedgerMerRequest req = new V2MmsOpenApiLedgerApplyLedgerMerRequest(); - req.setVersion("2.0"); - String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 - req.setOrderNo(orderNo); - req.setOrgCode(orgCode); - req.setMerInnerNo(paramsJSON.getStr("merInnerNo")); - req.setMerCupNo(paramsJSON.getStr("merCupNo")); - req.setContactMobile(paramsJSON.getStr("contactMobile")); - req.setSplitLowestRatio(new BigDecimal(paramsJSON.getStr("splitLowestRatio"))); - String fileName = paramsJSON.getStr("splitEntrustFileName"); - req.setSplitEntrustFileName(fileName); - - // 分账结算委托书文件上传到拉卡拉服务器 - JSONObject fileUploadResp = uploadFile(orderNo, "SPLIT_ENTRUST_FILE", StringUtils.getFileExt(fileName), paramsJSON.getStr("splitEntrustFile")); - if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { - throw new ApiException(I18nUtil._("分账结算委托书上传失败!")); - } - - String splitEntrustFilePath = fileUploadResp.getStr("attFileId"); - req.setSplitEntrustFilePath(splitEntrustFilePath); //比如:G1/M00/06/64/CrFdEmBQc-aAGc_XAAAiIbS3WIE960.pdf; - - if (isProdProject()) { - projectDomain = projectDomain + "/api"; - } - // 给拉卡拉通知的回调地址 - String retUrl = projectDomain + "/mobile/pay/lakala/ledger/applyLedgerMerNotify"; - req.setRetUrl(retUrl); - - paramsJSON.set("orderNo", orderNo); - paramsJSON.set("version", "2.0"); - paramsJSON.set("ret_url", retUrl); - paramsJSON.set("org_code", orgCode); - paramsJSON.set("split_entrust_file_path", splitEntrustFilePath); - - try { - //3. 发送请求 - String responseStr = LKLSDK.httpPost(req); - - // {'retCode':'000000','retMsg':'申请已受理,请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}} - JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); - if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { - throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); - } - - paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId")); - paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg")); - paramsJSON.set("audit_status_text", paramsJSON.get("remark")); - - // 新增数据 - // 将 JSON 对象的键名转换为下划线命名 - LklLedgerMember lklLedgerMember = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class); - lklLedgerMemberService.saveOrUpdateByMerCupNo(lklLedgerMember); - - return CommonResult.success(null, "提交成功,待审核中!"); - } catch (SDKException e) { - log.error("分账申请失败:", e); - throw new ApiException(I18nUtil._("分账申请失败!"), e); - } - } - - /** - * 商户分账业务开通申请回调 - * 参考:https://o.lakala.com/#/home/document/detail?id=379 - * - * @param request - * @return - */ - @Override - public JSONObject applyLedgerMerNotify(HttpServletRequest request) { - // 验签 - String authorization = request.getHeader("Authorization"); - String requestBody = LakalaUtil.getBody(request); - - boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); - if (!checkSuccess) { - return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); - } - - JSONObject paramsJSON = JSONUtil.parseObj(requestBody); - - JSONObject respData = new JSONObject(); - respData.put("retCode", "OP90003"); - respData.put("retMsg", "响应处理失败!"); - - if (paramsJSON != null && paramsJSON.get("respData") != null) { - JSONObject reqData = (JSONObject) paramsJSON.get("respData"); - - Boolean success = lklLedgerMemberService.updateAuditResult(reqData.getStr("applyId"), - reqData.getStr("merInnerNo"), - reqData.getStr("merCupNo"), - reqData.getStr("entrustFileName"), - reqData.getStr("entrustFilePath"), - reqData.getStr("auditStatus"), - reqData.getStr("auditStatusText"), - reqData.getStr("remark")); - - if (success) { - respData.put("retCode", "000000"); - respData.put("retMsg", "操作成功!"); - } - } - - return respData; - } - - /** - * 分账接收方创建申请 - * 参考:https://o.lakala.com/#/home/document/detail?id=380 - * - * @param paramsJSON - * @return - */ - @Override - public CommonResult applyLedgerReceiver(JSONObject paramsJSON) { - // 1. 配置初始化 - initLKLSDK(); - - //2. 装配数据 - V2MmsOpenApiLedgerApplyLedgerReceiverRequest req = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest(); - - String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 - req.setOrderNo(orderNo); - req.setOrgCode(orgCode); - req.setVersion("2.0"); - - req.setReceiverName(paramsJSON.getStr("receiverName")); - req.setContactMobile(paramsJSON.getStr("contactMobile")); - - req.setLicenseNo(paramsJSON.getStr("licenseNo")); - req.setLicenseName(paramsJSON.getStr("licenseName")); - req.setLegalPersonName(paramsJSON.getStr("legalPersonName")); - req.setLegalPersonCertificateType(paramsJSON.getStr("legalPersonCertificateType")); - req.setLegalPersonCertificateNo(paramsJSON.getStr("legalPersonCertificateNo")); - - req.setAcctNo(paramsJSON.getStr("acctNo")); - req.setAcctName(paramsJSON.getStr("acctName")); - req.setAcctTypeCode(paramsJSON.getStr("acctTypeCode")); - req.setAcctCertificateType(paramsJSON.getStr("acctCertificateType")); - - req.setAcctCertificateNo(paramsJSON.getStr("acctCertificateNo")); - req.setAcctOpenBankCode(paramsJSON.getStr("acctOpenBankCode")); - req.setAcctOpenBankName(paramsJSON.getStr("acctOpenBankName")); - req.setAcctClearBankCode(paramsJSON.getStr("acctClearBankCode")); - - if (paramsJSON.getJSONArray("attachList") != null && paramsJSON.getJSONArray("attachList").size() > 0) { - List attachList = new ArrayList<>(); - V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo attachInfo = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo(); - for (JSONObject attachJSON : paramsJSON.getJSONArray("attachList").jsonIter()) { - String fileName = attachJSON.getStr("attachName"); - String attachType = attachJSON.getStr("attachType"); - String fileBase64 = attachJSON.getStr("attachStoreFile"); - attachInfo.setAttachName(fileName); - attachInfo.setAttachType(attachType); - - JSONObject fileUploadResp = uploadFile(StringUtils.genLklOrderNo(8), attachType, - StringUtils.getFileExt(fileName), fileBase64); - if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { - throw new ApiException(I18nUtil._("附件上传失败!")); - } - - attachInfo.setAttachStorePath(fileUploadResp.getStr("attFileId")); - attachList.add(attachInfo); - } - - req.setAttachList(attachList); - paramsJSON.set("attach_list", JSONUtil.toJsonStr(attachList)); - } - - paramsJSON.set("orderNo", orderNo); - paramsJSON.set("version", "2.0"); - paramsJSON.set("org_code", orgCode); - - try { - //3. 发送请求,申请创建分账接收方 - String responseStr = LKLSDK.httpPost(req); - - JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); - if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { - throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); - } - - paramsJSON.set("receiver_no", lakalaRespJSON.getByPath("respData.receiverNo")); - paramsJSON.set("org_id", lakalaRespJSON.getByPath("respData.orgId")); - paramsJSON.set("org_name", lakalaRespJSON.getByPath("respData.orgName")); - - // 新增数据 - // 将 JSON 对象的键名转换为下划线命名 - LklLedgerReceiver lklLedgerReceiver = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerReceiver.class); - - // 新增或修改本地数据 - lklLedgerReceiverService.saveOrUpdateByReceiverNo(lklLedgerReceiver); - - return CommonResult.success(null, "接收方创建成功!"); - } catch (SDKException e) { - log.error("接收方创建失败:", e); - throw new ApiException(I18nUtil._("接收方创建失败!"), e); - } - } - - /** - * 分账关系绑定申请 - * 参考:https://o.lakala.com/#/home/document/detail?id=386 - * - * @param paramsJSON - * @return - */ - @Override - public CommonResult applyLedgerMerReceiverBind(JSONObject paramsJSON) { - // 1. 配置初始化 - initLKLSDK(); - - //2. 装配数据 - V2MmsOpenApiLedgerApplyBindRequest req = new V2MmsOpenApiLedgerApplyBindRequest(); - - String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 - req.setOrderNo(orderNo); - req.setOrgCode(orgCode); - req.setVersion("2.0"); - - req.setMerInnerNo(paramsJSON.getStr("merInnerNo")); - req.setMerCupNo(paramsJSON.getStr("merCupNo")); - req.setReceiverNo(paramsJSON.getStr("receiverNo")); - - String fileName = paramsJSON.getStr("entrustFileName"); - String splitEntrustFileBase64 = paramsJSON.getStr("entrustFile"); - req.setEntrustFileName(fileName); - - String retUrl = projectDomain + "/mobile/pay/lakala/ledger/applyLedgerMerReceiverBindNotify"; - req.setRetUrl(retUrl); - - // 文件上传到拉卡拉服务器 - JSONObject fileUploadResp = uploadFile(orderNo, - "SPLIT_COOPERATION_FILE", - StringUtils.getFileExt(fileName), - splitEntrustFileBase64); - if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { - throw new ApiException(I18nUtil._("合作协议上传失败!")); - } - - String entrustFilePath = fileUploadResp.getStr("attFileId"); - req.setEntrustFilePath(entrustFilePath); - - paramsJSON.set("orderNo", orderNo); - paramsJSON.set("version", "2.0"); - paramsJSON.set("ret_url", retUrl); - paramsJSON.set("org_code", orgCode); - paramsJSON.set("entrust_file_name", fileName); - paramsJSON.set("entrust_file_path", entrustFilePath); - - try { - //3. 发送请求 - String responseStr = LKLSDK.httpPost(req); - - JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); - if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { - throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); - } - - paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId")); - paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg")); - - // 新增数据 - // 将 JSON 对象的键名转换为下划线命名 - LklLedgerMerReceiverBind lklLedgerMerReceiverBind = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMerReceiverBind.class); - lklLedgerMerReceiverBindService.saveOrUpdateByMerCupNoReceiverNo(lklLedgerMerReceiverBind); - - return CommonResult.success(null, "提交成功,待审核中!"); - } catch (SDKException e) { - log.error("分账绑定关系申请失败:", e); - throw new ApiException(I18nUtil._("分账绑定关系申请失败!"), e); - } - } - - /** - * 分账关系绑定申请回调 - * 参考:https://o.lakala.com/#/home/document/detail?id=379 - * - * @param request - * @return - */ - @Override - public JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request) { - // 验签 - String authorization = request.getHeader("Authorization"); - String requestBody = LakalaUtil.getBody(request); - - boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); - if (!checkSuccess) { - return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); - } - +// @Override +// public CommonResult applyLedgerMer(JSONObject paramsJSON) { +// // 1. 配置初始化 +// initLKLSDK(); +// +// //2. 装配数据 +// V2MmsOpenApiLedgerApplyLedgerMerRequest req = new V2MmsOpenApiLedgerApplyLedgerMerRequest(); +// req.setVersion("2.0"); +// String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 +// req.setOrderNo(orderNo); +// req.setOrgCode(orgCode); +// req.setMerInnerNo(paramsJSON.getStr("merInnerNo")); +// req.setMerCupNo(paramsJSON.getStr("merCupNo")); +// req.setContactMobile(paramsJSON.getStr("contactMobile")); +// req.setSplitLowestRatio(new BigDecimal(paramsJSON.getStr("splitLowestRatio"))); +// String fileName = paramsJSON.getStr("splitEntrustFileName"); +// req.setSplitEntrustFileName(fileName); +// +// // 分账结算委托书文件上传到拉卡拉服务器 +// JSONObject fileUploadResp = uploadFile(orderNo, "SPLIT_ENTRUST_FILE", StringUtils.getFileExt(fileName), paramsJSON.getStr("splitEntrustFile")); +// if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { +// throw new ApiException(I18nUtil._("分账结算委托书上传失败!")); +// } +// +// String splitEntrustFilePath = fileUploadResp.getStr("attFileId"); +// req.setSplitEntrustFilePath(splitEntrustFilePath); //比如:G1/M00/06/64/CrFdEmBQc-aAGc_XAAAiIbS3WIE960.pdf; +// +// if (isProdProject()) { +// projectDomain = projectDomain + "/api"; +// } +// // 给拉卡拉通知的回调地址 +// String retUrl = projectDomain + "/mobile/pay/lakala/ledger/applyLedgerMerNotify"; +// req.setRetUrl(retUrl); +// +// paramsJSON.set("orderNo", orderNo); +// paramsJSON.set("version", "2.0"); +// paramsJSON.set("ret_url", retUrl); +// paramsJSON.set("org_code", orgCode); +// paramsJSON.set("split_entrust_file_path", splitEntrustFilePath); +// +// try { +// //3. 发送请求 +// String responseStr = LKLSDK.httpPost(req); +// +// // {'retCode':'000000','retMsg':'申请已受理,请等待审核结果','respData':{'version':'1.0','orderNo':'KFPT20230223181025407788734','orgCode':'1','applyId':681201215598657536}} +// JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); +// if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { +// throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); +// } +// +// paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId")); +// paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg")); +// paramsJSON.set("audit_status_text", paramsJSON.get("remark")); +// +// // 新增数据 +// // 将 JSON 对象的键名转换为下划线命名 +// LklLedgerMember lklLedgerMember = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMember.class); +// lklLedgerMemberService.saveOrUpdateByMerCupNo(lklLedgerMember); +// +// return CommonResult.success(null, "提交成功,待审核中!"); +// } catch (SDKException e) { +// log.error("分账申请失败:", e); +// throw new ApiException(I18nUtil._("分账申请失败!"), e); +// } +// } +// +// /** +// * 商户分账业务开通申请回调 +// * 参考:https://o.lakala.com/#/home/document/detail?id=379 +// * +// * @param request +// * @return +// */ +// @Override +// public JSONObject applyLedgerMerNotify(HttpServletRequest request) { +// // 验签 +// String authorization = request.getHeader("Authorization"); // String requestBody = LakalaUtil.getBody(request); - - JSONObject paramsJSON = JSONUtil.parseObj(requestBody); - JSONObject respData = new JSONObject(); - respData.put("retCode", "OP90003"); - respData.put("retMsg", "响应处理失败!"); - - if (paramsJSON != null && paramsJSON.get("respData") != null) { - JSONObject reqData = (JSONObject) paramsJSON.get("respData"); - - Boolean success = lklLedgerMerReceiverBindService.updateAuditResult(reqData.getStr("applyId"), - reqData.getStr("merInnerNo"), - reqData.getStr("merCupNo"), - reqData.getStr("receiverNo"), - reqData.getStr("entrustFileName"), - reqData.getStr("entrustFilePath"), - reqData.getStr("auditStatus"), - reqData.getStr("auditStatusText"), - reqData.getStr("remark")); - if (success) { - respData.put("retCode", "000000"); - respData.put("retMsg", "操作成功!"); - } - } - - return respData; - } +// +// boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); +// if (!checkSuccess) { +// return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); +// } +// +// JSONObject paramsJSON = JSONUtil.parseObj(requestBody); +// +// JSONObject respData = new JSONObject(); +// respData.put("retCode", "OP90003"); +// respData.put("retMsg", "响应处理失败!"); +// +// if (paramsJSON != null && paramsJSON.get("respData") != null) { +// JSONObject reqData = (JSONObject) paramsJSON.get("respData"); +// +// Boolean success = lklLedgerMemberService.updateAuditResult(reqData.getStr("applyId"), +// reqData.getStr("merInnerNo"), +// reqData.getStr("merCupNo"), +// reqData.getStr("entrustFileName"), +// reqData.getStr("entrustFilePath"), +// reqData.getStr("auditStatus"), +// reqData.getStr("auditStatusText"), +// reqData.getStr("remark")); +// +// if (success) { +// respData.put("retCode", "000000"); +// respData.put("retMsg", "操作成功!"); +// } +// } +// +// return respData; +// } +// +// /** +// * 分账接收方创建申请 +// * 参考:https://o.lakala.com/#/home/document/detail?id=380 +// * +// * @param paramsJSON +// * @return +// */ +// @Override +// public CommonResult applyLedgerReceiver(JSONObject paramsJSON) { +// // 1. 配置初始化 +// initLKLSDK(); +// +// //2. 装配数据 +// V2MmsOpenApiLedgerApplyLedgerReceiverRequest req = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest(); +// +// String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 +// req.setOrderNo(orderNo); +// req.setOrgCode(orgCode); +// req.setVersion("2.0"); +// +// req.setReceiverName(paramsJSON.getStr("receiverName")); +// req.setContactMobile(paramsJSON.getStr("contactMobile")); +// +// req.setLicenseNo(paramsJSON.getStr("licenseNo")); +// req.setLicenseName(paramsJSON.getStr("licenseName")); +// req.setLegalPersonName(paramsJSON.getStr("legalPersonName")); +// req.setLegalPersonCertificateType(paramsJSON.getStr("legalPersonCertificateType")); +// req.setLegalPersonCertificateNo(paramsJSON.getStr("legalPersonCertificateNo")); +// +// req.setAcctNo(paramsJSON.getStr("acctNo")); +// req.setAcctName(paramsJSON.getStr("acctName")); +// req.setAcctTypeCode(paramsJSON.getStr("acctTypeCode")); +// req.setAcctCertificateType(paramsJSON.getStr("acctCertificateType")); +// +// req.setAcctCertificateNo(paramsJSON.getStr("acctCertificateNo")); +// req.setAcctOpenBankCode(paramsJSON.getStr("acctOpenBankCode")); +// req.setAcctOpenBankName(paramsJSON.getStr("acctOpenBankName")); +// req.setAcctClearBankCode(paramsJSON.getStr("acctClearBankCode")); +// +// if (paramsJSON.getJSONArray("attachList") != null && paramsJSON.getJSONArray("attachList").size() > 0) { +// List attachList = new ArrayList<>(); +// V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo attachInfo = new V2MmsOpenApiLedgerApplyLedgerReceiverRequest.AttachInfo(); +// for (JSONObject attachJSON : paramsJSON.getJSONArray("attachList").jsonIter()) { +// String fileName = attachJSON.getStr("attachName"); +// String attachType = attachJSON.getStr("attachType"); +// String fileBase64 = attachJSON.getStr("attachStoreFile"); +// attachInfo.setAttachName(fileName); +// attachInfo.setAttachType(attachType); +// +// JSONObject fileUploadResp = uploadFile(StringUtils.genLklOrderNo(8), attachType, +// StringUtils.getFileExt(fileName), fileBase64); +// if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { +// throw new ApiException(I18nUtil._("附件上传失败!")); +// } +// +// attachInfo.setAttachStorePath(fileUploadResp.getStr("attFileId")); +// attachList.add(attachInfo); +// } +// +// req.setAttachList(attachList); +// paramsJSON.set("attach_list", JSONUtil.toJsonStr(attachList)); +// } +// +// paramsJSON.set("orderNo", orderNo); +// paramsJSON.set("version", "2.0"); +// paramsJSON.set("org_code", orgCode); +// +// try { +// //3. 发送请求,申请创建分账接收方 +// String responseStr = LKLSDK.httpPost(req); +// +// JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); +// if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { +// throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); +// } +// +// paramsJSON.set("receiver_no", lakalaRespJSON.getByPath("respData.receiverNo")); +// paramsJSON.set("org_id", lakalaRespJSON.getByPath("respData.orgId")); +// paramsJSON.set("org_name", lakalaRespJSON.getByPath("respData.orgName")); +// +// // 新增数据 +// // 将 JSON 对象的键名转换为下划线命名 +// LklLedgerReceiver lklLedgerReceiver = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerReceiver.class); +// +// // 新增或修改本地数据 +// lklLedgerReceiverService.saveOrUpdateByReceiverNo(lklLedgerReceiver); +// +// return CommonResult.success(null, "接收方创建成功!"); +// } catch (SDKException e) { +// log.error("接收方创建失败:", e); +// throw new ApiException(I18nUtil._("接收方创建失败!"), e); +// } +// } +// +// /** +// * 分账关系绑定申请 +// * 参考:https://o.lakala.com/#/home/document/detail?id=386 +// * +// * @param paramsJSON +// * @return +// */ +// @Override +// public CommonResult applyLedgerMerReceiverBind(JSONObject paramsJSON) { +// // 1. 配置初始化 +// initLKLSDK(); +// +// //2. 装配数据 +// V2MmsOpenApiLedgerApplyBindRequest req = new V2MmsOpenApiLedgerApplyBindRequest(); +// +// String orderNo = StringUtils.genLklOrderNo(8); // 8位随机数 +// req.setOrderNo(orderNo); +// req.setOrgCode(orgCode); +// req.setVersion("2.0"); +// +// req.setMerInnerNo(paramsJSON.getStr("merInnerNo")); +// req.setMerCupNo(paramsJSON.getStr("merCupNo")); +// req.setReceiverNo(paramsJSON.getStr("receiverNo")); +// +// String fileName = paramsJSON.getStr("entrustFileName"); +// String splitEntrustFileBase64 = paramsJSON.getStr("entrustFile"); +// req.setEntrustFileName(fileName); +// +// String retUrl = projectDomain + "/mobile/pay/lakala/ledger/applyLedgerMerReceiverBindNotify"; +// req.setRetUrl(retUrl); +// +// // 文件上传到拉卡拉服务器 +// JSONObject fileUploadResp = uploadFile(orderNo, +// "SPLIT_COOPERATION_FILE", +// StringUtils.getFileExt(fileName), +// splitEntrustFileBase64); +// if (fileUploadResp == null || StrUtil.isBlank(fileUploadResp.getStr("attFileId"))) { +// throw new ApiException(I18nUtil._("合作协议上传失败!")); +// } +// +// String entrustFilePath = fileUploadResp.getStr("attFileId"); +// req.setEntrustFilePath(entrustFilePath); +// +// paramsJSON.set("orderNo", orderNo); +// paramsJSON.set("version", "2.0"); +// paramsJSON.set("ret_url", retUrl); +// paramsJSON.set("org_code", orgCode); +// paramsJSON.set("entrust_file_name", fileName); +// paramsJSON.set("entrust_file_path", entrustFilePath); +// +// try { +// //3. 发送请求 +// String responseStr = LKLSDK.httpPost(req); +// +// JSONObject lakalaRespJSON = JSONUtil.parseObj(responseStr); +// if (lakalaRespJSON == null || !lakalaRespJSON.getStr("retCode").equals("000000")) { +// throw new ApiException(I18nUtil._(lakalaRespJSON.getStr("retMsg"))); +// } +// +// paramsJSON.set("apply_id", lakalaRespJSON.getByPath("respData.applyId")); +// paramsJSON.set("remark", lakalaRespJSON.getStr("retMsg")); +// +// // 新增数据 +// // 将 JSON 对象的键名转换为下划线命名 +// LklLedgerMerReceiverBind lklLedgerMerReceiverBind = JSONUtil.toBean(StringUtils.convertCamelToSnake(paramsJSON.toString()), LklLedgerMerReceiverBind.class); +// lklLedgerMerReceiverBindService.saveOrUpdateByMerCupNoReceiverNo(lklLedgerMerReceiverBind); +// +// return CommonResult.success(null, "提交成功,待审核中!"); +// } catch (SDKException e) { +// log.error("分账绑定关系申请失败:", e); +// throw new ApiException(I18nUtil._("分账绑定关系申请失败!"), e); +// } +// } +// +// /** +// * 分账关系绑定申请回调 +// * 参考:https://o.lakala.com/#/home/document/detail?id=379 +// * +// * @param request +// * @return +// */ +// @Override +// public JSONObject applyLedgerMerReceiverBindNotify(HttpServletRequest request) { +// // 验签 +// String authorization = request.getHeader("Authorization"); +// String requestBody = LakalaUtil.getBody(request); +// +// boolean checkSuccess = LakalaUtil.verify(authorization, requestBody, lklNotifyCerPath); +// if (!checkSuccess) { +// return JSONUtil.createObj().set("retCode", "OP90002").set("retMsg", "验签失败!"); +// } +// +//// String requestBody = LakalaUtil.getBody(request); +// +// JSONObject paramsJSON = JSONUtil.parseObj(requestBody); +// JSONObject respData = new JSONObject(); +// respData.put("retCode", "OP90003"); +// respData.put("retMsg", "响应处理失败!"); +// +// if (paramsJSON != null && paramsJSON.get("respData") != null) { +// JSONObject reqData = (JSONObject) paramsJSON.get("respData"); +// +// Boolean success = lklLedgerMerReceiverBindService.updateAuditResult(reqData.getStr("applyId"), +// reqData.getStr("merInnerNo"), +// reqData.getStr("merCupNo"), +// reqData.getStr("receiverNo"), +// reqData.getStr("entrustFileName"), +// reqData.getStr("entrustFilePath"), +// reqData.getStr("auditStatus"), +// reqData.getStr("auditStatusText"), +// reqData.getStr("remark")); +// if (success) { +// respData.put("retCode", "000000"); +// respData.put("retMsg", "操作成功!"); +// } +// } +// +// return respData; +// } } diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java index 5eaa6e7a..e40401c2 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java @@ -693,6 +693,7 @@ public class PayUserPayServiceImpl extends BaseServiceImpl 1) { -// SettlementMethod = 1; // 结算类型:0-秒到(不分账);1-次日结算(需要分账) -// } + String settleType = String.format("D%d", 1); reqJsonBody.put("settleType", settleType); //结算类型:0-秒到(不分账);1-次日结算(需要分账) // formData.put("settlementType", "AUTOMATIC"); // 结算方式:MANUAL:手动结算(结算至拉卡拉APP钱包),AUTOMATIC:自动结算到银行卡,REGULAR:定时结算(仅企业商户支持) @@ -521,7 +517,6 @@ public class LklTkServiceImpl { JSONObject response = RestTemplateHttpUtil.sendLklPost(buildLklTkUrl(urlPath), header, reqJsonBody, JSONObject.class); logger.debug("拉卡拉进件响应参数:{}", response); - if (ObjectUtil.isEmpty(response) || response.get("retCode") == null || !"000000".equals(response.getStr("retCode"))) { diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/utils/LakalaUtil.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/utils/LakalaUtil.java index 439ad777..ab24669c 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/utils/LakalaUtil.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/utils/LakalaUtil.java @@ -70,8 +70,9 @@ public class LakalaUtil { /** * 获取配置文件内容 * - * @param fileName recource 文件夹下的路径,如:palyKey/wx/lakala_public_key.cer - * @param keepLineBreaks 保留换行符 + * @param fileName recource 文件夹下的路径,如:palyKey/wx/lakala_public_key.cer + * @param keepLineBreaks 保留换行符 + * @param stripPemHeaders 是否去除PEM格式的密钥头和尾 BEGGIN和END标签 * @return */ public static String getResourceFile(String fileName, boolean keepLineBreaks, boolean stripPemHeaders) { @@ -148,6 +149,12 @@ public class LakalaUtil { } } + /** + * 去除PEM格式的密钥头和尾 BEGGIN和END标签 + * + * @param key + * @return + */ public static String stripPemHeaders(String key) { if (key == null || key.isEmpty()) { return key;