动态路由
动态路由
示例代码
背景
为了支持 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(); }
}}