关于支付宝:WebSocket长连接接入支付宝消息服务实现消息通知

6次阅读

共计 3860 个字符,预计需要花费 10 分钟才能阅读完成。

大家好,我是小悟

在对接支付宝开放平台的一些罕用性能时,经常须要收到支付宝的回调告诉后果,能力解决业务逻辑。此文介绍通过 WebSocket 长连贯接入支付宝音讯服务,实现音讯告诉。

包含五局部内容:问题、劣势、配置、代码接入、总结。

问题
比方接入互联网平台直付通二级商户进件时,须要晓得这个进件审核的后果,是审核通过还是审核回绝,就要用到直付通商户进件审核通过音讯接口和直付通二级商户进件回绝音讯接口。

再比方接入支付宝小程序模板开发时,须要晓得第三利用受权勾销后果、小程序审核后果、服务商代创立小程序后果等等,就要用到第三方利用受权勾销音讯接口、小程序审核通过告诉接口、小程序审核驳回告诉接口、商户确认服务商代创立小程序后果告诉接口等等。

尽管能够通过对应的查问接口被动发动查问后果,但多个业务后果还需开发多个查问接口,体验终归不如由支付宝服务端侧间接告诉开发者来的好。所以千万别干“脱裤子放 pi,多此一举”的事件来,哈哈哈。

为了解决告诉的问题,支付宝开放平台音讯服务提供两种通信协定来接管音讯,一种是基于 HTTPS/HTTP,一种是基于 WebSocket 长连贯。

劣势
抉择 WebSocket 长连贯有诸多劣势:

官网提供封装好的 SDK,开发者无需思考通信、验签、组装报文协定,只有分心依据收到的音讯解决本身的业务逻辑即可。

无需申请 https 证书,缩小繁琐的证书申请工作,音讯也能触达。

开发者无需额定开发一个服务来接管开放平台的音讯。

相比之下,WebSocket 长连贯有更多的劣势,所以个别抉择应用 WebSocket 长连贯来接管支付宝服务端发来的音讯。

配置
创立好利用后,在产品绑定 - 绑定产品,增加对应的产品。

而后在开发设置 - 音讯服务 -FROM 平台订阅所需监听的音讯接口,接入形式抉择 WebSocket。

接入
以上操作是接入的前提条件,务必查看分明再进行代码的开发。

可应用一般公钥形式和公钥证书形式接入,形式不同,SDK 的应用也不同,这个取决于设置接口加签是何种形式,这边抉择的是公钥证书形式。

在代码中引入依赖,这边有个留神点就是,如果抉择的是公钥证书模式的话,SDK 版本须要应用 4.11.54.ALL 及以上版本。

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.54.ALL</version>
</dependency>

这个是重点,开发一个支付宝音讯配置类,支付宝服务端有音讯告诉时会主动触发。

@Component
@Configuration
@EnableConfigurationProperties({AliPayProperties.class})
public class AliPayMsgConfig {private static Logger logger = LoggerFactory.getLogger(AliPayMsgConfig.class);
    private AliPayProperties aliPay;
    public AliPayMsgConfig(AliPayProperties aliPay) {this.aliPay = aliPay;}
    @Bean
    public AlipayMsgClient alipayMsgClient() throws Exception {AlipayMsgClient alipayMsgClient = AlipayMsgClient.getInstance(aliPay.getAppId());
        alipayMsgClient.setConnector("openchannel.alipay.com");
        alipayMsgClient.setSecurityCertConfig(aliPay.getSignType(), FileUtil.readUtf8String(aliPay.getAppCertPrivateKeyPath()), aliPay.getAppCertPublicKeyPath(), aliPay.getAliPayCertPublicKeyPath(), aliPay.getAliPayRootCertPath());
        alipayMsgClient.setCharset(aliPay.getChartSet());
        alipayMsgClient.setMessageHandler(new MsgHandler() {
            /**
             * 客户端接管到音讯后回调此办法
             *  @param  msgApi 接管到的音讯的音讯 api 名
             *  @param  msgId 接管到的音讯的音讯 id
             *  @param  bizContent 接管到的音讯的内容,json 格局
             */
            @Override
            public void onMessage (String msgApi, String msgId, String bizContent) {logger.info("receive message. msgApi:{},msgId:{},bizContent:{}", msgApi, msgId, bizContent);
                if (StringUtils.equals("alipay.open.app.api.field.changed", msgApi)) {logger.info("用户信息申请记录审核告诉,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.open.auth.appauth.cancelled", msgApi)) {logger.info("第三方利用受权勾销音讯,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.open.auth.userauth.cancelled", msgApi)) {logger.info("用户受权勾销音讯,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.open.mini.version.audit.passed", msgApi)) {logger.info("小程序审核通过告诉,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.open.mini.version.audit.rejected", msgApi)) {logger.info("小程序审核驳回告诉,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.trade.refund.depositback.completed", msgApi)) {logger.info("收单退款冲退实现告诉,接管到的音讯内容:{}", bizContent);
                } else if (StringUtils.equals("alipay.open.mini.merchant.confirmed", msgApi)) {logger.info("商户确认服务商代创立小程序后果告诉,接管到的音讯内容:{}", bizContent);
                }
            }
        });
        alipayMsgClient.connect();
        return alipayMsgClient;
    }
}

下面代码的 AliPayProperties 类是配置了利用的一些参数信息,包含利用 id、加签类型、利用私钥证书门路、利用公钥证书门路、支付宝公钥证书门路、支付宝根证书门路、编码格局。

@Data
@ConfigurationProperties(prefix = "alipay")
public class AliPayProperties {
    /**
     * 加签类型
     */
    private String signType;
    /**
     * 利用 id
     */
    private String appId;
    /**
     * 申请应用的编码格局,如 utf-8,gbk,gb2312 等
     */
    private String chartSet;
    /**
     * 利用私钥证书门路
     */
    private String appCertPrivateKeyPath;
    /**
     * 利用公钥证书门路
     */
    private String appCertPublicKeyPath;
    /**
     * 支付宝公钥证书门路
     */
    private String aliPayCertPublicKeyPath;
    /**
     * 支付宝根证书门路
     */
    private String aliPayRootCertPath;
}

总结
当支付宝服务端有给客户端发送音讯时,会回调 MsgHandler 外面 onMessage 的实现,因而能够在 onMessage 中解决接管到的音讯,依据 msgApi 音讯名判断是哪种接口来解决对应的业务逻辑。

但须要留神的是,因各种异样起因,支付宝服务端可能会反复告诉,因而为了业务不反复被解决,须要做幂等性的管制,可依据每条音讯的惟一 msgId 或者本身零碎的业务 id 比方 uuid 来当时查问。

您的一键三连,是我更新的最大能源,谢谢

山水有相逢,来日皆可期,谢谢浏览,咱们再会

我手中的金箍棒,上能通天,下能探海

上一篇:一不小心,登上支付宝开发者社区热文榜单 Top3

正文完
 0