"拉卡拉进件支付代码"

This commit is contained in:
hankaikai
2023-06-07 17:18:22 +08:00
parent 2f13c101cc
commit 53437eea3e
7 changed files with 315 additions and 98 deletions

View File

@@ -2,6 +2,8 @@ package cn.pluss.platform.klk.service;
import cn.hutool.core.util.ObjectUtil;
import cn.pluss.platform.api.ResultCode;
import cn.pluss.platform.constants.Constant;
import cn.pluss.platform.device.MercOrderNewService;
import cn.pluss.platform.dto.MemberScanPayDTO;
import cn.pluss.platform.dto.MerChantOrderDTO;
import cn.pluss.platform.entity.*;
@@ -10,21 +12,29 @@ import cn.pluss.platform.klk.LakalaConfig;
import cn.pluss.platform.klk.service.impl.LaKalaInterfaceImpl;
import cn.pluss.platform.mapper.MerchantBackLklMapper;
import cn.pluss.platform.mapper.MerchantBaseInfoMapper;
import cn.pluss.platform.merchantOrder.MerchantOrderService;
import cn.pluss.platform.pay.PayService;
import cn.pluss.platform.util.DateUtils;
import cn.pluss.platform.util.SnowFlakeUtil;
import cn.pluss.platform.util.StringUtil;
import cn.pluss.platform.ys.YsConfig;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.spring.web.json.Json;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service("lkLPayService")
@Slf4j
public class LkLPayServiceImpl implements PayService {
@@ -42,112 +52,206 @@ public class LkLPayServiceImpl implements PayService {
MerchantBaseInfoMapper merchantBaseInfoMapper;
@Autowired
private RestTemplate restTemplate;
@Resource
private MercOrderNewService mercOrderNewService;
@Override
public JSONObject tradePay(MerchantOrder order, MerchantChannelStatus channel, MerchantBaseInfo merchant) {
String account_type="WECHAT";
if(StringUtil.isNotEmpty(order.getScanType())&&"01".equals(order.getScanType())){
account_type="wechatPay".equals(order.getPayTypeCode())?"WECHAT":"aliPay".equals(order.getPayTypeCode()) ?"ALIPAY":"UQRCODEPAY";
}else {
String account_type = "WECHAT";
if (StringUtil.isNotEmpty(order.getScanType()) && "01".equals(order.getScanType())) {
account_type = "wechatPay".equals(order.getPayTypeCode()) ? "WECHAT" : "aliPay".equals(order.getPayTypeCode()) ? "ALIPAY" : "UQRCODEPAY";
} else {
account_type = "wechatPay".equals(order.getPayTypeCode()) ? "WECHAT" : "aliPay".equals(order.getPayTypeCode()) ? "ALIPAY" : "UQRCODEPAY";
}
String transType = account_type.equals("WECHAT") ? "71" : account_type.equals("ALIPAY") ? "41" : "51";
QueryWrapper<MerchantBackLkl> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("merchant_code", merchant.getMerchantCode());
queryWrapper.eq("channel", "5");
queryWrapper.eq("user_no", LaKalaInterfaceImpl.userNo);
MerchantBackLkl merchantBackLkl = merchantBackLklMapper.selectOne(queryWrapper);
MsgException.checkNull(merchantBackLkl, "渠道信息异常");
String req_time = DateUtils.getSdfTimes();
Long order_amt = new BigDecimal(order.getConsumeFee()).multiply(new BigDecimal(100)).longValue();
String body = null;
if (account_type.equals("WECHAT")) {
body = "{\n" +
"\t\"out_org_code\": \"" + lakalaConfig.getAppid() + "\",\n" +
"\t\"req_data\": {\n" +
"\"acc_busi_fields\": {\n" +
"\t\t\t\"user_id\": \"" + order.getMercUserId() + "\"\n" +
"\t\t}," +
"\t\t\"account_type\": \"" + account_type + "\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \"" + order.getIp() + "\"\n" +
"\t\t},\n" +
"\t\t\"merchant_no\": \"" + merchantBackLkl.getExternalCustomerNo() + "\",\n" +
"\t\t\"notify_url\": \"" + lakalaConfig.getCallBackUrl() + "\",\n" +
"\t\t\"out_trade_no\": \"" + order.getOrderNumber() + "\",\n" +
"\t\t\"term_no\": \"" + merchantBackLkl.getTermNos() + "\",\n" +
"\t\t\"total_amount\": \"" + order_amt + "\",\n" +
"\t\t\"trans_type\": \"" + transType + "\"\n" +
"\t},\n" +
"\t\"req_time\": \"" + req_time + "\",\n" +
"\t\"version\": \"3.0\"\n" +
"}";
}
if (account_type.equals("ALIPAY")) {
body = "{\n" +
"\t\"out_org_code\": \"" + lakalaConfig.getAppid() + "\",\n" +
"\t\"req_data\": {\n" +
"\t\t\"account_type\": \"" + account_type + "\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \"" + order.getIp() + "\"\n" +
"\t\t},\n" +
"\t\t\"merchant_no\": \"" + merchantBackLkl.getExternalCustomerNo() + "\",\n" +
"\t\t\"notify_url\": \"" + lakalaConfig.getCallBackUrl() + "\",\n" +
"\t\t\"out_trade_no\": \"" + order.getOrderNumber() + "\",\n" +
"\t\t\"term_no\": \"" + merchantBackLkl.getTermNos() + "\",\n" +
"\t\t\"total_amount\": \"" + order_amt + "\",\n" +
"\t\t\"trans_type\": \"" + transType + "\"\n" +
"\t},\n" +
"\t\"req_time\": \"" + req_time + "\",\n" +
"\t\"version\": \"3.0\"\n" +
"}";
}
String response = lklPayService.req(body, "api/v3/labs/trans/preorder");
JSONObject resp = new JSONObject();
if (ObjectUtil.isNotEmpty(response)) {
JSONObject payData = new JSONObject();
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("code") && "BBS00000".equals(object.getString("code"))) {
if (!(StringUtil.isNotEmpty(order.getScanType()) && "01".equals(order.getScanType()))) {
JSONObject acc_resp_fields = object.getJSONObject("resp_data").getJSONObject("acc_resp_fields");
if (Constant.PAY_TYPE_ALIPAY.equals(order.getPayTypeCode())) {
payData.put("source", acc_resp_fields.getString("code"));
} else if (Constant.PAY_TYPE_WECHAT.equals(order.getPayTypeCode())) {
payData.put("payAppId", acc_resp_fields.getString("app_id"));
payData.put("payTimeStamp", Long.valueOf(acc_resp_fields.getString("time_stamp")) * 1000);
payData.put("paynonceStr", acc_resp_fields.getString("nonce_str"));
payData.put("payPackage", acc_resp_fields.getString("package"));
payData.put("paySignType", acc_resp_fields.getString("sign_type"));
payData.put("paySign", acc_resp_fields.getString("pay_sign"));
} else {
payData.put("redirectUrl", acc_resp_fields.containsKey("redirect_url") ? acc_resp_fields.getString("redirect_url") : null);
}
} else {
payData.put("payUrl", object.get("code"));
payData.put("orderNumber", order.getOrderNumber());
payData.put("mercOrderNo", order.getMercOrderNo());
}
resp.put("code", ResultCode.SUCCESS.code());
payData.put("channel", channel.getChannel());
order.setTransNo((object.getJSONObject("resp_data").containsKey("log_no") && ObjectUtil.isNotEmpty(object.getJSONObject("resp_data").getString("log_no"))) ? object.getString("log_no") : "");
resp.put("payData", payData);
return resp;
} else if (object.containsKey("code") && "BBS16270".equals(object.getString("code"))) {
resp.put("code", ResultCode.FAIL.code());
resp.put("msg", object.getString("msg"));
return resp;
}
}
resp.put("code", ResultCode.FAIL.code());
resp.put("msg", "失败");
return resp;
return null;
}
@Override
public JSONObject tradePay(MerChantOrderDTO merchantOrderDTO, MerchantOrder order) {
QueryWrapper<MerchantBaseInfo> baseQueyWrapper=new QueryWrapper<>();
baseQueyWrapper.eq("merchantCode",merchantOrderDTO.getMerchantCode());
MerchantBaseInfo baseInfo= merchantBaseInfoMapper.selectOne(baseQueyWrapper);
MsgException.checkNull(baseInfo,"商户基本信息错误");
QueryWrapper<MerchantBaseInfo> baseQueyWrapper = new QueryWrapper<>();
baseQueyWrapper.eq("merchantCode", merchantOrderDTO.getMerchantCode());
MerchantBaseInfo baseInfo = merchantBaseInfoMapper.selectOne(baseQueyWrapper);
MsgException.checkNull(baseInfo, "商户基本信息错误");
QueryWrapper<MerchantBackLkl> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("merchant_code",merchantOrderDTO.getMerchantCode());
queryWrapper.eq("channel","5");
QueryWrapper<MerchantBackLkl> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("merchant_code", merchantOrderDTO.getMerchantCode());
queryWrapper.eq("channel", "5");
queryWrapper.eq("user_no", LaKalaInterfaceImpl.userNo);
MerchantBackLkl merchantBackLkl=merchantBackLklMapper.selectOne(queryWrapper);
MsgException.checkNull(merchantBackLkl,"进件信息不存在");
MerchantBackLkl merchantBackLkl = merchantBackLklMapper.selectOne(queryWrapper);
MsgException.checkNull(merchantBackLkl, "进件信息不存在");
JSONObject obj = new JSONObject(6);
String req_time= DateUtils.getSdfTimes();
String req_time = DateUtils.getSdfTimes();
Long order_amt = new BigDecimal(order.getConsumeFee()).multiply(new BigDecimal(100)).longValue();
String body="{\n" +
String body = "{\n" +
"\t\"req_data\": {\n" +
"\t\t\"merchant_no\": \""+merchantBackLkl.getExternalCustomerNo()+"\",\n" +
"\t\t\"term_no\": \""+merchantBackLkl.getTermNos()+"\",\n" +
"\t\t\"out_trade_no\": \""+order.getOrderNumber()+"\",\n" +
"\t\t\"total_amount\": \""+order_amt+"\",\n" +
"\t\t\"subject\": \""+baseInfo.getMccName()+"\",\n" +
"\t\t\"merchant_no\": \"" + merchantBackLkl.getExternalCustomerNo() + "\",\n" +
"\t\t\"term_no\": \"" + merchantBackLkl.getTermNos() + "\",\n" +
"\t\t\"out_trade_no\": \"" + order.getOrderNumber() + "\",\n" +
"\t\t\"total_amount\": \"" + order_amt + "\",\n" +
"\t\t\"subject\": \"" + baseInfo.getMccName() + "\",\n" +
"\t\t\"acc_busi_fields\": {},\n" +
"\t\t\"notify_url\": \""+lakalaConfig.getCallBackUrl()+"\",\n" +
"\t\t\"notify_url\": \"" + lakalaConfig.getCallBackUrl() + "\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \""+order.getIp()+"\"\n" +
"\t\t\t\"request_ip\": \"" + order.getIp() + "\"\n" +
"\t\t},\n" +
"\t\t\"auth_code\": \""+merchantOrderDTO.getAuthCode()+"\"\n" +
"\t\t\"auth_code\": \"" + merchantOrderDTO.getAuthCode() + "\"\n" +
"\t},\n" +
"\t\"out_org_code\": \""+lakalaConfig.getAppid()+"\",\n" +
"\t\"out_org_code\": \"" + lakalaConfig.getAppid() + "\",\n" +
"\t\"version\": \"3.0\",\n" +
"\t\"req_time\": "+req_time+"\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");
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", "7");
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")));
} 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"));
} else {
obj.put("code", ResultCode.FAIL.code());
obj.put("msg", object.get("msg"));
return obj;
}
}
obj.put("code",ResultCode.FAIL.code());
obj.put("msg","失败");
obj.put("code", ResultCode.FAIL.code());
obj.put("msg", "失败");
return obj;
}
@@ -179,19 +283,85 @@ public class LkLPayServiceImpl implements PayService {
@Override
public Map<String, Object> getUnionInfo(String userAuthCode, String paymentApp, String merchantId) throws Exception {
Map<String, Object> result = new HashMap<>();
// JSONObject reqData = new JSONObject(2);
// Map<String, Object> 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","获取成功");
String req_time = DateUtils.getSdfTimes();
QueryWrapper<MerchantBackLkl> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("merchant_code", merchantId);
queryWrapper.eq("channel", "5");
MerchantBackLkl merchantBackLkl = merchantBackLklMapper.selectOne(queryWrapper);
MsgException.checkNull(merchantBackLkl, "商户基本信息不完整");
String body = "{\n" +
"\"ver\":\"1.0.0\",\n" +
"\"timestamp\":\"" + System.currentTimeMillis() + "\",\n" +
"\"reqId\":\"" + req_time + "\",\n" +
"\"reqData\":{\n" +
"\"mercId\":\"" + merchantBackLkl.getExternalCustomerNo() + "\",\n" +
"\"termNo\":\"" + merchantBackLkl.getTermNos() + "\",\n" +
"\"authCode\":\"" + userAuthCode + "\",\n" +
"\"tradeCode\":\"030304\"\n" +
"}\n" +
"}\n";
String response = lklPayService.req(body, "api/v2/saas/query/wx_openid_query");
if (ObjectUtil.isNotEmpty(response)) {
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("retCode") && "BBS00000".equals(object.getString("retCode"))) {
JSONObject reqData = new JSONObject(2);
reqData.put("data", object.getJSONObject("respData").getString("openId"));
reqData.put("userAuthCode", userAuthCode);
reqData.put("appUpIdentifier", paymentApp);
result.put("data", reqData);
result.put("code", "1");
result.put("msg", "获取成功");
}
}
result.put("code","0");
result.put("msg", "获取失败");
return result;
}
@Setter(onMethod_ = {@Autowired, @Lazy})
private MerchantOrderService merchantOrderService;
@Override
public Object payNotifyCallBack(Map<String, String> params) {
Map<String, String> result = new HashMap<>(2);
result.put("code", "fail");
result.put("msg", "失败");
String trade_no = params.get("trade_no");
String ordNo = params.get("out_trade_no");
String acc_trade_no = params.get("acc_trade_no");
String payTime = params.get("trade_time");
String bizCode = params.get("trade_status");
String buyerId = params.get("user_id1");
if ("SUCCESS".equals(bizCode)) {
QueryWrapper<MerchantOrder> queryWrapper = new QueryWrapper<MerchantOrder>().eq("orderNumber", ordNo);
MerchantOrder order = merchantOrderService.getOne(queryWrapper);
if (order == null) {
log.error("====================>【拉卡拉】支付成功回调订单号查询,查询的订单为空:订单号:{}<====================", ordNo);
return YsConfig.RESULT_SUCCESS_CODE;
}
Date payDate = DateUtils.parse(payTime, "yyyy-MM-dd HH:mm:ss");
order.setTransDt(payDate);
order.setTransNo(trade_no);
order.setThirdTransNo(acc_trade_no);
merchantOrderService.updateOrderAndCreateProfit(order);
result.put("code", "success");
result.put("msg", "成功");
return result;
}
return null;
}

