支付寶介面對接指南(四、回撥通知對接:websoket方式)【保姆級】
阿新 • • 發佈:2021-01-27
技術標籤:支付寶開放介面對接javajavaspring boot支付寶
導航
導讀
- 經過前三篇的解讀,對支付寶開放介面對接已經有了大體的瞭解,下面針對支付寶回撥通知對接進行詳細闡述,完成整體的支付寶介面對接閉環。開門見山。老規矩先上gitee程式碼。
gitee程式碼地址
- https://gitee.com/zhaifengxi/zhai-docking-alipay-open
案例:新藍海活動報名結果通知
支付寶開放介面文件解讀
一、新藍海活動報名結果通知文件地址
- https://opendocs.alipay.com/apis/01ebii
二、螞蟻金服訊息文件
- 地址:https://opendocs.alipay.com/open/10381/rkohsn
- 訊息的兩種模式:1. From 螞蟻訊息服務 2.To 螞蟻訊息服務
- From 螞蟻訊息服務:支付寶通知對接平臺的訊息服務,新藍海活動報名結果通知 選用此模式來接收回調通知。
- To螞蟻訊息服務:對接平臺傳送訊息給支付寶平臺。未使用,所以不展開說明。
From 螞蟻訊息服務
- 兩種對接方式:1.http(s)協議 2.websocket長連線
- 官方原話:與 http(s) 相比,該方式接入效能更優,通道安全,減少成本,接入快速等優勢,推薦使用 websocket 長連線 SDK 來接收 From 螞蟻訊息。所以選擇使用此方式。
- 訊息通知間隔頻率:2m、10m、10m、1h、2h、6h、15h
核心程式碼
一、支付寶基礎服務層
@Slf4j
@Service
public class BaseAlipayApiNotifySerImpl implements BaseAlipayApiNotifySer {
@Autowired
AlipayApiProperties alipayApiProp;
@Autowired
BizLogSer bizLogSer;
@SneakyThrows
@Override
public String alipayMessage() {
AlipayMsgClient alipayMsgClient = AlipayMsgClient.getInstance(alipayApiProp.getAppid());
alipayMsgClient.setConnector(AlipayConstant.COMMON_MESSAGE_SERVER_URL);
alipayMsgClient.setSecurityConfig(AlipayConstant.COMMON_SIGN_TYPE, alipayApiProp.getPrivateKey(), alipayApiProp.getPublicKey());
alipayMsgClient.setMessageHandler(new MsgHandler() {
/**
* 客戶端接收到訊息後回撥此方法
* @param msgApi 接收到的訊息的訊息api名
* @param msgId 接收到的訊息的訊息id
* @param bizContent 接收到的訊息的內容,json格式
*/
@Override
public void onMessage(String msgApi, String msgId, String bizContent) {
/** 操作:記錄業務日誌 */
BaseAlipayApiMessage message = new BaseAlipayApiMessage();
message.setMsgApi(msgApi);
message.setMsgId(msgId);
message.setBizContent(bizContent);
bizLogSer.save(new BizLogSave(new BizLogDataTemp(message, null), AlipayConstant.MESSAGE_LOG));
}
});
/** 開啟websoket長連線 */
alipayMsgClient.connect();
return JSONUtil.toStr(alipayMsgClient);
}
}
BaseAlipayApiNotifySerImpl.java 詳情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/service/base/alipay/api/notify/BaseAlipayApiNotifySerImpl.java
二、服務啟動後開啟websoket長連線
@Component
public class StartupRunner implements CommandLineRunner {
@Autowired
BaseAlipayApiNotifySer baseAlipayApiNotifySer;
@Override
public void run(String... args) throws Exception {
log.info(StringUtil.join(RUNNER_NAME, LogConstant.SERVICE, METHOD_QUERY));
/**
* 保證每次服務啟動時,呼叫螞蟻金服connect方法
*/
String result = baseAlipayApiNotifySer.alipayMessage();
log.info(StringUtil.join(RUNNER_NAME, LogConstant.RESULT, METHOD_QUERY, LogConstant.SUCCESS, JSONUtil.toStr(result)));
}
}
- 因為使用的websoket方式,每次專案重啟都需要呼叫SDK中的connect方法,保持長連線。
StartupRunner.java 詳情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/runner/StartupRunner.java
- 以上核心程式碼就是完整的一套對接支付寶回撥通知websoket方式的核心程式碼。
避坑指南
- 上面的一整套程式碼已經躲避了支付寶開放介面的坑,下面講解下這些坑。
一、接收不到通知-springboot專案
- 原因:需要通過支付寶SDK的connect方法開啟長連線,專案如果停止,啟動之後仍然需要呼叫connect方法。
二、接收不到通知-springcloud專案
- 原因:介面鏈路某個地方斷掉了,需要通過呼叫connect方法,重新保持長連線。
- 實際發生場景:gateway閘道器服務停後重啟,業務微服務未停止,此時也接收不到通知,依然需要呼叫connect方法,重新保持長連線。
- 可以提供一個手動觸發connect的口,當鏈路中斷的地方,常見閘道器服務,通過手動觸發(如:restful介面)來進行啟動長連線。
最後
- 本篇主要通過 “案例:新藍海活動報名結果通知”,來完整串聯如何開發對接支付寶回撥通知,通過對具體文件、核心程式碼、避坑指南來進行詳細分析,希望能給你一些參考。在這裡發現自己的薄弱知識websoket和https,故下篇主要講解http和websoket由淺入深,原創不易,希望大家多多支援。