跳转到内容

动态路由

动态路由

相关概念

示例代码

背景

为了支持 LogicFlow/LogicFunction/ExtensionPoint 接口同时存在多种实现的场景,可根据入参的不同值选择不同的实现执行,Trantor 在 framework 层面支持了动态逻辑流。

@RouteRuleMatch

  • 支付中心支付回调案例
/**
* 结构化支付网关支付回调数据
*
* @author terminus
*/
@Function(name = "payment callback handle")
@RouteRuleMatch("paramsTO.channel")
public interface CallbackPaymentFunc {
CallbackResultTO execute(HttpRequestParamsTO paramsTO);
}

@RouteRuleValue

  • 支付宝支付回调案例
/**
* 支付宝支付回调解析
*
* @author terminus
*/
@FunctionImpl(name = "callback alipay payment")
@RouteRuleValue({PaymentChannelDict.ALIPAY_APP, PaymentChannelDict.ALIPAY_PC, PaymentChannelDict.ALIPAY_WAP, PaymentChannelDict.ALIPAY_SCANNER})
public class CallbackAlipayPaymentFuncImpl implements CallbackPaymentFunc {
@Override
public CallbackResultTO execute(HttpRequestParamsTO paramsTO) {
AlipayCallbackTO callbackTO = JSONObject.parseObject(paramsTO.getFormParameter(), AlipayCallbackTO.class);
CallbackResultTO resultTO = CallbackResultTO.builder().build();
resultTO.setResponseMsg(paramsTO.getBody());
resultTO.setType(GatewayOperationDict.PAYMENT);
resultTO.setChannel(paramsTO.getChannel());
resultTO.setCallbackResponse("success");
resultTO.setMerchantSerialNo(callbackTO.getOut_trade_no());
resultTO.setGatewaySerialNo(callbackTO.getTrade_no());
switch (callbackTO.getTrade_status()) {
case AliPayGatewayStatusDict.TRADE_SUCCESS:
case AliPayGatewayStatusDict.TRADE_FINISHED:
resultTO.setPaySuccess(true);
resultTO.setStatus(GatewayStatusDict.SUCCESS);
break;
case AliPayGatewayStatusDict.WAIT_BUYER_PAY:
resultTO.setPaySuccess(false);
resultTO.setStatus(GatewayStatusDict.PROCESSING);
break;
case AliPayGatewayStatusDict.TRADE_CLOSED:
resultTO.setPaySuccess(false);
resultTO.setStatus(GatewayStatusDict.FAIL);
break;
default:
resultTO.setPaySuccess(false);
resultTO.setStatus(GatewayStatusDict.UNKNOWN);
break;
}
if (!Strings.isNullOrEmpty(callbackTO.getGmt_payment())) {
resultTO.setTradeTime(DateUtil.fromIsoDateTime(callbackTO.getGmt_payment()));
} else {
resultTO.setTradeTime(new Date());
}
return resultTO;
}
}
  • 微信支付回调案例
@Slf4j
@FunctionImpl(name = "wechatpay payment callback handle")
@RouteRuleValue({WECHATPAY_QR, WECHATPAY_APP, WECHATPAY_H5, WECHATPAY_WXAPP, WECHATPAY_JSAPI, WECHATPAY_SCANNER})
public class CallbackWechatpayPaymentFuncImpl implements CallbackPaymentFunc {
@Override
public CallbackResultTO execute(HttpRequestParamsTO paramsTO) {
try {
String requestBody = fetchDataFromBody(paramsTO);
WxPayNotifyResponse notifyResponse = XStreamUtil.parseModel(requestBody, WxPayNotifyResponse.class);
CallbackResultTO result = notifyResponse.toTradeResult(paramsTO.getChannel(), requestBody);
if (notifyResponse.isSuccess()) {
result.setPaySuccess(true);
result.setStatus(GatewayStatusDict.SUCCESS);
} else {
result.setPaySuccess(false);
result.setStatus(GatewayStatusDict.FAIL);
log.warn("pay not success of resultCode: {} where outTradeNo: {}", notifyResponse.getResultCode(),
notifyResponse.getOutTradeNo());
}
return result;
} catch (Exception e) {
log.warn("wechatpay callback fail, cause={}", Throwables.getStackTraceAsString(e));
return CallbackResultTO.builder()
.type(GatewayOperationDict.PAYMENT)
.channel(paramsTO.getChannel())
.paySuccess(false)
.status(GatewayStatusDict.FAIL)
.responseMsg("payment.call.back.fail")
.build();
}
}
}