华为云用户手册

  • 使用方法 华为云API符合RESTful API设计理论。 REST从资源的角度观察整个网络,分布在各处的资源由URI(Uniform Resource Identifier)确定,客户端的应用通过URL(Unified Resource Locator)获取资源。 URL的一般格式为:https://Endpoint/uri。 URL中的参数说明如下表所示。 表1 URL中的参数说明 参数 描述 Endpoint Web服务入口点的URL,云商店的Endpoint为“mkt.myhuaweicloud.com”。 uri 资源路径,也即API访问路径。从具体接口的URI模块获取,例如“v1.0/{partner_id}/billing/bill-mgr/push-usage-data”。 其中,uri中的用户标识参数说明如下: 使用“partner_id”标识,表示该接口只能使用合作伙伴(商家)自身的AK/SK或者Token调用。 华为云接口采用HTTP传输协议,有如下约束条件: 请求/响应报文使用JSON报文UTF-8字符集编码。 媒体类型表示为Application/json。 可选参数在消息体中可以不编码。 接口请求参数和响应参数中时间格式统一为UTC时间(包括时区),格式为yyyyMMdd'T'HHmmss'Z'。 其中,HH范围是0~23,mm和ss范围是0~59。 父主题: 接口使用方法
  • 响应参数 表2 状态码 状态码 描述 200 请求成功。 401 认证失败。 表3 响应Body参数 参数 参数类型 描述 id String 用户ID userName String 用户名 name String 姓名 email String 邮箱地址 mobile String 手机号 error String 错误类型。 error_description String 错误描述。 role String 角色 organizationName String 组织名称 userId String 用户id organizationCode String 组织编码 projectName String 租户名称 tenant String 租户id 响应示例 状态码:200 请求成功。 { "id" : "20201029190841785-CB37-8BD36B...", "name" : "test", "userName" : "test", "mobile" : "12345678901", "email" : "123@example.com" } 状态码:401 认证失败。 { "error" : "unauthorized", "error_description" : "Full authentication is required to access this resource" }
  • 请求参数 表1 请求Header 参数 是否必选 参数类型 描述 Accept 是 String 接收响应类型,值:application/json。 Authorization 是 String 认证凭据,值:Bearer {access_token}。 请求示例 GET {domain_name}/api/v1/oauth2/userinfo Authorization: Bearer ****** Accept: application/json
  • 请求参数 表1 FormUrlEncoded参数 参数 是否必选 参数类型 描述 client_id 是 String 应用标识,注册应用后,分配的ClientId。 client_secret 是 String 应用密钥,注册应用后,分配的ClientSecret。 grant_type 是 String 授权类型,固定值:refresh_token。 refresh_token 是 String 刷新令牌,获取Access Token接口中返回。 请求示例 POST {domain_name}/api/v1/oauth2/token Content-Type: application/x-www-form-urlencoded client_id=NzZeWuiJa91dPSRdZQChMazIh13AW...& client_secret=******...& refresh_token=******...& grant_type=refresh_token
  • 响应参数 表2 状态码 状态码 描述 200 请求成功。 400 请求错误。 状态码:200 表3 响应Body参数 参数 参数类型 描述 access_token String 授权服务器返回给第三方应用的访问令牌。 token_type String 访问令牌类型。固定值:Bearer。 expires_in Long 访问令牌的有效期,以秒为单位。 scope String 授权范围。 refresh_token String 刷新令牌。 状态码:400 表4 响应Body参数 参数 参数类型 描述 error String 错误类型。 error_description String 错误描述。 响应示例 状态码:200 请求成功。 { "access_token" : "******", "token_type" : "Bearer", "expires_in" : 7200, "scope" : "get_user_info", "refresh_token" : "******" } 状态码:400 请求错误。 { "error" : "invalid_grant", "error_description" : "Invalid refresh token" }
  • 响应参数 表2 响应Body参数 参数 参数类型 描述 access_token String 授权服务器返回给第三方应用的访问令牌。 token_type String 访问令牌类型。固定值:Bearer。 expires_in Long 访问令牌的有效期,以秒为单位。 scope refresh_token String String 授权范围。 refresh_token String 刷新令牌,默认生成,有效期30天。 error String 错误类型。 error_description String 错误描述。 refresh_token有效期设置应比access_token长。 响应示例 表3 状态码 状态码 描述 200 请求成功。 400 请求错误。 状态码:200 请求成功。 示例1 { "access_token" : "******", "token_type" : "Bearer", "expires_in" : 7200, "scope" : "get_user_info" } 示例2 { "access_token" : "******", "token_type" : "Bearer", "expires_in" : 7200, "scope" : "get_user_info", "refresh_token" : "******" } 状态码:400 请求错误。 { "error" : "invalid_grant", "error_description" : "Invalid authorization code" }
  • 请求参数 表1 FormUrlEncoded参数 参数 是否必选 参数类型 描述 client_id 是 String 应用标识,注册应用后,分配的ClientId。 client_secret 是 String 应用密钥,注册应用后,分配的ClientSecret。(解密后的明文) code 是 String 授权码,认证登录后回调获取的授权码。(code值仅可使用一次) grant_type 是 String 授权类型,固定值:authorization_code。 redirect_uri 否 String 回调地址,注册应用时填写的回调地址。 请求示例 POST {domain_name}/api/v1/oauth2/token Content-Type: application/x-www-form-urlencoded code=z2D...& client_id=NzZeWuiJa91dPSRdZQChMazIh13AW...& client_secret=******...& redirect_uri=https://example.com& grant_type=authorization_code
  • 登录场景:accesstoken续期 用户登录获得的access_token有效期默认为2小时,refresh_token刷新令牌有效期默认为30天,在用户持续访问应用的情况下,服务端应提供access_token的续期功能。 续期功能内部调用时序图: 接口URL请参考联营能力开放接口的刷新Access Token,示例URL如下: {domain_name}/api/v1/oauth2/token Content-Type:application/x-www-form-urlencoded&client_id=NzZeWuiJa91dPSRdZQChMazIh13AW...&client_secret=******...&refresh_token=******...&grant_type=refresh_token 父主题: 联营账号基于WEB登录
  • 请求方法:POST 接口URL:生产地址+固定子路径,其中固定子路径为/produceAPI/v2/allOrgSync; 接口示例:生产地址为https://example.isv.com,则接口URL为https://example.isv.com/produceAPI/v2/allOrgSync BODY请求参数 参数 必选 参数类型 描述 instanceId M String(64) 说明: 卖家申请应用凭证的时候传空,买家必传。 tenantId M String(64) 租户ID orgInfoList M OrgInfo[] 组织内部门层级信息,包含部门代码、部门名称、上级部门 请参考Orglnfo类型定义 testFlag M Integer(2) 0-生产正式数据1-调测数据 timeStamp M String 默认时区东8区,时间格式:20220420114117642 Orglnfo类型定义 参数 必选 参数类型 描述 orgCode M String(64) 部门代码 orgName M String(128) 部门名称 parentCode O String(64) 上级部门,顶级部门的上级部门为空 响应参数 参数 必选 参数类型 描述 resultCode M String(6) 响应码, 具体请参见调用结果码说明。 resultMsg O String(255) 响应信息 示例: 请求示例: POST https://example.isv.com/produceAPI/v2/allOrgSync Content-Type: application/json x-sign: 11C4CD6279191DE931DEF5C51531DFFA9D37969F4E356B8A3A6D8DE4FB357A48 x-timestamp: 1680508066618 x-nonce:50D83FDECAED6CCD8EF597F2A577950527928BA287D04E6036E92B2806FD17DA {"instanceId": "hua******t123456","tenantId": "68cbc8******b880d92f36422fa0e","orgInfoList": "[{orgCode:\"00000001\", orgName:\"产品部\", parentCode:\"265789314\" },{orgCode:\"00000002\", orgName:\"测试部\", parentCode:\"265789314\" }]","flag": 1,"testFlag": 0,"timeStamp": "20220413093539534"} 响应示例: HTTP/1.1 200 OK Content-Type: application/json { " resultCode": "000000", " resultMsg": "Success" }
  • 请求方法:POST 接口URL:生产地址+固定子路径,其中固定子路径为/produceAPI/v2/singleOrgSync; 接口示例:生产地址为https://example.isv.com,则接口URL为https://example.isv.com/produceAPI/v2/singleOrgSync BODY请求参数 参数 必选 参数类型 描述 instanceId M String(64) 说明: 卖家申请应用凭证的时候传空,买家必传。 tenantId M String(64) 租户ID,与租户的同步信息保持一致 orgCode M String(64) 部门代码租户自定义,租户内唯一 orgName M Vachar(128) 部门名称所在层级唯一,允许租户更新名称 parentCode O String(64) 上级部门的orgCode,如果是顶层部门,这个值为空,其他场景不能为空,允许租户更新当前部门归属的上层部门 flag M Integer(2) 0-删除 1-新增,2-修改 testFlag M Integer(2) 0-生产正式数据 1-调测数据 timeStamp M String 默认时区东8区,时间格式:20220420114117642 响应参数 参数 必选 参数类型 描述 resultCode M String(6) 响应码, 具体请参见调用结果码说明。 resultMsg O String(255) 响应信息 示例: 请求示例: POST https://example.isv.com/produceAPI/v2/singleOrgSync Content-Type: application/json x-sign: 11C4CD6279191DE931DEF5C51531DFFA9D37969F4E356B8A3A6D8DE4FB357A48 x-timestamp: 1680508066618 x-nonce:50D83FDECAED6CCD8EF597F2A577950527928BA287D04E6036E92B2806FD17DA {"instanceId": "hua********23456","instanceId": "hua********23456","tenantId": "68cbc********0d92f36422fa0e","orgCode": "10000","orgName": "开发部","parentCode": "","flag": 1,"testFlag": 0,"timeStamp": "20220413093539534"} 响应示例: HTTP/1.1 200 OK Content-Type: application/json { " resultCode": "000000", " resultMsg": "Success" }
  • 接口说明 管理员被授权管理某企业后,在华为云买家中心控制台登录,对管理的企业执行新建、编辑、删除部门操作时,云商店调用该接口,请求商家同步该企业的组织增量变更;商家接口需要执行增量组织信息同步,保存信息,并返回通知云商店。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的orgCode,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 部门增量同步 流程如下图所示:
  • 接口说明 管理员被授权管理某企业后,登录到华为云买家中心控制台,对企业内用户授权该企业已绑定的应用,云商店异步调用该接口请求商家同步该企业应用的用户授权信息,商家接口需要执行授权信息同步,保存用户授权信息,并返回通知云商店。 针对用户授权同步场景接口调用失败的情况,由企业管理员选择是否要继续进行同步。并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的应用,相同的userName,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 租户同步流程如下图所示:
  • 接口说明 用户购买联营SaaS类应用后,登录到华为云买家中心控制台,将应用与企业绑定时,云商店调用该接口请求商家同步该企业应用的认证信息,商家接口需要执行应用同步,保存应用信息,并返回通知云商店。 针对应用同步场景接口调用失败的情况,由买家选择是否重试,并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的应用,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在 应用同步流程如下图所示:
  • 接口说明 买家购买联营SaaS商品后,登录到华为云买家中心控制台,将应用与企业绑定时,云商店调用该接口请求商家同步该企业的租户信息,商家接口需要执行租户同步,保存租户信息,并返回通知云商店。 针对企业同步场景接口调用失败的情况,由买家选择是否重试,并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 租户同步流程如下图所示:
  • 请求方法:POST 接口URL:生产地址+固定子路径,其中固定子路径为/produceAPI/v2/tenantSync; 接口示例:生产地址为https://example.isv.com,则接口URL为https://example.isv.com/produceAPI/v2/tenantSync,固定子路径商家无需手动拼接。 Body参数 参数 必选 参数类型 描述 instanceId M String(64) 说明: 实例ID,卖家申请应用凭证的时候传空,买家正式订单必传。 orderId M String(64) 说明: 买家的订单号,卖家申请应用凭证的时候传空,买家正式订单必传。 tenantId M String(64) 租户ID tenantCode M String(64) 租户标识,用来识别最终用户的登录指向买家对应的 域名 name M String(255) 租户名称,买家企业的名称 domainName M String(255) 域名,是认证中心返回的统一域名地址 flag M Integer(2) 0-删除 1-新增 2-修改(仅限租户名称、域名) testFlag M Integer(2) 0-生产正式数据 1-调测数据 timeStamp M String 默认时区东8区,时间格式:20220420114117642 响应参数 参数 必选 参数类型 描述 resultCode M String(6) 响应码, 具体请参见调用结果码说明。 resultMsg O String(255) 响应信息 示例: 请求示例: POST https://example.isv.com/produceAPI/v2/tenantSync Content-Type: application/json x-sign:11C4CD6279191DE931DEF5C51531DFFA9D37969F4E356B8A3A6D8DE4FB357A48 x-timestamp:1680508066618 x-nonce:50D83FDECAED6CCD8EF597F2A577950527928BA287D04E6036E92B2806FD17DA {"instanceId": "huaiweitest123456","orderId": " CS 1906666666ABCDE","tenantId": "68cbc86****************880d92f36422fa0e","tenantCode": "huawei","name": "huaiweitest","domainName": "https://example.tenantaccount.com","flag": 1,"testFlag": 0,"timeStamp": "20220413093539534"} 响应示例: HTTP/1.1 200 OK Content-Type: application/json { " resultCode": "000000", " resultMsg": "Success" }
  • 响应消息 响应参数说明请参见下表: 参数 是否必选 类型 取值范围 说明 resultCode M String 6 调用结果码。 具体请参见调用结果码说明。 resultMsg O String 255 调用结果描述。 请及时关注商家信息中客服邮箱以及云商店账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常。 云商店会对接口异常的情况做监控,如SaaS商品频繁出现因接口异常的情况,云商店将对该商品做下架处理。 响应消息示例: { "resultCode":"000000", "resultMsg":"success" }
  • 接口说明 按周期售卖的商品,用户试用转正、续费、退续费后,云商店调用该接口,更新实例的到期日期。 用户进行商品转正、续费下单或退订续费周期后,云商店将调用该接口请求商家执行业务变更,商家接口需要执行将到期日进行更新,并返回通知云商店。 商家需要保障更新实例接口通畅,如调用失败,将可能导致用户的业务被释放的风险。 请及时关注商家信息中客服邮箱以及云商店账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常。 云商店会对接口异常的情况做监控,如SaaS商品频繁出现因接口异常的情况,云商店将对该商品做下架处理。 商品更新实例流程如下图所示:
  • 响应消息 响应参数说明请参见下表: 参数 是否必选 类型 取值范围 说明 resultCode M String 6 调用结果码。 具体请参见调用结果码说明。 resultMsg O String 255 调用结果描述。 info O InstanceInfo[] N/A 实例详情 InstanceInfo数据结构定义如下: 参数 是否必选 类型及范围 取值范围 参数说明 instanceId M String 64 实例id appInfo O AppInfo N/A 应用实例信息。 客户购买商品后,商家需要返回登录服务地址(网站地址)或免登地址供客户后续操作。 说明: SaaS商品必须向客户提供应用使用信息,包括使用地址、账号、密码等。 如可实现通过短信、邮件等其他方式发送使用信息,则接口中允许不响应;否则,必须在接口中返回应用实例信息。 如使用信息不仅包含使用地址及账号密码,可通过如下memo参数灵活返回其他使用信息或使用说明等。 appInfo数据结构定义请参见下表。 usageInfo O UsageInfo[ N/A 应用实例关联的用量信息,按需和按需套餐包实例需要返回,对应按需套餐包,需要分别返回套餐包关联的所有费用项的用量信息。 appInfo数据结构定义如下: 参数 是否必选 类型及范围 取值范围 参数说明 frontEndUrl M String 512 前台地址。 客户购买商品后,可以访问的网站地址。 adminUrl O String 512 管理地址。 客户购买商品后,可以访问的管理后台地址。 userName O String 128 管理员帐号。 password O String 128 管理员初始密码。 memo O String 1024 备注。 说明: 如果备注包含中文内容,请将中文转换成unicode编码,例如:“中文”可以转换成“\u4e2d\u6587”。 UsageInfo数据结构定义如下: 参数 是否必选 类型及范围 最大字符长度 参数说明 relatedInstanceId O String 64 关联的按需实例ID,当查询按需套餐包实例的用量数据时,还需要返回此用量对应的按需实例id,譬如,当前套餐包包含短信100条和彩信50条,则在查询此套餐包的用量扣减时需要返回两个UsageInfo信息,分别对应短信和彩信的用量信息,relatedInstanceId分别对应短信和彩信按需实例ID usageValue M Double(12,4) 20 使用量具体值,最多支持4位有效小数,对于按需实例,应该是一个总体的累积值,对于按需套餐包实例,应该是套餐包的已用用量信息 statisticalTime M String 20 使用量统计时间,取UTC时间。 格式:yyyyMMddHHmmssSSS dashboardUrl O String 512 用量详细查看看板地址。 客户购买按需或按需套餐包商品后,可以在这个平台查看具体的用量信息。 响应消息示例: // 包周期、一次性场景 { "resultCode" : "000000", "resultMsg" : "success.", "encryptType" : "1", "info" : [{ "instanceId" : "实例ID", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "*****", "password" : "*****", "memo" : "have a test, 测试!" } } ] } // 按需计量场景 { "resultCode" : "000000", "resultMsg" : "success.", "encryptType" : "1", "info" : [{ "instanceId" : "按需实例ID", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "*****", "password" : "*****", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "按需实例ID", "usageValue" : "按需用量总和,假设这里填3", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] } ] } // 一个实例多个用完即停按需套餐包场景 { "resultCode" : "000000", "resultMsg" : "success.", "encryptType" : "1", "info" : [{ "instanceId" : "底层按需实例ID", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "*****", "password" : "*****", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需实例ID", "usageValue" : "底层按需用量,是下面多个包用量的总和,假设这里填3", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "包1实例ID", "appInfo" : { "frontEndUrl" : "https://www.baidu.com", "adminUrl" : "https://www.baidu.com/admin", "userName" : "huawei", "password" : "huawei123456", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需实例ID", "usageValue" : "底层按需用量,假设这里填3", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "包2实例ID", "appInfo" : { "frontEndUrl" : "https://www.baidu.com", "adminUrl" : "https://www.baidu.com/admin", "userName" : "huawei", "password" : "huawei123456", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需实例ID", "usageValue" : "底层按需用量,假设这里填0", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] } ] } // 多个实例多个用完即停按需套餐包场景 { "resultCode" : "000000", "resultMsg" : "success.", "encryptType" : "1", "info" : [{ "instanceId" : "底层按需1实例ID", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "*****", "password" : "*****", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需1实例ID", "usageValue" : "底层按需1用量", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "底层按需2实例ID", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.***.com/admin", "userName" : "*****", "password" : "*****", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需2实例ID", "usageValue" : "底层按需2用量", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "包实例ID", "appInfo" : { "frontEndUrl" : "https://www.baidu.com", "adminUrl" : "https://www.baidu.com/admin", "userName" : "huawei", "password" : "huawei123456", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "底层按需1实例ID", "usageValue" : "底层按需1用量", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" }, { "relatedInstanceId" : "底层按需2实例ID", "usageValue" : "底层按需2用量", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] } ] }
  • 联营SaaS类商品接入流程介绍 联营SaaS类商品接入云商店概览: 如上图所示,联营SaaS接入分成为2个阶段: Kit对接:商家根据业务所需进行接口调试(参考1.4基础接口描述和1.5联营kit接口描述); 账号测试:商家在云商店的“卖家中心”进行1.8 接口调试,1.6 应用凭证申请,并获取应用测试账号,完成1.7.4 用户登录接口调测。 对于商家来说,完成接口对接与测试后,可以申请发布联营SaaS产品;本文档涉及Kit对接和验证用户账号登录,关于买家如何完成应用的购买与配置,请参考《联营账号快捷开通流程》。 联营SaaS类商品接入云商店的详细流程如下图所示: 流程说明如下: 申请入驻云商店,成为商家。 云商店运营人员审核公司的资质信息。 准备生产接口服务器,根据本接入指南开发生产接口。 在卖家中心调试生产接口,参考1.8 接口调试。 在卖家中心完成安全 漏洞扫描 。 在卖家中心创建应用凭证,参考1.6 应用凭证申请和修改。 在卖家中心申请测试账号。 WEB场景的界面登录验证。 验证登录成功。 加入联营计划,成为联营商家。 在卖家中心申请发布商品。 云商店运营人员审批通过后,产品发布为联营商品。 在卖家中心自助管理生产接口通知消息。 父主题: 接入流程
  • 调用结果码说明 模块 结果码 结果码说明 公共 000000 成功 000001 鉴权失败 000002 请求参数不合法 000003 实例ID不存在(商品续费、过期、资源释放接口可能返回) 000004 请求处理中 000005 其它服务内部错误 创建实例 000100 无可用实例资源分配 000101 Mobile number not specified or already exists//手机号为空或重复 000102 Email address is not specified or already exists//邮箱号为空或重复 000103 Product already purchased//该商品不可重复购买 000104 Internal service error//该商品内部服务异常 000105 Account has already subscribed to benefits//该账号已购买权益,无法再开通 000106 Product resources sold out.//该商品资源已售罄 000107 SaaS email domain already exists.//该SaaS邮箱域名重复 父主题: SaaS类商品接入指南 V2.0(新商品上架)
  • 接口安全令牌 在云商店发布SaaS类商品时,商家需要开发生产接口与云商店平台对接,根据接口规则实现相关的接口定义。用户在云商店购买SaaS商品后,云商店会回调商家实现的生产接口来开通SaaS应用实例,从而为用户提供服务SaaS服务。每一次接口调用都必须进行安全校验,本文为您介绍接口的安全令牌方案。 获取accessKey值(访问秘钥) HTTP Body签名 父主题: SaaS类商品接入指南 V2.0(新商品上架)
  • 接口调用场景(下单) 创建实例:客户购买商品并付款成功。 云商店将调用创建实例接口通知商家根据订单号创建实例。 商家系统收到该请求信息,需调用云商店查询订单接口,获取本次订购的相关信息,执行新购对应动作。 云商店调用查询实例接口获取实例的相关信息。 查询实例信息:查询实例(instanceId)对应的实例信息 云商店在获取到创建实例接口返回的实例id(instanceId)后会不断轮询查询实例信息接口,直到商家成功返回实例信息。 用户在云商店"已购买服务--查询资源信息"时,云商店会同步调用商家的查询实例信息接口,对用户展示。 更新实例:客户试用转正、续费、退续费。 云商店将调用更新实例接口,通知商家系统对相应资源变更过期时间,商家本地系统需执行相应动作,并将执行结果返回给云商店。 更新实例状态:用户资源实例因到期、违规等情况下会对用户的实例进行冻结,同时在用户续费后,或资源解除违规后会对用户的实例进行解锁。 云商店将调用更新实例状态接口,通知商家系统对相应资源执行冻结、解冻操作,并将执行结果返回给云商店。 用户订单到期后,根据客户等级,有最长15天的资源冻结期,冻结期内资源不可使用,但可以对此订单续费以解冻继续使用,故商家需对SaaS商品设置15天的冻结期,并在冻结期内保留用户数据。 释放实例:用户释放购买产品的实例时(到期不续费、退订等场景)。 云商店将调用释放实例接口,通知商家系统对相应资源执行释放操作,并将执行结果返回云商店。 实例升级:用户对已购买的资源进行升级,升级订单付款成功。 云商店将调用实例升级接口,通知商家系统对相应资源执行升级操作。 商家系统到该请求信息,需调用云商店查询订单接口,获取本次升级订购的相关信息,执行升级动作,并将执行结果返回给云商店。 实例升级流程请参考《通用商品变更和计费规则》。 企业同步 用户购买联营SaaS商品后,登录到华为云买家中心控制台,将应用与企业绑定时,云商店调用该接口请求商家同步该企业的租户信息,商家接口需要执行租户同步,保存租户信息,并返回通知云商店。 针对企业同步场景接口调用失败的情况,由买家选择是否重试,并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 应用同步 用户购买联营SaaS类应用后,登录华为云买家中心控制台,将应用与企业绑定时,云商店调用该接口请求商家同步该企业应用的认证信息,商家接口需要执行应用同步,保存应用信息,并返回通知云商店。 针对应用同步接口调用失败的情况,由买家选择是否重试,并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的应用,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在 。 用户授权同步 管理员被授权管理某企业后,登录到华为云买家中心控制台,对企业内用户授权该企业已绑定的应用,云商店异步调用该接口请求商家同步该企业应用的用户授权信息,商家接口需要执行授权信息同步,保存用户授权信息,并返回通知云商店。 针对用户授权同步场景接口调用失败的情况,由企业管理员选择是否要继续进行同步。并用短信或邮件的形式通知商家接口调用失败。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的应用,相同的userName,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 部门增量同步 管理员被授权管理某企业后,登录到华为云买家中心控制台,对管理的企业执行新建、编辑、删除部门操作时,云商店调用该接口,请求商家同步该企业的组织增量变更;商家接口需要执行增量组织信息同步,保存信息,并返回通知云商店。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的orgCode,要支持多次请求新增,或者删除,多次新增不应产生新的数据,且需要返回成功,如果是删除,多次删除也需要返回成功,不能因已删除返回失败,删除时不需要校验(创建实例)接口产生的实例是否存在。 部门全量同步 用户购买联营SaaS应用后,登录到华为云买家中心控制台,将应用与企业绑定时,云商店调用该接口请求商家同步该企业全量的组织信息,商家接口需要执行全量组织信息同步,保存组织信息,并返回通知云商店。 商家的服务器在处理接口请求时,需要做好幂等性处理。 对于同一个实例,相同的租户,相同的orgCode,要支持多次请求,多次请求不应产生新的数据,且需要返回成功。
  • 响应消息 响应参数说明请参见下表: 参数 是否必选 类型 最大字符长度 说明 error_code M String 6 调用结果码。 具体请参见调用结果码说明。 error_msg O String 255 调用结果描述。 错误码: http状态码 error_code error_msg 描述 200 MKT.0000 Success. 请求成功 500 MKT.0999 System internal error. 其它服务内部错误 500 MKT.0100 Failure of input parameter 输入参数校验失败 参数范围超限,非法值或格式错误 400 MKT.0101 Invalid parameter 参数无效 输入非接口定义的参数,多参数或少必选参数 比如:传递非法数值、没有实例id等 400 MKT.0102 Invalid body sign 请求body体签名校验失败 400 MKT.0199 Request parameter error 请求参数错误 其它参数错误 比如:必填参数未传递等 401 MKT.0150 Illegal operation 通常是进行了不被授权的操作,例如instance_id对应的产品不是AK/SK对应的ISV发布的 401 MKT.0151 No authority 无API访问权限 token非ISV角色 401 MKT.0154 Illegal token 鉴权失败 token无效 500 MKT.9001 Instance ID not found. 实例ID不存在(商品续费、过期、资源释放接口可能返回) 500 MKT.9002 Invalid usage enties. 计量实体无效 500 MKT.9003 Usage records extends size limit. 计量记录数超出限制(1000条) 500 MKT.9004 Record beginTime extends Limit. 计量记录的起始时间超出有效期(当前时间21天以内) 当您调用API时,如果遇到“APIGW”开头的错误码,请参见API网关错误码进行处理。 响应消息示例: { "error_code":"MKT.0000", "error_msg":"success" }
  • 响应消息 响应参数说明请参见下表: 表2 响应参数表 参数 是否必选 类型 最大字符长度 说明 resultCode M String 6 调用结果码。 具体请参见调用结果码说明。 resultMsg O String 255 调用结果描述。 encryptType O String 3 敏感信息加密算法 1:AES256_CBC_PKCS5Padding(默认值) 2:AES128_CBC_PKCS5Padding 说明: 敏感信息加密算法是AES256_CBC_PKCS5Padding时返回值为1; 敏感信息加密算法是AES128_CBC_PKCS5Padding时返回值为2; info O InstanceInfo[] / 实例详情 InstanceInfo数据结构定义如下: 参数 是否必选 类型及范围 最大字符长度 参数说明 instanceId M String 64 实例id appInfo O AppInfo N/A 应用实例信息。 客户购买商品后,商家需要返回登录服务地址(网站地址)或免登地址供客户后续操作。 说明: SaaS商品必须向客户提供应用使用信息,包括使用地址、账号、密码等。 如可实现通过短信、邮件等其他方式发送使用信息,则接口中允许不响应;否则,必须在接口中返回应用实例信息。 如使用信息不仅包含使用地址及账号密码,可通过如下memo参数灵活返回其他使用信息或使用说明等。 appInfo数据结构定义请参见下表。 usageInfo O UsageInfo[] N/A 应用实例关联的用量信息,按需和按需套餐包实例需要返回,对应按需套餐包,需要分别返回套餐包关联的所有费用项的用量信息 AppInfo数据结构定义如下: 参数 是否必选 类型及范围 最大字符长度 参数说明 frontEndUrl M String 512 前台地址。 客户购买商品后,可以访问的网站地址。 adminUrl O String 512 管理地址。 客户购买商品后,可以访问的管理后台地址。 userName O String 128 加密后的管理员账号。 客户购买商品后,访问商家管理后台的账号(一般为邮箱和手机号)。该值由16位iv加密向量和base编码后的用户名密文组成。 iv+base64(AES_CBC(accessKey,userName)) 需要使用Key值对账号做加密处理,加密算法以encryptType参数为准。代码示例请参见ISV Server对资源开通后的用户名和密码加密。 password O String 128 加密后的管理员初始密码。 客户购买商品后,访问商家管理后台的密码(一般由商家生成)。该值由16位iv加密向量和base编码后的密码密文组成。 iv+base64(AES_CBC(accessKey,pwd)) 需要使用Key值对密码做加密处理,加密算法以encryptType参数为准。代码示例请参见 ISV Server对资源开通后的用户名和密码加密。 memo O String 1024 备注。 说明: 如果备注包含中文内容,请将中文转换成unicode编码,例如:“中文”可以转换成“\u4e2d\u6587”。 UsageInfo数据结构定义如下: 参数 是否必选 类型及范围 最大字符长度 参数说明 relatedInstanceId O String 64 关联的按需实例ID,当查询按需套餐包实例的用量数据时,还需要返回此用量对应的按需实例id,譬如,当前套餐包包含短信100条和彩信50条,则在查询此套餐包的用量扣减时需要返回两个UsageInfo信息,分别对应短信和彩信的用量信息,relatedInstanceId分别对应短信和彩信按需实例ID usageValue M Double(12,4) 20 使用量具体值,最多支持4位有效小数,对于按需实例,应该是一个总体的累积值,对于按需套餐包实例,应该是套餐包的已用用量信息 statisticalTime M String 20 使用量统计时间,取UTC时间。 格式:yyyyMMddHHmmssSSS dashboardUrl O String 512 用量详细查看看板地址。 客户购买按需或按需套餐包商品后,可以在这个平台查看具体的用量信息。 响应消息示例: { "resultCode" : "000000", "resultMsg" : "success.", "encryptType" : "1", "info" : [{ "instanceId" : "ebc28eb6-4606-4098-b4bd-c201c99a0654", "appInfo" : { "frontEndUrl" : "https://www.***.com", "adminUrl" : "https://www.***.com/admin", "userName" : "******", "password" : "********", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "ebc28eb6-4606-4098-b4bd-c201c99a0654", "usageValue" : "0.12", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "fe28e27e-1157-4105-8592-24cc9488db10", "appInfo" : { "frontEndUrl" : "https://www.****.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "******", "password" : "***********", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "fe28e27e-1157-4105-8592-24cc9488db10", "usageValue" : "2042", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] }, { "instanceId" : "92df74e4-163e-4e0b-a206-d9800d33881b", "appInfo" : { "frontEndUrl" : "https://www.*****.com", "adminUrl" : "https://www.*****.com/admin", "userName" : "*****", "password" : "*******", "memo" : "have a test, 测试!" }, "usageInfo" : [{ "relatedInstanceId" : "ebc28eb6-4606-4098-b4bd-c201c99a0654", "usageValue" : "3309", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" }, { "relatedInstanceId" : "fe28e27e-1157-4105-8592-24cc9488db10", "usageValue" : "3309", "statisticalTime" : "20221101025113409", "dashboardUrl" : "https://www.baidu.com/dashboard" } ] } ] }
  • 请求方法:GET 请求参数说明请参见下表: 表1 请求参数表 参数 是否必选 类型 最大字符长度 说明 authToken M String 50 安全校验令牌。 取值请参见authToken取值说明。 activity M String 20 接口请求标识,用于区分接口请求场景。 查询实例场景取值:queryInstance timeStamp M String 20 请求发起时的时间戳,取UTC时间。 格式:yyyyMMddHHmmssSSS instanceId M String 64 实例ID,支持批量,多个实例批量查询时用逗号分隔,单次最多支持100个实例查询。 testFlag O String 2 是否为调试请求。 1:调试请求 0:非调试业务 默认取值为“0”。 请求示例: https://example.isv.com?activity=queryInstance&instanceId=ebc28eb6-4606-4098-b4bd-c201c99a0654%2Cfe28e27e-1157-4105-8592-24cc9488db10%2C92df74e4-163e-4e0b-a206-d9800d33881b&testFlag=1&timeStamp=20230327065233980&authToken=Eh%2F3Ud%2BR1j3d%2FwOui5CAcvRipM8IuribvgkXfJAsTfE%3D
  • 请求方法:GET 参数 是否必选 类型 最大字符长度 说明 authToken M String 50 安全校验令牌。 取值请参见authToken取值说明。 activity M String 32 接口请求标识,用于区分接口请求场景。 资源状态变更实例状态场景取值:instanceStatus instanceId M String 64 实例ID 注意: 使用按需接口返回的实例id instanceStatus M String 32 变更状态: FREEZE:冻结 NORMAL:解冻 timeStamp M String 20 请求发起时的时间戳,取UTC时间。 格式:yyyyMMddHHmmssSSS testFlag O String 2 是否为调试请求。 1:调试请求 0:非调试业务 默认取值为“0”。 请求示例: 冻结:https://example.isv.com?activity=instanceStatus&instanceId=huaweitest123456&instanceStatus=FREEZE&testFlag=1&timeStamp=20230327070251713&authToken=pqlrW7%2BPHC%2F1JE%2BMEjKxC94GGJreoS6PZHd982auw2o%3D 解冻:https://example.isv.com?activity=instanceStatus&instanceId=huaweitest123456&instanceStatus=NORMAL&testFlag=1&timeStamp=20230327070251713&authToken=pqlrW7%2BPHC%2F1JE%2BMEjKxC94GGJreoS6PZHd982auw2o%3D
  • 响应消息 响应参数说明请参见下表: 参数 是否必选 类型 最大字符长度 说明 error_code M String 6 调用结果码。 具体请参见调用结果码说明。 error_msg O String 255 调用结果描述。 错误码: http状态码 error_code error_msg 描述 200 MKT.0000 Success. 请求成功 500 MKT.0999 System internal error. 其它服务内部错误 500 MKT.0100 Failure of input parameter 输入参数校验失败 参数范围超限,非法值或格式错误 400 MKT.0101 Invalid parameter 参数无效 输入非接口定义的参数,多参数或少必选参数 比如:传递非法数值、没有实例id等 400 MKT.0102 Invalid body sign 请求body体签名校验失败 400 MKT.0199 Request parameter error 请求参数错误 其它参数错误 比如:必填参数未传递等 401 MKT.0150 Illegal operation 通常是进行了不被授权的操作,例如instance_id对应的产品不是AK/SK对应的ISV发布的 401 MKT.0151 No authority 无API访问权限 token非ISV角色 401 MKT.0154 Illegal token 鉴权失败 token无效 500 MKT.9001 Instance ID not found. 实例ID不存在(商品续费、过期、资源释放接口可能返回) 500 MKT.9002 Invalid usage enties. 计量实体无效 500 MKT.9003 Usage records extends size limit. 计量记录数超出限制(1000条) 500 MKT.9004 Record beginTime extends Limit. 计量记录的起始时间超出有效期(当前时间21天以内) 当您调用API时,如果遇到“APIGW”开头的错误码,请参见API网关错误码进行处理。 响应消息示例: { "error_code":"MKT.0000", "error_msg":"success" }
  • 操作方法 上传备份文件到相关区域的OBS,如下图所示。OBS桶的创建和对象上传可以参考《创建桶》和《上传对象》; 购买相关版本的RDS for sqlserver数据库,用于手工恢复数据,如下图所示。RDS for sqlserver的购买可以参考《RDS for SQL Server快速入门》; DRS控制台,创建备份迁移任务,如下图所示,详细可参考《创建RDS备份迁移任务》; 创建备份迁移任务,选择备份文件所在的OBS桶和具体的备份文件,然后点击“下一步”,如下图所示; 选择目标RDS实例,如下图所示,然后点击“下一步”; 确认迁移任务相关配置,如果没有问题,点击“启动任务”,即可开始迁移; 当任务状态为“成功”的时候,则代表迁移完成,如下图所示。迁移完成以后,需要登录数据库,验证迁移的数据是否完整。 使用DAS导出sql格式的数据,详细可参考《数据导出》。 登录恢复成功后的数据库,如下图所示: 点击“导出”,如下图所示: 单击“导出数据库”,如下图所示: 新建导出任务,如下图所示: 配置完以后,点击“确定”。如下图所示,当任务的状态为“已完成”的时候,则代表导出完成,可以单击“下载”,获取相应的sql文件。
  • 操作步骤 去掉模板中的Region属性 检查模板中的所有resources,去掉region属性,如下图所示。在创建华为云资源的时候,如果不指定Region,将会使用provider级别的Region,更新信息可参考huaweicloud provider的文档; 去掉provider.tf中的Region,最终providers.tf的配置如下: ① // Configure the HuaweiCloud Provider ② provider "huaweicloud" {} 动态获取当前Console所在region 华为云的云服务大多是Region级的服务,在创建各种云服务的时候,可能会需要用到Region的地方,此时可以动态的获取Region,如下所示,后续所有需要用到Region的地方可直接引用local.region。 // 查询可用区 data "huaweicloud_availability_zones" "az" {} locals { // 获取当前Console所在的Region region = data.huaweicloud_availability_zones.az.region }
  • 公共错误码 表1 错误码 http状态码 error_code error_msg 描述 200 CBC.0000 Success 成功 403 CBC.0150 Illegal operation 鉴权失败 400 CBC.0101 Invalid parameter 请求参数不合法 500 CBC.0999 internal error 其它服务内部错误 200 91381033 License resource invalid License资源不可用 200 91381034 license apply invalid 用户License申请不合法 200 91381035 license period has no remain amount License资源周期没余额了 200 91381036 inner error 内部错误 200 91381037 Invalid license format. License格式不正确 200 91381038 License apply has been denied. License申请已拒绝 200 91380150 Role permission denied 没有权限执行该操作,角色权限错误 父主题: 云商店开放接口指南
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全