QingCloud 文档 – SaaS应用 - kaiyun官方网站下载手机网页 /development_docs/api/command_list/appcenter2/saas/ Recent content in SaaS应用 on QingCloud 文档 Hugo -- gohugo.io Development_docs: SSO API /development_docs/api/command_list/appcenter2/saas/account_api/ Mon, 01 Jan 0001 00:00:00 +0000 /development_docs/api/command_list/appcenter2/saas/account_api/ <h2 id="oauth-20授权码模式">OAuth 2.0(授权码模式)</h2> <h3 id="获取授权码">获取授权码</h3> <p><strong>请求域</strong> : SSO</p> <p><strong>请求路径</strong>:/sso/oauth2/</p> <p><strong>请求方式</strong>:GET</p> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>client_id</td> <td>string</td> <td>客户端ID</td> <td>Yes</td> </tr> <tr> <td>state</td> <td>string</td> <td>客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值</td> <td>No</td> </tr> <tr> <td>response_type</td> <td>string</td> <td>授权类型,固定值:code</td> <td>Yes</td> </tr> <tr> <td>redirect_uri</td> <td>string</td> <td>重定向URI</td> <td>Yes</td> </tr> </tbody> </table> <h3 id="获取access_token">获取ACCESS_TOKEN</h3> <p><strong>请求域</strong>: SSO</p> <p><strong>请求路径</strong>:/sso/token/</p> <p><strong>请求方式</strong>:POST</p> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>grant_type</td> <td>string</td> <td>授权模式,固定值:authorization_code</td> <td>Yes</td> </tr> <tr> <td>code</td> <td>string</td> <td>授权码</td> <td>Yes</td> </tr> <tr> <td>redirect_uri</td> <td>integer</td> <td>重定向的URI</td> <td>Yes</td> </tr> <tr> <td>client_id</td> <td>string</td> <td>客户端ID</td> <td>Yes</td> </tr> <tr> <td>client_secret</td> <td>string</td> <td>客户端密钥</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>access_token</td> <td>string</td> <td>访问令牌</td> <td>Yes</td> </tr> <tr> <td>expires_in</td> <td>int</td> <td>过期时间,单位(秒)</td> <td>Yes</td> </tr> <tr> <td>token_type</td> <td>string</td> <td>令牌类型(Bearer/JWT)</td> <td>Yes</td> </tr> <tr> <td>refresh_token</td> <td>string</td> <td>更新令牌(token_issuer为iam_jwt,不返回此值)</td> <td>No</td> </tr> </tbody> </table> <h3 id="校验access_token">校验ACCESS_TOKEN</h3> <p><strong>请求域</strong>: SSO</p> <p><strong>请求路径</strong>:/sso/check_token/</p> <p><strong>请求方式</strong>:POST</p> <p><strong>HTTP Header</strong>:</p> <p><strong>Authorization</strong>: Bearer ***</p> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>is_filter_user_verify</td> <td>int</td> <td>是否显示user_verify信息(不传,默认为0,即不显示user verify信息)参数可选值:0/1</td> <td>No</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>access_key</td> <td>String</td> <td>身份临时 access key</td> <td>Yes</td> </tr> <tr> <td>secret_key</td> <td>String</td> <td>身份临时 secret key</td> <td>Yes</td> </tr> <tr> <td>token</td> <td>String</td> <td>身份临时 token</td> <td>Yes</td> </tr> <tr> <td>user</td> <td>data</td> <td></td> <td>Yes</td> </tr> </tbody> </table> <h3 id="更新access_token">更新ACCESS_TOKEN</h3> <p><strong>请求域</strong>: SSO</p> <p><strong>请求路径</strong>:/sso/refresh_token/</p> <p><strong>请求方式</strong>:POST</p> <p><strong>HTTP Header</strong>:</p> <p><strong>Authorization</strong>: Bearer ***</p> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>grant_type</td> <td>string</td> <td>授权模式,固定值:refresh_token</td> <td>Yes</td> </tr> <tr> <td>refresh_token</td> <td>string</td> <td>更新令牌</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>access_token</td> <td>string</td> <td>访问令牌</td> <td>Yes</td> </tr> <tr> <td>expires_in</td> <td>int</td> <td>过期时间,单位(秒)</td> <td>Yes</td> </tr> <tr> <td>token_type</td> <td>string</td> <td>令牌类型(Bearer)</td> <td>Yes</td> </tr> <tr> <td>refresh_token</td> <td>string</td> <td>更新令牌</td> <td>Yes</td> </tr> </tbody> </table> Development_docs: 用户计费API /development_docs/api/command_list/appcenter2/saas/new_billing_api/ Mon, 01 Jan 0001 00:00:00 +0000 /development_docs/api/command_list/appcenter2/saas/new_billing_api/ <h2 id="nbcreateprdorder">NBCreatePrdOrder</h2> <h3 id="说明">说明:</h3> <p>【创建Package订单】-Package订单支持打包购买多种产品的多个实例.</p> <h3 id="具体业务逻辑">具体业务逻辑:</h3> <ol> <li>接入系统的客户传入要订购的产品信息,包括要订购的产品ID,使用的定价的方案,以及对应的产品的订购参数信息。</li> <li>创建Package订单。prd_order</li> <li>创建产品实例。 prod_instance</li> <li>创建产品实例订阅。subscription</li> <li>创建产品实例的计费项的订阅。subs_component</li> <li>对于计费模式不同的计费项,按不同的逻辑处理bill和billingjob <ul> <li>如果是时间包的计费项,按时间包 不走qingjob, 生成该计费项的未支付的bill。</li> <li>如果是时间量的计费项,按时间量是预扣费,则生成第一个小时的预扣金额的未支付状态的bill,然后生成billing_job.</li> <li>如果是资源量的计费项,按资源量是后扣费,不生成账单,生成billing_job.</li> </ul> </li> <li>根据bills生成对应的每次合并支付的子订单(消费订单)。 <ul> <li>新购订单时,该笔Package订单下的按不同的产品类型(product)下的所有的【1.按时间包的计费项生成的bills】以及【2.按时间量的第一个小时生成的第一笔bill】合并成一笔子订单(消费订单)类型为新购,注意该子订单包括了多个产品类型的多个产品实例的多个计费项的总和,子订单的具体费用需要查看bills信息。</li> <li>产品实例被续订(自动续订或者手动续订)时,该产品实例下所有的【1.按时间包的计费项生成的bills】合并成一笔子订单(消费订单),注意该子订单包括了一个产品类型的多个计费项的费用总和,子订单的具体费用需要查看bills信息。</li> <li>按时间量的续订账单并不合并生成子订单,直接查看bils信息获取续订账单明细。</li> <li>按资源量的新购和续订账单也不合并生成子订单,直接查看bils信息获取账单明细。 创建Package订单时产生的账单并未支付,bills状态为未支付状态。</li> </ul> </li> </ol> <h3 id="接口参数">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>app_id</td> <td>string</td> <td>应用ID</td> <td>Yes</td> </tr> <tr> <td>order_user_id</td> <td>string</td> <td>订单用户ID</td> <td>Yes</td> </tr> <tr> <td>order_user_name</td> <td>string</td> <td>订单用户名</td> <td>Yes</td> </tr> <tr> <td>description</td> <td>string</td> <td>描述</td> <td>Yes</td> </tr> <tr> <td>extra_info</td> <td>string</td> <td>额外信息</td> <td>Yes</td> </tr> <tr> <td>order_product_set</td> <td>array</td> <td>订单配置</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>order_product_set</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>prod_id</td> <td>string</td> <td>产品ID</td> </tr> <tr> <td>prod_name</td> <td>string</td> <td>产品名称</td> </tr> <tr> <td>prod_instance_ext_array</td> <td>array</td> <td>产品实例附加信息, 详见 prod_instance_ext</td> </tr> <tr> <td>plan</td> <td>object</td> <td>计划, 详见 plan</td> </tr> </tbody> </table> <p><strong>prod_instance_ext</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>id</td> <td>string</td> <td>ID</td> </tr> <tr> <td>is_auto_renew</td> <td>integer</td> <td>是否自动续约, 0为否, 1为是</td> </tr> </tbody> </table> <p><strong>plan</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>plan_id</td> <td>string</td> <td>计划ID</td> </tr> <tr> <td>attrs_id_value</td> <td>array</td> <td>计划属性, 详见 attrs_id_value</td> </tr> </tbody> </table> <p><strong>attrs_id_value</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>attr_id</td> <td>string</td> <td>属性ID</td> </tr> <tr> <td>attr_value</td> <td>object</td> <td>属性值</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> </tr> <tr> <td>order_status</td> <td>string</td> <td>订单状态</td> </tr> <tr> <td>cost</td> <td>integer</td> <td>订单花费</td> </tr> <tr> <td>amount_payable</td> <td>string</td> <td>可支付数量</td> </tr> </tbody> </table> <h2 id="nbcancelprdorder">NBCancelPrdOrder</h2> <h3 id="说明-1">说明:</h3> <p>如果订单未支付,订单可以取消。</p> <h3 id="具体业务逻辑-1">具体业务逻辑:</h3> <ol> <li>检查PackageOrder是否可以取消</li> <li>更新PackageOrder状态为canceled,其他create时候创建的数据(实例,订阅,计费项订阅,订单,billing-job,消费订单)都更新为canceled状态。</li> </ol> <h3 id="接口参数-1">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> </tr> </tbody> </table> <h2 id="nbchargeprdorder">NBChargePrdOrder</h2> <h3 id="说明-2">说明:</h3> <p>【支付Package订单】-Package订单下单之后,可以通过统一的一个支付接口为该Package订单下打包购买的产品实例产生的各个计费项的未支付账单进行统一的支付.</p> <h3 id="具体业务逻辑-2">具体业务逻辑:</h3> <ol> <li>加上redis分布式锁,防止重复支付。</li> <li>检查主订单状态是否正常可支付,不存在或者已取消则无法支付,报错返回。</li> <li>根据订单ID拿到所有待支付账单。</li> <li>得到账单总额,判断余额是否够支付</li> <li>合并账单调用支付- clientCharging.Charge</li> <li>发送消息【charge_order_success : order.charge.success】 - 支付成功的订单的后续处理 <ul> <li>处理消息【charge_order_success : order.charge.success】- handler.HandleChargeSuccessOrder a. 根据订单ID拿到所有待支付账单 b. 更新实例状态为run c. 更新账单的状态和支付时间,起止时间,帐期, d. 更新消费订单的支付状态和支付时间 e. 更新主订单的支付状态和支付时间 f. 更新产品实例订阅状态为billing g. 发送消息【start_billing_jobs :billingjob.start】 - 发送启动qingjob任务的消息,启动支付成功后订单下全部计费任务</li> <li>处理消息【start_billing_jobs : billingjob.start】 a. 根据Package订单ID查询获取所有的产品实例订阅。 b. 根据产品实例订阅ID查询获取到所有的产品实例订阅的计费项订阅产生的billingJob。 c. 根据计费模式-按时间量和按资源量 更新billingjob的状态和开始时间结束时间,区别在于时间量是预扣费,资源量是后扣费。 d. 对每一个billingJob创建相应的qingjob任务,并更新billingjob状态为running。- clientScheduler.CreateBillSchedulerJob</li> </ul> </li> <li>qingjob创建好定时任务后,根据job的配置会定时回调NB的接口,执行具体的按周期计费的任务。- PerformBillingJob <ul> <li>发送消息【run_billing_job :billingjob.run】 <ul> <li>处理消息【run_billing_job :billingjob.run】 a. 根据billingjobID获取获取Job信息后,检查时间决定是否需要本次任务 b. 获取产品实例计费项的订阅信息 c. 如果订阅为停止状态,或者任务的结束时间等于订阅过期时间,则删掉qingjob调度任务,直接返回 d. 如果订阅为暂停状态,则直接返回 e. 根据计费模式-按时间量和按资源量 处理相应的CreateBillAndPay逻辑,2者区别在于处理用量的逻辑不一样。 f. 处理CreateBillAndPay逻辑 - 注意这里只处理按量的业务,无需处理consumeorder逻辑。 * 根据用量信息获取bill的具体费用值 * 创建Bill账单 * 更新billingJob的起始时间 * 调用Charge扣费 clientCharging.Charge * 更新bills状态和chargeID,chargeTime之类信息。</li> </ul> </li> </ul> </li> </ol> <h3 id="接口参数-2">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> </tr> </tbody> </table> <h2 id="nbrenewprodinstance">NBRenewProdInstance</h2> <p>整个产品实例的按时间包的续订周期是一致的。</p> <p>续订只处理按时间包</p> <p>多个计费项 统一调一次支付</p> <p>按时间包和按时间量混合场景</p> <p>充值后如何处理欠费账单</p> <h3 id="接口参数-3">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>prod_inst_id_ext</td> <td>true</td> <td>产品实例ID</td> <td>Yes</td> </tr> <tr> <td>charge_channel</td> <td>string</td> <td>充值通道</td> <td>Yes</td> </tr> <tr> <td>duration</td> <td>string</td> <td>持续时间</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>prod_inst_id_ext</td> <td>string</td> <td>产品实例ID</td> </tr> <tr> <td>order_id</td> <td>string</td> <td>订单编号</td> </tr> </tbody> </table> <h2 id="nbstopprodinstance">NBStopProdInstance</h2> <h3 id="说明-3">说明:</h3> <ol> <li>客户打包下单PackageOrder购买了多个产品实例之后,可以对单个产品实例进行业务操作,包括暂停,恢复,停止,改配等。</li> <li>当产品端的客户删除相应的产品实例的时候,可以停止单个产品实例的计费。</li> </ol> <h3 id="具体业务逻辑-3">具体业务逻辑:</h3> <ol> <li>获取到产品实例的具体信息</li> <li>根据产品实例ID获取到产品实例的订阅 - todo 可能会有多个订阅,需要取正在billing状态的订阅</li> <li>更新产品实例订阅的状态为stopped</li> <li>获取该产品实例订阅下的计费项对应的所有billingjobs,发送消息【billingjob-stop :billingjob.stop】 <ul> <li>处理消息【billingjob-stop :billingjob.stop】 a. 如果计费任务已经处于暂停状态则不继续处理 b. 停止qingjob调度任务,删除qingjob的job - clientScheduler.DeleteCronJob c. 获取该产品实例订阅的每个计费项,处理计费项的最后一个周期的账单和支付信息,以及用量信息和时间信息处理CreateBillAndPay。 * 对于按时间量 最后不满一小时生成一个为负数的bill进行退费 todo * 对于按资源量的最后一个周期的费用</li> </ul> </li> </ol> <h3 id="接口参数-4">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>prod_inst_id_ext</td> <td>string</td> <td>产品实例ID</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>prod_inst_id_ext</td> <td>string</td> <td>产品实例ID</td> </tr> </tbody> </table> <h2 id="nbchangeprodinstanceconfig">NBChangeProdInstanceConfig</h2> <h3 id="说明-4">说明:</h3> <ol> <li>客户打包下单PackageOrder购买了多个产品实例之后,可以对单个产品实例进行业务操作,包括暂停,恢复,停止,改配等。</li> <li>当产品端的客户删除相应的产品实例的时候,可以修改单个产品实例的产品属性的具体的属性值。</li> <li>传入参数只有指定的产品实例ID和一堆的产品属性值,如果根据这一堆参数能匹配满足条件的计费策略,则可以生成新的价格。</li> </ol> <h3 id="具体业务逻辑-4">具体业务逻辑:</h3> <ol> <li>根据产品实例ID得到产品ID。</li> <li>根据产品ID和新的属性键值对,调用getcost得到计算出来的新的价格。</li> <li>用改配前的参数键值对调用getcost拿到改配前的价格。</li> <li>计算价格差,处理退费或者补差价,生成相应的bills和consumeorder,并且调用支付修改相关状态。</li> <li>定价的getcost接口,如果返回不了价格或者返回多个价格,在改配接口做报错处理。</li> </ol> <p>主要逻辑在于定价的getcost接口,定价服务的getcost接口 传入prod_id 和产品属性键值对,只允许返回一个满足的plan的价格。</p> <h3 id="接口参数-5">接口参数</h3> <p><strong>Request Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> <th><strong>Required</strong></th> </tr> </thead> <tbody> <tr> <td>prod_inst_id_ext</td> <td>string</td> <td>产品实例ID</td> <td>Yes</td> </tr> <tr> <td>plan_id</td> <td>string</td> <td>授权码</td> <td>Yes</td> </tr> <tr> <td>component_infos</td> <td>array</td> <td>重定向的URI</td> <td>Yes</td> </tr> </tbody> </table> <p><strong>component_info</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>component_id</td> <td>string</td> <td>组件ID</td> </tr> <tr> <td>attrs_id_value</td> <td>array</td> <td>数组元素详见attrs_id_value</td> </tr> </tbody> </table> <p><strong>attrs_id_value</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>attr_id</td> <td>string</td> <td>属性ID</td> </tr> <tr> <td>attr_value</td> <td>object</td> <td>属性值</td> </tr> </tbody> </table> <p><strong>Response Parameters</strong></p> <table> <thead> <tr> <th><strong>Parameter name</strong></th> <th><strong>Type</strong></th> <th><strong>Description</strong></th> </tr> </thead> <tbody> <tr> <td>order_id</td> <td>string</td> <td>订单ID</td> </tr> <tr> <td>order_status</td> <td>int</td> <td>订单状态</td> </tr> <tr> <td>cost</td> <td>integer</td> <td>花费金额</td> </tr> <tr> <td>amount_payable</td> <td>integer</td> <td>可支付数量</td> </tr> </tbody> </table>