parent
c85be0e647
commit
5956ab89d3
@ -0,0 +1,326 @@ |
|||||||
|
package com.hfkj.channel.tianque.service; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hfkj.channel.tianque.config.TianQueConfig; |
||||||
|
import com.hfkj.channel.tianque.utils.RequestUtil; |
||||||
|
import com.hfkj.common.exception.ErrorCode; |
||||||
|
import com.hfkj.common.exception.ErrorHelp; |
||||||
|
import com.hfkj.common.exception.SysCode; |
||||||
|
import com.hfkj.common.utils.DateUtil; |
||||||
|
import com.hfkj.config.CommonSysConst; |
||||||
|
import com.hfkj.entity.*; |
||||||
|
import com.hfkj.service.*; |
||||||
|
import com.hfkj.sysenum.*; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import javax.annotation.Resource; |
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @className: TianQueTradeService |
||||||
|
* @author: HuRui |
||||||
|
* @date: 2023/9/4 |
||||||
|
**/ |
||||||
|
@Component |
||||||
|
public class TianQueTradeService { |
||||||
|
|
||||||
|
private static Logger log = LoggerFactory.getLogger(TianQueTradeService.class); |
||||||
|
@Resource |
||||||
|
private BsTradeOrderService tradeOrderService; |
||||||
|
@Resource |
||||||
|
private BsTradeOrderMsgService tradeOrderMsgService; |
||||||
|
@Resource |
||||||
|
private BsMerPlatformNoService merPlatformNoService; |
||||||
|
@Resource |
||||||
|
private BsTradeOrderRefundService tradeOrderRefundService; |
||||||
|
@Resource |
||||||
|
private BsMerService merService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 交易【主扫】 |
||||||
|
* @param tradeNo 订单号 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public Map<String, Object> preorder(String tradeNo) { |
||||||
|
log.info("========= Start 交易【主扫】 Start ==========="); |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrder order = tradeOrderService.getOrderByOutTradeNo(tradeNo); |
||||||
|
if (order == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到交易订单"); |
||||||
|
} |
||||||
|
if (!order.getStatus().equals(TradeOrderStatusEnum.status1.getNumber())) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "订单不处于待支付状态"); |
||||||
|
} |
||||||
|
// 查询商户号
|
||||||
|
BsMerPlatformNo platformNo = merPlatformNoService.getPlatformNo(order.getMerId(), PlatformTypeEnum.type5); |
||||||
|
if (platformNo == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到商户号"); |
||||||
|
} |
||||||
|
// 查询商户
|
||||||
|
BsMer mer = merService.getMer(order.getMerId()); |
||||||
|
if (mer == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未知的商户信息"); |
||||||
|
} |
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("mno", platformNo.getPlatformNo()); |
||||||
|
param.put("ordNo", order.getOutTradeNo()); |
||||||
|
param.put("amt", order.getTradeActualAmount()); |
||||||
|
param.put("payType", order.getPayMode()); |
||||||
|
param.put("payWay", "02"); |
||||||
|
if (StringUtils.isNotBlank(order.getSubject())) { |
||||||
|
param.put("subject", order.getSubject()); |
||||||
|
} else { |
||||||
|
param.put("subject", mer.getMerAbbreviate()); |
||||||
|
} |
||||||
|
if (StringUtils.isNotBlank(order.getRequestIp())) { |
||||||
|
param.put("trmIp", order.getRequestIp()); |
||||||
|
} else { |
||||||
|
param.put("trmIp", "0.0.0.0"); |
||||||
|
} |
||||||
|
if (order.getTimeoutExpress() != null) { |
||||||
|
param.put("timeExpire", order.getTimeoutExpress()); |
||||||
|
} |
||||||
|
if (order.getPayMode().equals(TradeOrderPayModeEnum.WECHAT.getCode())) { |
||||||
|
if (StringUtils.isBlank(order.getPayAppid())) { |
||||||
|
param.put("subAppid", "wxa075e8509802f826"); |
||||||
|
} else { |
||||||
|
param.put("subAppid", order.getPayAppid()); |
||||||
|
} |
||||||
|
} |
||||||
|
param.put("userId", order.getPayUserId()); |
||||||
|
param.put("ledgerAccountFlag", "01"); // 异步分账类型 00 异步分账,01 不分账,04 多次分账
|
||||||
|
if (order.getCreateType() != null && order.getCreateType().equals(TradeOrderCreateTypeEnum.type3.getCode())) { |
||||||
|
param.put("notifyUrl", CommonSysConst.getSysConfig().getTianque_open_api_pay_notify_url()); |
||||||
|
} else { |
||||||
|
param.put("notifyUrl", CommonSysConst.getSysConfig().getTianque_micro_pay_ret_url()); |
||||||
|
} |
||||||
|
|
||||||
|
// 请求记录
|
||||||
|
log.info("请求参数:", JSONObject.toJSONString(param)); |
||||||
|
BsTradeOrderMsg orderMsg = new BsTradeOrderMsg(); |
||||||
|
orderMsg.setOutTradeNo(tradeNo); |
||||||
|
orderMsg.setType(TradeOrderMsgTypeEnum.type1.getNumber()); |
||||||
|
orderMsg.setRequestContent(JSONObject.toJSONString(param)); |
||||||
|
tradeOrderMsgService.editTradeOrderMsg(orderMsg); |
||||||
|
|
||||||
|
JSONObject response = null; |
||||||
|
if (order.getTransType().equals("JSAPI")) { |
||||||
|
response = RequestUtil.request(TianQueConfig.requestUrl + "/order/jsapiScan", param); |
||||||
|
|
||||||
|
} else if (order.getTransType().equals("NATIVE")) { |
||||||
|
response = RequestUtil.request(TianQueConfig.requestUrl + "/order/activePlusScan", param); |
||||||
|
} |
||||||
|
orderMsg.setResponseContent(response.toJSONString()); |
||||||
|
tradeOrderMsgService.editTradeOrderMsg(orderMsg); |
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
|
||||||
|
Map<String, Object> returnMap = new HashMap<>(); |
||||||
|
returnMap.put("order", order); |
||||||
|
returnMap.put("payMode", order.getPayMode()); |
||||||
|
returnMap.put("platformType", PlatformTypeEnum.type5.getNumber()); |
||||||
|
|
||||||
|
Map<String, Object> payParam = new HashMap<>(); |
||||||
|
|
||||||
|
Map<String, Object> accRespFields = new HashMap<>(); |
||||||
|
accRespFields.put("nonce_str", StringUtils.isNotBlank(response.getString("paynonceStr"))?response.getString("paynonceStr"):""); |
||||||
|
accRespFields.put("code", StringUtils.isNotBlank(response.getString("payUrl"))?response.getString("payUrl"):""); |
||||||
|
accRespFields.put("package", StringUtils.isNotBlank(response.getString("payPackage"))?response.getString("payPackage"):""); |
||||||
|
accRespFields.put("form_data", ""); |
||||||
|
accRespFields.put("time_stamp", StringUtils.isNotBlank(response.getString("payTimeStamp"))?response.getString("payTimeStamp"):""); |
||||||
|
accRespFields.put("code_image", ""); |
||||||
|
accRespFields.put("app_id", StringUtils.isNotBlank(response.getString("payAppId"))?response.getString("payAppId"):""); |
||||||
|
accRespFields.put("sign_type", StringUtils.isNotBlank(response.getString("paySignType"))?response.getString("paySignType"):""); |
||||||
|
accRespFields.put("redirect_url", StringUtils.isNotBlank(response.getString("redirectUrl"))?response.getString("redirectUrl"):""); |
||||||
|
accRespFields.put("best_pay_info", ""); |
||||||
|
String prepay_id = ""; |
||||||
|
if (StringUtils.isNotBlank(response.getString("prepayId"))) { |
||||||
|
prepay_id = response.getString("prepayId"); |
||||||
|
|
||||||
|
} else if (StringUtils.isNotBlank(response.getString("source"))) { |
||||||
|
prepay_id = response.getString("source"); |
||||||
|
|
||||||
|
} |
||||||
|
accRespFields.put("prepay_id", prepay_id); |
||||||
|
accRespFields.put("pay_sign", StringUtils.isNotBlank(response.getString("paySign"))?response.getString("paySign"):""); |
||||||
|
payParam.put("acc_resp_fields", accRespFields); |
||||||
|
|
||||||
|
returnMap.put("payParam", JSONObject.parseObject(JSONObject.toJSONString(payParam))); |
||||||
|
log.info("========= END 交易【主扫】 END ==========="); |
||||||
|
|
||||||
|
return returnMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询交易 |
||||||
|
* @param tradeNo 订单号 |
||||||
|
*/ |
||||||
|
public JSONObject queryTrade(String tradeNo) { |
||||||
|
log.info("========= Start 交易查询 Start ==========="); |
||||||
|
try { |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrder order = tradeOrderService.getOrderByOutTradeNo(tradeNo); |
||||||
|
if (order == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到交易订单"); |
||||||
|
} |
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("mno", order.getPlatformMerNo()); |
||||||
|
param.put("ordNo", order.getOutTradeNo()); |
||||||
|
JSONObject response = RequestUtil.request(TianQueConfig.requestUrl + "/query/tradeQuery", param); |
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
return response; |
||||||
|
} catch (Exception e) { |
||||||
|
return null; |
||||||
|
} finally { |
||||||
|
log.info("========= END 交易查询 END ==========="); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 手续费查询 |
||||||
|
* @param tradeNo 订单号 |
||||||
|
*/ |
||||||
|
public JSONObject poundageQuery(String merNo,String tradeNo) { |
||||||
|
log.info("========= Start 手续费查询 Start ==========="); |
||||||
|
try { |
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("mno", merNo); |
||||||
|
param.put("ordNo", tradeNo); |
||||||
|
JSONObject response = RequestUtil.request(TianQueConfig.requestUrl + "/query/poundageQuery", param); |
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
return response; |
||||||
|
} catch (Exception e) { |
||||||
|
return null; |
||||||
|
} finally { |
||||||
|
log.info("========= END 手续费查询 END ==========="); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 退款 |
||||||
|
* @param refundNo 订单号 |
||||||
|
*/ |
||||||
|
public Map<String, Object> refund(String refundNo, BigDecimal refundAmount) { |
||||||
|
log.info("========= Start 交易退款 Start ==========="); |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrderRefund orderRefund = tradeOrderRefundService.getRefundByRefundNo(refundNo); |
||||||
|
if (orderRefund == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单"); |
||||||
|
} |
||||||
|
if (!orderRefund.getStatus().equals(TradeOrderRefundStatusEnum.status1.getNumber())) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "订单不处于退款中状态"); |
||||||
|
} |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrder order = tradeOrderService.getOrderByOutTradeNo(orderRefund.getOutTradeNo()); |
||||||
|
if (order == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到交易订单"); |
||||||
|
} |
||||||
|
|
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("mno", order.getPlatformMerNo()); |
||||||
|
param.put("ordNo", orderRefund.getRefundNo()); |
||||||
|
param.put("origOrderNo", order.getOutTradeNo()); |
||||||
|
param.put("amt", refundAmount); |
||||||
|
param.put("refundReason", orderRefund.getRefundReason()); |
||||||
|
// param.put("notifyUrl", orderRefund.getRefundReason());
|
||||||
|
JSONObject response = RequestUtil.request(TianQueConfig.requestUrl + "/order/refund", param); |
||||||
|
// 请求记录
|
||||||
|
BsTradeOrderMsg orderMsg = new BsTradeOrderMsg(); |
||||||
|
orderMsg.setOutTradeNo(refundNo); |
||||||
|
orderMsg.setType(TradeOrderMsgTypeEnum.type1.getNumber()); |
||||||
|
orderMsg.setRequestContent(JSONObject.toJSONString(param)); |
||||||
|
orderMsg.setResponseContent(response.toJSONString()); |
||||||
|
tradeOrderMsgService.editTradeOrderMsg(orderMsg); |
||||||
|
|
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
/* // 是否分账
|
||||||
|
if (order.getProfitSharingStatus().equals(true)) { |
||||||
|
// 查询分账记录
|
||||||
|
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getProfitSharingByTradeOrderId(ProfitSharingCmdTypeEnum.CMD_TYPE_1, order.getId()); |
||||||
|
if (tradeOrderProfitSharing != null && tradeOrderProfitSharing.getStatus().equals(ProfitSharingStatusEnum.status3.getNumber())) { |
||||||
|
laKaLaTradeSeparateService.cancel(tradeOrderProfitSharing.getProfitSharingOrderNo()); |
||||||
|
} |
||||||
|
}*/ |
||||||
|
|
||||||
|
orderRefund.setPlatformOrderNo(response.getString("uuid")); |
||||||
|
orderRefund.setAccTradeNo(response.getString("transactionId")); |
||||||
|
orderRefund.setTotalAmount(order.getTradeActualAmount()); |
||||||
|
orderRefund.setRefundAmount(response.getBigDecimal("amt")); |
||||||
|
orderRefund.setPayerAmount(response.getBigDecimal("amt")); |
||||||
|
orderRefund.setSettleAmount(response.getBigDecimal("realRefundAmount")); |
||||||
|
orderRefund.setSettleDate(DateUtil.format(response.getString("clearDt"), "yyyyMMdd")); |
||||||
|
orderRefund.setRefundTime(new Date()); |
||||||
|
orderRefund.setStatus(TradeOrderRefundStatusEnum.status2.getNumber()); |
||||||
|
tradeOrderRefundService.editOrderRefund(orderRefund); |
||||||
|
|
||||||
|
order.setStatus(TradeOrderStatusEnum.status6.getNumber()); |
||||||
|
tradeOrderService.editOrder(order); |
||||||
|
|
||||||
|
Map<String, Object> returnMap = new HashMap<>(); |
||||||
|
returnMap.put("order", order); |
||||||
|
returnMap.put("orderRefund", orderRefund); |
||||||
|
log.info("========= END 交易退款 END ==========="); |
||||||
|
return returnMap; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 退款查询 |
||||||
|
* @param refundNo 订单号 |
||||||
|
*/ |
||||||
|
public Map<String, Object> refundQuery(String refundNo) { |
||||||
|
log.info("========= Start 退款查询 Start ==========="); |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrderRefund orderRefund = tradeOrderRefundService.getRefundByRefundNo(refundNo); |
||||||
|
if (orderRefund == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到订单"); |
||||||
|
} |
||||||
|
// 查询交易订单
|
||||||
|
BsTradeOrder order = tradeOrderService.getOrderByOutTradeNo(orderRefund.getOutTradeNo()); |
||||||
|
if (order == null) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到交易订单"); |
||||||
|
} |
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("mno", order.getPlatformMerNo()); |
||||||
|
param.put("ordNo", orderRefund.getRefundNo()); |
||||||
|
JSONObject response = RequestUtil.request(TianQueConfig.requestUrl + "/query/refundQuery", param); |
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
log.info("========= END 退款查询 END ==========="); |
||||||
|
return response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取银联用户标识 |
||||||
|
* @param userAuthCode 授权码 |
||||||
|
* @param paymentApp 银联支付标识 |
||||||
|
*/ |
||||||
|
public JSONObject getUnionInfo(String userAuthCode,String paymentApp) { |
||||||
|
log.info("========= Start 获取银联用户标识 Start ==========="); |
||||||
|
// 查询交易订单
|
||||||
|
Map<String,Object> param = new HashMap<>(); |
||||||
|
param.put("userAuthCode", userAuthCode); |
||||||
|
param.put("paymentApp", paymentApp); |
||||||
|
JSONObject response = RequestUtil.request(TianQueConfig.requestUrl + "/query/getUnionInfo", param); |
||||||
|
if (!"0000".equals(response.getString("bizCode"))) { |
||||||
|
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, response.getString("bizMsg")); |
||||||
|
} |
||||||
|
log.info("========= END 获取银联用户标识 END ==========="); |
||||||
|
return response; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.hfkj.sysenum; |
||||||
|
|
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
/** |
||||||
|
* 结算类型 |
||||||
|
* @author hurui |
||||||
|
*/ |
||||||
|
|
||||||
|
public enum MerOnlineType { |
||||||
|
type1(1, "APP"), |
||||||
|
type2(2, "网站"), |
||||||
|
type3(3, "公众号/小程序/服务窗"), |
||||||
|
; |
||||||
|
|
||||||
|
private Integer number; |
||||||
|
|
||||||
|
private String name; |
||||||
|
|
||||||
|
|
||||||
|
MerOnlineType(int number, String name) { |
||||||
|
this.number = number; |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public static MerOnlineType getDataByNumber(Integer number) { |
||||||
|
for (MerOnlineType ele : values()) { |
||||||
|
if (Objects.equals(number,ele.getNumber())) { |
||||||
|
return ele; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getNumber() { |
||||||
|
return number; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNumber(Integer number) { |
||||||
|
this.number = number; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package com.hfkj.sysenum; |
||||||
|
|
||||||
|
import java.util.Objects; |
||||||
|
|
||||||
|
/** |
||||||
|
* 结算类型 |
||||||
|
* @author hurui |
||||||
|
*/ |
||||||
|
|
||||||
|
public enum MerOperateType { |
||||||
|
type1(1, "线下"), |
||||||
|
type2(2, "线上"), |
||||||
|
; |
||||||
|
|
||||||
|
private Integer number; |
||||||
|
|
||||||
|
private String name; |
||||||
|
|
||||||
|
MerOperateType(int number, String name) { |
||||||
|
this.number = number; |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public static MerOperateType getDataByNumber(Integer number) { |
||||||
|
for (MerOperateType ele : values()) { |
||||||
|
if (Objects.equals(number,ele.getNumber())) { |
||||||
|
return ele; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getNumber() { |
||||||
|
return number; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNumber(Integer number) { |
||||||
|
this.number = number; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue