之前一直配合源碼,來(lái)講,可能有點(diǎn)生硬,所以花了會(huì)功夫構(gòu)思了支付相關(guān)的應(yīng)用場(chǎng)景,寫了一個(gè)簡(jiǎn)化版的mapFunc的匹配案例,歡迎提建議
/*
支付相關(guān)的狀態(tài)機(jī)
*/
@Component
@Slf4j
@Builder
public class PayFuncMap implements IMapFunction {
/*
狀態(tài)入口:交易請(qǐng)求進(jìn)入
*/
@MapFunctionListener(name = "交易請(qǐng)求檢查",group = "deal",code = "requestEnter")
public StateNode dealRequestEnter(StateNode<HttpServletRequest, ResultDTO> currentNode){
log.info("交易請(qǐng)求進(jìn)入");
/*
注意此處聲明是servlet的請(qǐng)求體,最原始請(qǐng)求數(shù)據(jù),便于統(tǒng)一處理
*/
log.info(currentNode.getRequestDto().toString());
/*
跟據(jù)當(dāng)前節(jié)點(diǎn)的請(qǐng)求入?yún)?shù)去匹配子狀態(tài)機(jī)
*/
/*
這里加入一個(gè)子檢查狀態(tài)機(jī),簽名校驗(yàn),ip檢查,身份驗(yàn)證,交易能力,匹配請(qǐng)求成功或失敗
*/
/*
拿到子檢查狀態(tài)機(jī)的結(jié)果回歸主線狀態(tài)機(jī)匹配
*/
boolean 校驗(yàn)成功 = true;
if(校驗(yàn)成功){
return StateNode.builder().nodeCode("business_match").build();
}
//否則進(jìn)入交易異常
return StateNode.builder().nodeCode("deal_exception").build();
}
/*
用于匹配交易的實(shí)體
*/
static class BusinessInfo{}
@MapFunctionListener(name = "匹配具體交易",group = "business",code = "match")
public StateNode businessMatch(StateNode<BusinessInfo,ResultDTO> currentNode){
log.info("business_match");
log.info(currentNode.getRequestDto().toString());
/*
根據(jù)請(qǐng)求體去匹配 具體的第三方的支付或退款或賬單其他操作,等等
可以依據(jù)實(shí)際情況選擇是否分離子狀態(tài)機(jī)
*/
return StateNode.builder().response(ResultDTO.builder().message("測(cè)試終點(diǎn)狀態(tài)").build()).build();
}
@MapFunctionListener(name = "支付寶支付",group = "alipay",code = "o2oPay")
public StateNode alipayO2oPay(StateNode currentNode){
log.info("alipayO2oPay");
// 支付寶支付 子狀態(tài)機(jī)
/*
1.證書(shū)
2.特有參數(shù)組裝
3.發(fā)起支付請(qǐng)求
4.判斷請(qǐng)求成功與否
5.加入訂單(等待第三方的支付結(jié)果回調(diào),此處也許一個(gè)處理)
*/
return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
}
@MapFunctionListener(name = "支付寶退款",group = "alipay",code = "o2orenfund")
public StateNode alipayO2oRefund(StateNode currentNode){
log.info("alipayO2oRefund");
log.info("alipayO2oPay");
// 支付寶支付 子狀態(tài)機(jī)
/*
1.證書(shū)
2.特有參數(shù)組裝
3.發(fā)起退款請(qǐng)求
4.判斷請(qǐng)求成功與否
5.加入訂單(等待第三方的支付結(jié)果回調(diào),此處也許一個(gè)處理)
6.如果第三方不支持回調(diào),此處需要加入一個(gè)異步輪詢?nèi)蝿?wù)池
*/
return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
}
@MapFunctionListener(name = "交易結(jié)束",group = "deal",code = "end")
public StateNode dealEnd(StateNode currentNode){
log.info("test02");
return StateNode.builder().response(ResultDTO.builder().message("測(cè)試終點(diǎn)狀態(tài)").build()).build();
}
@MapFunctionListener(name = "交易異常",group = "deal",code = "exception")
public StateNode dealException(StateNode currentNode){
log.info("test03");
//測(cè)試異常
int ss = 1/0;
return StateNode.builder().nodeCode("t_test02").build();
}
}