1. 程式人生 > 其它 >支付寶介面對接指南(四、回撥通知對接:websoket方式)【保姆級】

支付寶介面對接指南(四、回撥通知對接:websoket方式)【保姆級】

技術標籤:支付寶開放介面對接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由淺入深,原創不易,希望大家多多支援。