View File

@@ -78,28 +78,7 @@ public class LklPayService {
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" +
" \"req_data\": {\n" +
" \"merchant_no\": \"822290070111135\",\n" +
" \"term_no\": \"29034705\",\n" +
" \"out_trade_no\": \"FD660E1FAA3A4470933CDEDAE1EC1D8E\",\n" +
" \"auth_code\": \"135178236713755038\",\n" +
" \"total_amount\": \"123\",\n" +
" \"location_info\": {\n" +
" \"request_ip\": \"10.176.1.192\",\n" +
" \"location\": \"+37.123456789,-121.123456789\"\n" +
" }\n" +
" }\n" +
"}";
return new JSONObject();
}

View File

@@ -12,6 +12,7 @@ import cn.pluss.platform.exception.MsgException;
import cn.pluss.platform.exception.PayRiskException;
import cn.pluss.platform.fans.FansService;
import cn.pluss.platform.ipLocation.IpLocationService;
import cn.pluss.platform.klk.service.LkLPayServiceImpl;
import cn.pluss.platform.klk.service.LklPayService;
import cn.pluss.platform.leshua.LeshuaSignature;
import cn.pluss.platform.mapper.*;
@@ -146,6 +147,8 @@ public class MerchantServiceImpl implements MerchantService {
@Setter(onMethod_ = {@Autowired, @Lazy})
private LklPayService lklPayService;
@Setter(onMethod_ = {@Autowired, @Lazy})
LkLPayServiceImpl lkLPayServiceImpl;
@Override
@@ -425,7 +428,7 @@ public class MerchantServiceImpl implements MerchantService {
result = ysPayOldService.tradePay(order, channel,merchant);
}else if(channel.getChannel()==5){
//拉卡拉的主扫接口
result=lklPayService.tradePay(order,channel,merchant);
result=lkLPayServiceImpl.tradePay(order,channel,merchant);
}
else {
MsgException.throwException("未知通道");
@@ -1404,7 +1407,7 @@ public class MerchantServiceImpl implements MerchantService {
unionInfo = ysPayOldService.getUnionInfo(userAuthCode, payMentApp,null);
}else if(channel.getChannel()==5){
//拉卡拉的被扫接口
lklPayService.tradePay(orderAmt,channel,auth_code,IpUtils.getIpAddr(request),payMentApp);
// lklPayService.tradePay(orderAmt,channel,auth_code,IpUtils.getIpAddr(request),payMentApp);
}
else {

View File

@@ -20,6 +20,7 @@ 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.klk.service.impl.LaKalaInterfaceImpl;
import cn.pluss.platform.mapper.*;
import cn.pluss.platform.memberOrder.MemberOrderService;
import cn.pluss.platform.merchant.MerchantCashPlaceService;
@@ -2347,6 +2348,37 @@ public class MerchantOrderServiceImpl extends ServiceImpl<MerchantOrderMapper, M
}
}
break;
case 5:
order.setAisleSwitch("5");
if(StringUtil.isEmpty(channel.getSettlementType()) || YsBusinessCodeEnum.D0.getName().equals(channel.getSettlementType())){
order.setSettlementType(SettleTypeEnum.D0.getValue());
}else{
order.setSettlementType(SettleTypeEnum.D1.getValue());
}
order.setChannelRate(new BigDecimal(0.0038).multiply(new BigDecimal(10000)));
order.setChannelFee(new BigDecimal(order.getConsumeFee().toString()).multiply(new BigDecimal(0.0038)).setScale(2,BigDecimal.ROUND_HALF_UP));
if(params.get("payWay") == null){
orderPrefix = "LKL_";
}else{
if("WXZF".equalsIgnoreCase((String) params.get("payWay"))){
orderPrefix = "LKL_W_";
order.setPayTypeCode(Constant.PAY_TYPE_WECHAT);
order.setPayTypeName(Constant.PAY_TYPE_NAME_WECHAT);
}else if("ZFBZF".equalsIgnoreCase((String)params.get("payWay"))){
orderPrefix = "LKL_Z_";
order.setPayTypeCode(Constant.PAY_TYPE_ALIPAY);
order.setPayTypeName(Constant.PAY_TYPE_NAME_ALIPAY);
}else if("UNIONPAY".equalsIgnoreCase((String)params.get("payWay"))){
if(order.getConsumeFee() > 1000.0d){
order.setChannelRate(YsOldConstants.CREDIT_DEBIT_CARD_BANK_RATE_LARGE.multiply(new BigDecimal(10000)));
order.setChannelFee(new BigDecimal(order.getConsumeFee().toString()).multiply(YsOldConstants.CREDIT_DEBIT_CARD_BANK_RATE_LARGE).setScale(2,BigDecimal.ROUND_HALF_UP));
}
orderPrefix = "LKL_Y_";
order.setPayTypeCode(Constant.PAY_TYPE_YSFPAY);
order.setPayTypeName(Constant.PAY_TYPE_NAME_YSFPAY);
}
}
break;
default:
throw new MsgException("无效的通道");
}