本文为您介绍如何通过云市场 SPI 方式完成许可证的激活流程。
背景
软件在云上通常依赖许可证管理系统实现权限控制。若厂商计划将软件上架至云市场销售,则需完成许可证管理系统与云市场的对接。
对于需要向用户提供软件许可证的服务商,可通过阿里云市场的标准化通信接口(SPI)实现自动化激活流程:服务商提前在云市场配置SPI接口并与自有许可系统对接后,当用户完成商品购买支付时,云市场将自动通过该接口触发许可证生成请求,服务商系统实时创建加密激活码并回传至云市场。该许可证信息会同步推送至用户的计算巢服务实例,既可在控制台界面直接查看用于手动激活,也可通过预置脚本自动注入系统完成静默授权,实现从购买到启用的全流程自动化。
SPI方式与非SPI方式区别
对比维度 | SPI方式(被动模式) | 非SPI方式(主动模式) |
控制权 | 云市场主导:实例状态变更(如创建、续费、过期)由云市场主动触发并通知软件。 | 软件自主控制:软件通过主动调用API查询实例状态(如过期、正常),并自主决策许可证行为。 |
流程触发 | 云市场在检测到实例状态变更后,通过SPI接口回调告知软件,软件被动接收并响应。 | 软件主动调用计算巢CheckoutLicense接口查询实例状态,再根据结果执行业务逻辑。 |
适用场景 | 需快速集成云市场状态变更、减少软件自主开发的工作量。 | 需灵活控制许可证逻辑(如定制化状态判断规则)。 |
综上所述,SPI方式与非SPI方式的本质差异在于实例状态变更的主导权,软件在状态变化后触发业务逻辑。
针对无法自建许可证系统的厂商,计算巢提供了一键部署的第三方开源许可证服务,具体可参考云市场接入keygen自定义license搭建许可证系统,以帮助快速实现许可证业务逻辑集成。
流程示图
操作步骤
前提条件
创建计算巢服务并上架服务,详细操作,请参见服务发布。
创建云市场商品,本节仅具体介绍SPI配置部分。详细操作,请参见将服务发布为云市场商品。
计算巢配置
用户购买商品并付款成功后,云市场会调用实例创建SPI(请参见SPI实例创建),并将许可证ID、许可证有效期、使用说明地址展示在控制台中。下图为SPI返回的参数。
云市场会将以上参数发送给计算巢,为接收云市场传递的许可证业务相关参数,计算巢需要配置模板参数。
进入计算巢-我的服务中,进入目标计算巢服务的模板内容区域,新增
Parameters
、Outputs
、Metadata
中的配置。示例代码如下:Parameters: licenseId: Type: String Default: '' licenseValidPeriod: Type: String Default: '' licenseForUserGuide: Type: String Default: '' Outputs: licencesId: Value: Ref: licenseId licenseForUserGuide: Value: Ref: licenseForUserGuide licenseValidPeriod: Value: Ref: licenseValidPeriod Metadata: ALIYUN::ROS::Interface: Hidden: - licenseId - licenseForUserGuide - licenseValidPeriod
云市场配置
配置SPI回调地址,用于接收云市场状态变更回调事件,回调后的业务逻辑处理需服务商自行实现。
云市场SPI配置
在云市场商品配置第一部分 商品接入信息,下方存在配置生产通知模块,在是否配置生产通知若选择是(默认为否),可开启生产通知地址配置,即SPI接口地址配置,输入生产通知地址即可。详细操作,请参见云市场生产SPI和立即进行接口调试。
云市场SPI快速体验
计算巢提供了一键部署的Keygen社区版开源许可证服务,帮助服务商快速搭建许可证系统。该服务不仅支持许可证核心功能(如创建、校验许可证等,可参考云市场接入keygen自定义license),还集成了SPI接口测试环境,可直接用于SPI能力的快速验证与体验。
部署Keygen社区版开源许可证服务,等待部署完成并获取host地址。
进入SPI接入调试页面,输入请求地址
{host}:8080
。
单击生产请求地址后,单击发送请求。
说明本服务模拟SPI实例创建中的返回值。
对接开发/生产环境
在云市场SPI快速体验一节中,测试服务中模拟了SPI实例创建的返回值内容。示例代码如下:
from flask import Flask, request, jsonify import os app = Flask(__name__) ALLOWED_ACTION = 'createInstance' # 返回的预定义 JSON 格式 RESPONSE_JSON = { "instanceId": "1", "hostInfo": { "name": "linux server", "ip": "127.0.0.1", "username": "user", "password": "user_password" }, "appInfo": { "frontEndUrl": "http://example.com/", "adminUrl": "http://example.com/admin", "username": "admin", "password": "admin_password" }, "info": { "key1": "my custom info" } } @app.route('/', methods=['GET']) def handle_request(): action = request.args.get('action') if action == ALLOWED_ACTION: return jsonify(RESPONSE_JSON) else: return jsonify({ "error": f"Invalid action. Expected: '{ALLOWED_ACTION}'" }), 400 if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
在实际开发或生产环境中,服务商需将云市场实例状态变更时的SPI回调内容集成到自身软件系统中,以实现完整的许可证激活与生命周期管理流程。具体步骤如下:
关联许可证生命周期与SPI回调。
云市场实例的生命周期包含创建、续费、升级、过期、释放等状态(可参见云市场生产SPI)。
选择性集成:服务商根据自身许可证管理需求,选择与业务逻辑相关的状态变更,如实例创建触发许可证激活。
定义回调逻辑:在SPI接口回调中,调用/返回结果均需符合云市场的规范,并确保许可证状态与云市场状态变更一致。
关键场景的SPI回调处理。
实例创建:需触发许可证激活、创建 ,如返回许可证激活码。
实例续费/升级:需触发如有效期延长或功能权限变更。
实例过期/释放:需触发如许可证终止、自动冻结或回收对应许可证资源。