华为403forbidden怎么解决

403forbidden怎么解决  时间:2021-04-04  阅读:()
华为云云市场接入指南文档版本01发布日期2021-03-25华为技术有限公司版权所有华为技术有限公司2021.
保留一切权利.
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播.
商标声明和其他华为商标均为华为技术有限公司的商标.
本文档提及的其他所有商标或注册商标,由各自的所有人拥有.
注意您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内.
除非合同另有约定,华为公司对本文档内容不做任何明示或默示的声明或保证.
由于产品版本升级或其他原因,本文档内容会不定期进行更新.
除非另有约定,本文档仅作为使用指导,本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保.
文档版本01(2021-03-25)版权所有华为技术有限公司i目录1SaaS类商品接入指南.
11.
1接入流程.
11.
2接口说明.
21.
3接入准备工作.
31.
3.
1获取Key值.
31.
3.
2authToken取值说明.
31.
3.
3HTTPBody签名.
41.
4接口描述.
41.
4.
1新购商品.
41.
4.
2商品续费.
141.
4.
3商品过期.
171.
4.
4商品资源释放.
191.
4.
5商品升级.
211.
5调用结果码说明.
241.
6接口调试.
241.
7代码示例(Java)271.
7.
1ISVServer验证所有的通知请求.
271.
7.
2ISVServer对响应消息体进行签名.
301.
7.
3ISVServer对资源开通后的用户名和密码加密.
311.
7.
4ISVServer解密手机号和邮箱.
341.
7.
5Java代码示例(总)381.
8常见问题.
461.
9文档修订记录.
482API类商品接入指南.
502.
1简介.
502.
2按量计费产品接入流程.
502.
3接口使用方法.
522.
3.
1使用方法.
522.
3.
2接口调用流程.
522.
3.
3获取AK/SK认证.
532.
3.
3.
1生成AK、SK.
532.
3.
3.
2请求签名流程.
532.
3.
3.
3示例代码.
54华为云云市场接入指南目录文档版本01(2021-03-25)版权所有华为技术有限公司ii2.
3.
4构造请求方法.
612.
3.
5发起请求.
622.
3.
6解析消息响应.
622.
3.
7状态码.
622.
4公共参数.
652.
4.
1公共请求消息头参数.
652.
4.
2公共响应消息头参数.
662.
5接口兼容性声明.
662.
6业务计量数据推送.
672.
7计量数据推送请求和响应处理(代码示例)812.
8常见问题.
832.
9文档修订记录.
85华为云云市场接入指南目录文档版本01(2021-03-25)版权所有华为技术有限公司iii1SaaS类商品接入指南1.
1接入流程1.
2接口说明1.
3接入准备工作1.
4接口描述1.
5调用结果码说明1.
6接口调试1.
7代码示例(Java)1.
8常见问题1.
9文档修订记录1.
1接入流程SaaS类商品接入云市场的流程如下图所示:华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司1流程说明如下:1.
申请入驻云市场,成为服务商.
2.
云市场运营人员审核公司的资质信息.
3.
准备生产接口服务器,根据本接入指南开发生产接口.
4.
在卖家中心调试生产接口.
5.
在卖家中心完成安全漏洞扫描.
6.
在卖家中心申请发布SaaS商品.
7.
云市场运营人员审批通过后产品发布成功.
8.
在卖家中心自助管理生产接口通知消息.
1.
2接口说明服务商发布SaaS商品时,首先需根据本接入指南,在生产接口服务器开发一个生产接口.
说明同一个商品发布时,针对不同的调用场景(新购、续费、过期、释放和升级),只需要配置一个"生产系统接口地址".
客户购买商品并付款成功,云市场将调用本接口(新购场景)通知服务商客户购买商品的信息和客户信息,商品生产环境收到该请求信息,需执行新购对应动作并将执行结果返回给云市场.
说明用户购买商品后,在"买家中心"点击该商品的"资源详情"查询使用信息时,会实时调用接口(新购场景)进行查询,故服务商的服务器在处理接口请求时,需要做好幂等性处理.
即云市场服务有可能重发请求,针对同一订单号,服务商的服务器应当返回成功的响应及应用实例信息,不应该创建新的SaaS实例,返回之前成功创建的实例信息即可.
买家购买成功后,使用信息查询操作及页面展示参考SaaS类商品使用指导.
针对新购场景接口调用失败的情况,云市场会持续调用到60次(每3分钟1次)后停止调用.
若服务商接口问题在60次调用时间内解决,则在下一次调用时调用接口响应成功,订单开通成功;若服务商接口问题在60次调用后仍无解决,系统则判断订单为失败,并自动进行订单退订.
若商品单月因接口失败导致的失败订单超过5个,云市场将对该商品下架处理.
客户续费下单或试用商品转正付款成功后,云市场将调用该接口(续费场景)请求服务商执行业务延期,服务商接口需要执行将到期日进行更新,并将执行结果返回给云市场.
客户购买的商品过期时,云市场调用该接口(过期场景),服务商接到该通知以后应该将指定的实例冻结,并将执行结果返回给云市场.
说明用户订单到期后,根据客户等级的不同,有最长15天的资源冻结期,冻结期内资源不可使用,但可以对此订单续费以解冻继续使用,故服务商需对SaaS商品设置15天的冻结期,并在冻结期内保留用户数据.
当客户已购买的商品到期不续订且超过冻结期、或申请退订商品成功时,云市场将释放客户购买的商品并调用该接口(释放场景),服务商接收到该通知以后删除指定的实例,并将执行结果返回给云市场.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司2客户对已购买的商品升级下单且付款成功后,云市场将调用该接口(升级场景)请求服务商执行升配,服务商接口需要执行将商品进行升配,并将执行结果返回给云市场.
1.
3接入准备工作1.
3.
1获取Key值步骤1进入卖家中心页面.
步骤2单击左侧导航的"服务商管理>服务商信息".
在"服务商信息"页面单击小眼睛图标获取Key值.
----结束1.
3.
2authToken取值说明定义authToken值是云市场与服务商之间进行安全校验的必选参数.
云市场每次调用服务商接口的参数中都会带有authToken值.
服务商根据生成规则生成authToken值,并与接口中获取的authToken值进行比较.
完全相同即为校验通过.
生成规则1.
取所有的httpget请求参数(不包含authToken).
2.
对参数名进行字典排序.
3.
对整个字符串进行hmacSHA256加密,密钥取Key值.
举例服务商收到的调用请求数据示例如下:http://www.
isvwebsite.
com/saasproducep1=1&p2=2&p3=3&authToken=xxxxxxxxxxxxxx&timeStamp=2017062118553211.
获取所有的httpget请求参数:p1、p2、p3、timeStamp2.
进行字典排序:sort(p1,p2,p3,timeStamp),假设排序后的顺序是p1、p3、p2、timeStamp3.
生成authToken值:base64_encode(HMAC_SHA256(Key+timeStamp,p1=1&p3=3&p2=2&timeStamp=201706211855321))华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司3说明所有参数的值云市场都经过了URL编码,服务商取到参数值应先进行URL解码.
代码示例代码示例请参见1.
7.
1ISVServer验证所有的通知请求.
1.
3.
3HTTPBody签名包体签名,需要包含在每个接口的响应中,包含两部分:参数取值描述sign_typeHMAC-SHA256当前取值:HMAC-SHA256signaturebase64_encode(HMAC_SHA256(key,httpBody))base64_encode(HMAC_SHA256(key,httpBody))httpBody:整个HTTPBody,包括开始和结束的空格、TAB符等.
key=Key值HTTP响应头域示例:Body-Sign:sign_type="HMAC-SHA256",signature="abcd4567ed03sdfsdfsdfasdfasdgsdfhfgjgkghjllhjkl"说明消息头的格式请严格按照示例添加,sign_type和signature的值必须要加双引号.
代码示例请参见1.
7.
2ISVServer对响应消息体进行签名.
1.
4接口描述1.
4.
1新购商品接口说明客户购买商品并付款成功,云市场将调用本接口通知服务商客户购买商品的信息和客户信息.
服务商需要返回此订单的唯一ID(instanceId).
建议此ID直接使用该订单首次请求时云市场传入的businessId,以确保instanceId的唯一性.
在正常购买场景中,请不要阻塞此接口,如果耗时较长,建议使用队列做缓冲处理,设置instanceId=0,然后立即返回.
若操作失败也请设置instanceId=0,云市场都会再次调用,直到获取到instanceId.
说明服务商应用接入调试时,若instanceId返回值为0,开通失败,不能通过校验,页面会有标红提示.
因此在调试时,instanceId返回值尽量不要为0,使调试通过.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司4当接口响应失败时,系统会邮件通知到服务商云市场账号绑定的邮箱,生产接口消息中可查询接口"异常信息",服务商收到通知后须尽快处理接口异常,,避免订单失败退订.
针对新购场景接口调用失败的情况,云市场会持续调用到60次(每3分钟1次)后停止调用.
若服务商接口问题在60次调用时间内解决,则在下一次调用时接口响应成功,订单开通成功;若服务商接口问题在60次调用后仍无解决,系统则判断订单为失败,并自动进行订单退订.
若商品单月因接口失败导致的失败订单超过5个,云市场将对该商品下架处理.
说明请及时关注服务商信息中客服邮箱以及云市场账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常.
云市场会对接口异常导致订单失败的情况做监控,如SaaS商品频繁出现因接口异常导致订单失败的情况,云市场将对该商品做下架处理.
服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一订单号,服务商的服务器应当返回成功的响应及应用实例信息,不应该创建新的SaaS实例,返回之前成功创建的实例信息即可.
新购商品流程如下图所示:请求消息请求参数说明请参见下表.
云市场会结合服务商创建上架的商品售卖模式来对应请求,服务商也需要根据请求的信息来对应执行生产.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司5参数是否必选参数类型最大字符长度说明authTokenMString50安全校验令牌.
取值请参见authToken取值说明.
timeStampMString20请求发起时的时间戳,取UTC时间.
格式:yyyyMMddHHmmssSSSactivityMString20接口请求标识,用于区分接口请求场景.
新购场景取值:newInstancecustomerIdMString100客户在华为云注册账号的唯一标识.
customerNameOString64客户在华为云注册的账户名.
userIdOString64客户以IAM用户认证方式登录时对应子用户的唯一标识.
非必传,如需此参数,在商品发布时"需要用户授权"请选择"基于IAM用户名创建应用管理账号等信息".
userNameOString64客户以IAM用户认证方式登录的用户名.
非必传,如需此参数,在商品发布时"需要用户授权"请选择"基于IAM用户名创建应用管理账号等信息".
mobilePhoneOString256客户手机号.
非必传,如需此参数,在商品发布时"需要用户授权"请选择"基于手机号码创建应用管理账号等信息",取值为加密后的手机号码.
手机号加密规则如下:由16位iv加密向量和base编码后的手机号密文组成.
iv+base64(AES_CBC(accessKey,mobilePhone))加密位数取ISV发布产品时选择的加密位数.
手机解密代码示例请参见1.
7.
4ISVServer解密手机号和邮箱.
说明手机号不包含国家码.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司6参数是否必选参数类型最大字符长度说明emailOString256客户邮箱.
非必传,如需此参数,在商品发布时"需要用户授权"请选择"基于邮箱创建应用管理账号等信息",取值为加密后的邮箱.
邮箱加密规则如下:由16位iv加密向量和base编码后的邮箱密文组成.
iv+base64(AES_CBC(accessKey,email))加密位数取ISV发布产品时选择的加密位数.
邮箱解密代码示例请参见1.
7.
4ISVServer解密手机号和邮箱.
businessIdMString64云市场业务ID.
每一次请求,businessId皆不一致.
orderIdMString64云市场订单ID.
skuCodeOString64产品规格标识.
租户购买包月或包年的产品后,可能会续费,续费支持变更周期类型(例如包月转包年),此时,租户开通的实例instanceId对应的productId会变化,但skuCode不变.
说明该参数可在商品审核上架后,进入"卖家中心>商品管理>我的商品"页面,单击该商品操作列的"详情"进入商品详情页面获取.
productIdMString64产品标识,同一skuCode下,不同周期类型的productId不同.
例如:ISV发布产品,新增一个规格,会生成一个skuCode,再配置包年价格,包月价格,会生成两个productId.
说明该参数可在商品审核上架后,进入"卖家中心>商品管理>我的商品"页面,单击该商品操作列的"详情"进入商品详情页面获取.
testFlagOString2是否为调试请求.
1:调试请求0:非调试请求取值为"0"时默认不传.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司7参数是否必选参数类型最大字符长度说明trialFlagOString2是否是开通试用实例.
1:试用实例0:非试用实例不传试用参数:2018年5月12日之前已发布成功的产品实例取值为"0"时默认不传.
expireTimeODateTime20过期时间.
格式:yyyyMMddHHmmss说明按周期售卖的商品,会请求该参数.
按次售卖的商品,不会请求该参数.
过期时间根据订单创建时间和购买周期计算而来,与订单实际过期时间有误差,仅供参考.
chargingModeOInteger[3]计费模式.
3:表示按次购买.
说明包周期购买场景请求时不传该参数.
按次购买场景请求时传该参数.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司8参数是否必选参数类型最大字符长度说明saasExtendParamsOString2048扩展参数.
非必填.
扩展参数格式为json数组字符串通过urlEncode(base64(saasExtendParams))携带到url参数中.
在得到saasExtendParams参数的值后,需要通过base64Decode(urlDecode(saasExtendParams))获取扩展参数json数组.
例如:[{"name":"emailDomainName","value":"test.
xxxx.
com"},{"name":"extendParamName","value":"extendParamValue"}]其中emailDomainName和extendParamName为发布商品时填写值.
说明(本说明仅适用于WeLink开放平台开发的商品)请先在应用接入调试页面调测"WeLink商品接口调测必选参数",发布WeLink开放平台开发的商品时,会包含name值为platformParams的扩展参数,值为json格式字符串,包含tenantName、tennantId、userId三个参数.
tenantName是WeLink中的企业名tennantId是WeLink中的企业唯一标识符userId是WeLink中订阅该应用的用户,通常为企业管理员(WeLink企业管理员可以有多个且企业管理员账号可被注销)amountOInteger4数量类型的商品定价属性.
非必填.
属性名称:数量(支持服务商自定义名称)单位:个(次)说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"数量"线性属性的规格时,会填写及调整购买的个数或次数.
例如:30个用户diskSizeOInteger4数量类型的商品定价属性.
非必填.
属性名称:硬盘大小(支持服务商自定义名称)单位:GB说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"硬盘大小"线性属性的规格时,会填写及调整购买多少GB.
例如:100GB华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司9参数是否必选参数类型最大字符长度说明bandWidthOInteger4数量类型的商品定价属性.
非必填.
属性名称:带宽(支持服务商自定义名称)单位:Mbps说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"带宽"线性属性的规格时,会填写及调整购买多少Mbps.
例如:20MbpsperiodTypeOString2周期类型.
说明非必传,如需此参数,计费类型需选择包周期chargingMode=1,包周期购买场景请求时传该参数.
年:"year"月:"month"periodNumberOinteger5周期数量.
说明非必传,如需此参数,计费类型需选择包周期chargingMode=1,包周期购买场景请求时传该参数.
周期数量:1,2,3…orderAmountObigdecimal订单金额.
说明该金额为用户实际支付金额,供服务商对账参考.
金额值大于等于0,最大三位小数.
单位:元provisionTypeOinteger2商品实例开通方式.
说明用户购买后同步开通(默认,云市场轮询调用newInstance生产接口)用户确认验收后开通(SaaS涉及服务监管)1.
用户购买该商品时,云市场调用新购商品接口,服务商需返回结果码为请求处理中000004或订单创建成功000000.
2.
当服务商点击开通交付时,云市场调用新购商品接口,服务商需返回结果码成功000000.
3.
用户点击确认验收时,云市场调用新购商品传入用户验收时间给到服务商,服务商需返回结果码成功000000.
ISV接口通知云市场开通(暂未使用)华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司10参数是否必选参数类型最大字符长度说明acceptanceTimeOString20用户验收时间.
说明此时间为用户计费开始时间,如选择的商品实例开通方式为"用户确认验收后开通",则用户验收时间为必填项.
格式:yyyyMMddHHmmssSSS说明2018年5月12日新增接口参数:trialFlag和skuCode.
2018年5月12日之后发布产品或已发布成功的产品新增规格时,请填写此新参数并通过接口调试(trialFlag的三种值都要调试通过).
2018年5月12日之前已发布成功的产品如果不涉及免费试用变更,不要求做接口调试.
2018年8月9日新增SaaS计费模式"按次"发布接口,如需选择"按次"发布,遵循SaaS类商品接入指南调试通过后才可选择该计费模式"按次"发布商品.
2019年9月27日新增数量类型定价属性接口参数:amount、diskSize和bandWidth.
如需发布支持多SKU定价的商品规格,且定价属性中包含数量类型的属性(数量、带宽、硬盘大小等),请先在商品属性管理页面新建数量类型属性,然后回到调试页面选择要进行调试的数量类型属性,填写参数值,进行调试.
接口调试说明请参考接口调试.
请求消息示例:https://isvserver.
com/produceAPIactivity=newInstance&businessId=03pf80c2bae96vc49b80b917bea776d7&customerId=3736bb8ad93b43fca8012c64a82cec25&expireTime=20180725000000&orderId=HWS001014ED483AA1E8&productId=005a8781ef0c4a47a3dbfc4c1e72871e&saasExtendParams=W3sibmFtZSI6ImVtYWlsMTEiLCJ2YWx1ZSI6ImVtYWlsMTFlbWFpbDExIn0seyJuYW1lIjoiZW1haWwyMiIsInZhbHVlIjoiZW1haWwyMmVtYWlsMjIifV0%3D&timeStamp=20170725025113409&testFlag=0&authToken=09lsS5y+KCtxBu+ON4TXv1SrjH5KVYka9sx2MauHrQU=响应消息响应参数说明请参见下表:参数是否必选类型取值范围参数说明resultCodeMString6调用结果码.
具体请参见1.
5调用结果码说明.
resultMsgOString255调用结果描述.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司11参数是否必选类型取值范围参数说明encryptTypeOString2敏感信息加密算法1:AES256_CBC_PKCS5Padding(默认值)2:AES128_CBC_PKCS5Padding说明敏感信息加密算法是AES256_CBC_PKCS5Padding时返回值为1,敏感信息加密算法是AES128_CBC_PKCS5Padding时返回值为2.
instanceIdOString64实例ID,服务商提供的唯一标识.
建议此ID直接使用该订单首次请求时云市场传入的businessId,以确保instanceId的唯一性.
说明云市场每次请求时的businessId皆不一致,如取businessId作为instanceId,取订单首次调用时的businessId即可.
若通过其他方式生成instanceId,请确保该参数的全局唯一性,例如使用UUID生成.
避免生成的instanceId发生重复,导致用户开通SaaS实例失败.
appInfoOAppInfoN/A应用实例信息.
客户购买商品后,服务商需要返回登录服务地址(网站地址)或免登地址供客户后续操作.
appInfo数据结构定义请参见下表.
AppInfo数据结构定义如下:参数是否必选类型及范围取值范围参数说明frontEndUrlMString512前台地址.
客户购买商品后,可以访问的网站地址.
adminUrlOString512管理地址.
客户购买商品后,可以访问的管理后台地址.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司12参数是否必选类型及范围取值范围参数说明userNameOString128加密后的管理员帐号.
客户购买商品后,访问服务商管理后台的账号(一般为邮箱和手机号).
该值由16位iv加密向量和base编码后的用户名密文组成.
iv+base64(AES_CBC(accessKey,userName))需要使用Key值对账号做加密处理,加密算法以encryptType参数为准.
代码示例请参见1.
7.
3ISVServer对资源开通后的用户名和密码加密.
passwordOString128加密后的管理员初始密码.
客户购买商品后,访问服务商管理后台的密码(一般由服务商生成).
该值由16位iv加密向量和base编码后的密码密文组成.
iv+base64(AES_CBC(accessKey,pwd))需要使用Key值对密码做加密处理,加密算法以encryptType参数为准.
代码示例请参见1.
7.
3ISVServer对资源开通后的用户名和密码加密.
memoOString1024备注.
说明如果备注包含中文内容,请将中文转换成unicode编码,例如:"中文"可以转换成"\u4e2d\u6587".
说明获取accessKey,请参见1.
3.
1获取Key值.
用户名密码所校验的长度是密文的长度(包括iv向量).
服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一订单号,服务商的服务器应当返回成功的响应及应用实例信息,不应该创建新的SaaS实例,返回之前成功创建的实例信息即可.
SaaS实例信息如果有变化,例如,adminUrl发生变化,在云市场服务重新调用此接口,传入相同的orderId时,服务商的服务器需要返回更新后的SaaS实例信息.
为保证安全,云市场不持久存储SaaS实例信息.
ISV生产接口响应中,,除memo参数外,其他参数请不要返回中文.
响应消息示例:{"resultCode":"000000","resultMsg":"success.
","instanceId":"03pf80c2bae96vc49b80b917bea776d7","encryptType":"1","appInfo":{"frontEndUrl":"http://www.
isvserver.
com","adminUrl":"http://www.
isvserver.
com",华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司13"userName":"luQg154bx766030TobyT0ghfQRx3tvVEdpwMRg==","password":"7Bx4DyX7980a59T0qbhnpfhCz82Uc5cZQQtExg=="}}1.
4.
2商品续费接口说明按周期售卖的商品,服务商必须实现续费接口生产开发.
客户续费下单或试用商品转正后,云市场将调用该接口请求服务商执行业务延期,服务商接口需要执行将到期日进行更新,并返回通知云市场.
服务商需要保障续费接口通畅,将业务进行延期,如续费失败,将可能导致用户的业务被释放的风险.
针对续费场景接口调用失败的情况,云市场会调用1次,"卖家中心—生产接口消息"中可查询接口"异常信息",请在修复接口异常后,通知云市场对该失败调用进行重新调用.
说明请及时关注服务商信息中客服邮箱以及云市场账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常.
云市场会对接口异常的情况做监控,如SaaS商品频繁出现因接口异常的情况,云市场将对该商品做下架处理.
商品续费流程如下图所示:请求消息请求参数说明请参见下表:华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司14参数是否必选类型取值范围说明activityMString20接口请求标识,用于区分接口请求场景.
续费场景取值:refreshInstanceorderIdMString64云市场订单ID.
instanceIdMString64实例ID.
productIdOString64产品标识,租户续费或转正产品实例时,如果订购周期类型发生变化,会传入变化后的产品类型对应的productId.
expireTimeMString20过期时间.
格式:yyyyMMddHHmmsstestFlagOString2是否为调试请求.
1:调试请求0:非调试请求默认取值为"0".
trialToFormalOString2是否是试用转正请求不传参数:不是1:是默认不是试用转正.
默认不是试用转按需.
authTokenMString50安全校验令牌.
取值请参见1.
3.
2authToken取值说明.
timeStampMString20请求发起时的时间戳,取UTC时间.
格式:yyyyMMddHHmmssSSSperiodTypeOString2周期类型.
说明非必传,如需此参数,计费类型需选择包周期chargingMode=1,包周期购买场景请求时传该参数.
年:"year"月:"month"periodNumberOinteger2周期数量.
说明非必传,如需此参数,计费类型需选择包周期chargingMode=1,包周期购买场景请求时传该参数.
周期数量:1,2,3…华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司15参数是否必选类型取值范围说明orderAmountObigdecimal订单金额.
说明该金额为用户实际支付金额,供服务商对账参考.
金额值大于等于0,最大三位小数.
单位:元说明2018年5月12日新增接口参数:productId和trialToFormal.
2018年5月12日之后发布产品或已发布成功的产品新增规格时,请填写此新参数并通过接口调试(productId为空或者填值,trialToFormal"不传参数"或为"1"都要求调试通过).
2018年5月12日之前已发布成功的产品,如果不涉及免费试用变更,不要求做接口调试.
请求消息示例:https://isvserver.
com/produceAPIactivity=refreshInstance&expireTime=20180725000000&instanceId=03pf80c2bae96vc49b80b917bea776d7&orderId=HWS001014ED483AA1E8&timeStamp=20170725025113409&testFlag=0&authToken=09lsS5y+KCtxBu+ON4TXv1SrjH5KVYka9sx2MauHrQU=响应消息响应参数说明请参见下表:参数是否必选类型取值范围说明resultCodeMString6调用结果码.
具体请参见1.
5调用结果码说明.
resultMsgOString255调用结果描述.
说明服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一订单号,服务商的服务器应当返回成功的响应,不应该再做实例延期处理,返回成功响应即可.
响应消息示例:{"resultCode":"000000","resultMsg":"success.
"}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司161.
4.
3商品过期接口说明客户购买的商品过期时,云市场调用该接口,服务商接到该通知以后应该将指定的实例冻结.
针对过期场景接口调用失败的情况,云市场会持续调用到60次(每1分钟1次)后停止调用,"卖家中心—生产接口消息"中可查询接口"异常信息".
若服务商接口问题在60次调用时间内解决,则在下一次调用时接口响应成功;若服务商接口问题在60次调用后仍无解决,系统停止调用,请在修复接口异常后,在"卖家中心—生产接口消息"该订单记录的右侧点击"重新启动",进行接口的重新调用.
说明请及时关注服务商信息中客服邮箱以及云市场账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常.
云市场会对接口异常的情况做监控,如SaaS商品频繁出现因接口异常的情况,云市场将对该商品做下架处理.
商品过期流程如下图所示:请求消息请求参数说明请参见下表:参数是否必选类型取值范围说明activityMString20接口请求标识,用于区分接口请求场景.
过期场景取值:expireInstance华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司17参数是否必选类型取值范围说明instanceIdMString64实例IDorderIdMString64新购商品时对应的订单ID.
testFlagOString2是否为调试请求.
1:调试请求0:非调试业务默认取值为"0".
authTokenMString50安全校验令牌.
取值请参见1.
3.
2authToken取值说明.
timeStampMString20请求发起时的时间戳,取UTC时间.
格式:yyyyMMddHHmmssSSS请求消息示例:https://isvserver.
com/produceAPIactivity=expireInstance&instanceId=03pf80c2bae96vc49b80b917bea776d7&timeStamp=20170725025113409&testFlag=0&authToken=09lsS5y+KCtxBu+ON4TXv1SrjH5KVYka9sx2MauHrQU=响应消息响应参数说明请参见下表:参数是否必选类型取值范围说明resultCodeMString6调用结果码.
具体请参见1.
5调用结果码说明.
resultMsgOString255调用结果描述.
说明服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一instanceId,服务商的服务器不应该重复做实例过期处理,返回成功响应即可.
响应消息示例:{"resultCode":"000000",华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司18"resultMsg":"success.
"}1.
4.
4商品资源释放接口说明云市场将在释放客户购买的商品时调用该接口,服务商接收到该通知以后可以删除指定的实例.
当客户已购买的商品到期不续订且超过保留期、或申请退订商品成功时,将释放客户购买的商品资源.
针对释放场景接口调用失败的情况,云市场会持续调用到60次(每1分钟1次)后停止调用,"卖家中心—生产接口消息"中可查询接口"异常信息".
若服务商接口问题在60次调用时间内解决,则在下一次调用时接口响应成功;若服务商接口问题在60次调用后仍无解决,系统停止调用,请在修复接口异常后,在"卖家中心—生产接口消息"该订单记录的右侧点击"重新启动",进行接口的重新调用.
说明请及时关注服务商信息中客服邮箱以及云市场账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常.
云市场会对接口异常的情况做监控,如SaaS商品频繁出现因接口异常的情况,云市场将对该商品做下架处理.
商品资源释放流程如下图所示:请求消息请求参数说明请参见下表:华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司19参数是否必选类型取值范围说明activityMString20接口请求标识,用于区分接口请求场景.
释放场景取值:releaseInstanceinstanceIdMString64实例ID.
orderIdMString64新购商品时对应的订单ID.
testFlagOString2是否为调试请求.
1:调试请求0:非调试请求默认取值为"0".
authTokenMString50安全校验令牌.
取值请参见1.
3.
2authToken取值说明.
timeStampMString20请求发起时的时间戳,取UTC时间.
格式:yyyyMMddHHmmssSSSorderAmountObigdecimal订单金额.
说明该金额为用户实际支付金额,供服务商对账参考.
金额值大于等于0,最大三位小数.
单位:元请求消息示例:https://isvserver.
com/produceAPIactivity=releaseInstance&instanceId=03pf80c2bae96vc49b80b917bea776d7&timeStamp=20170725025113409&testFlag=0&authToken=09lsS5y+KCtxBu+ON4TXv1SrjH5KVYka9sx2MauHrQU=响应消息响应参数说明请参见下表:参数是否必选类型取值范围说明resultCodeMString6调用结果码.
具体请参见1.
5调用结果码说明.
resultMsgOString255调用结果描述.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司20说明服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一instanceId,服务商的服务器不应该重复做实例资源释放处理,返回成功响应即可.
响应消息示例:{"resultCode":"000000","resultMsg":"success.
"}1.
4.
5商品升级接口说明用户对已购买的商品进行升级,升级订单付款成功后,云市场调用该接口请求服务商升级用户购买的商品,服务商接口需要执行商品升级,并返回通知云市场.
商品升级规则设置参考通用商品升级.
商品升级流程如下图所示:请求消息请求参数说明请参见下表:参数是否必选类型取值范围说明authTokenMString50安全校验令牌.
取值请参见authToken取值说明.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司21参数是否必选类型取值范围说明activityMString20接口请求标识,用于区分接口请求场景.
升级场景取值:upgradeinstanceIdMString64实例ID.
说明升级时,instanceId不变.
testFlagOString2是否为调试请求.
1:调试请求0:非调试请求默认取值为"0".
orderIdMString64升级后的新订单ID.
说明升级操作会产生新的订单.
skuCodeMString64升级后产品规格标识.
说明对于自定义属性模板规格,如果租户升级时选择了其他属性值,instanceId对应的规格会发生变化,因此skuCode会变化;如果仅扩容(调整增加线性属性值大小,例如:从当前的10用户增加到20用户),skuCode不变.
productIdMString64升级后产品ID.
如果skuCode变化,productId也会发生变化;如果仅扩容,productId不变.
timeStampMString20请求发起时的时间戳,取UTC时间.
格式:yyyyMMddHHmmssSSSamountOInteger4数量类型的商品定价属性.
非必填.
属性名称:数量(支持服务商自定义名称)单位:个(次)说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"数量"线性属性的规格时,会填写及调整购买的个数或次数.
例如:30个用户华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司22参数是否必选类型取值范围说明diskSizeOInteger4数量类型的商品定价属性.
非必填.
属性名称:硬盘大小(支持服务商自定义名称)单位:GB说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"硬盘大小"线性属性的规格时,会填写及调整购买多少GB.
例如:100GBbandWidthOInteger4数量类型的商品定价属性.
非必填.
属性名称:带宽(支持服务商自定义名称)单位:Mbps说明对于包周期或一次性计费的SaaS商品,租户下单购买包含"带宽"线性属性的规格时,会填写及调整购买多少Mbps.
例如:20Mbps请求消息示例:http://isvserver.
com/produceAPIactivity=upgrade&amount=6456&instanceId=huaweitest123456&orderId=CS1906666688ABCDE&productId=00301-666688-0-0&saasExtendParams=W3sibmFtZSI6ImlkTnVtIiwidmFsdWUiOiIzNTIyNTU1NTU1NTU2NTYifSx7Im5hbWUiOiJ1c2VyTmFtZSIsInZhbHVlIjoiaHVhd2VpMTIzIn0seyJuYW1lIjoiY3VzdEVtYWlsIiwidmFsdWUiOiIxMjNAaHVhd2VpLmNvbSJ9XQ==&skuCode=d0abcd12-1234-5678-ab90-11ab012aaaa1&testFlag=1&timeStamp=20191216013757582&authToken=a3Bl+C93xv3ENgm40ngyYvQnYcTS/pgY5ugl20wtzGg=响应消息响应参数说明请参见下表:参数是否必选类型取值范围说明resultCodeMString6调用结果码.
具体请参见调用结果码说明.
resultMsgOString255调用结果描述.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司23说明服务商的服务器在处理接口请求时,需要做好幂等性处理.
云市场服务有可能重发请求,针对同一orderId,服务商的服务器不应该重复做实例资源升级处理,返回成功响应即可.
响应消息示例:{"resultCode":"000000","resultMsg":"success.
"}1.
5调用结果码说明模块结果码结果码说明公共000000成功000001鉴权失败000002请求参数不合法000003实例ID不存在(商品续费、过期、资源释放接口可能返回)000004请求处理中000005其它服务内部错误新购商品000100无可用实例资源分配1.
6接口调试为了保证使用SaaS接入方式的正确性,云市场为服务商在卖家中心搭建了应用接入调试界面.
服务商可以在此页面调试SaaS接口在4个调用场景(新购、续费、过期和释放)的正确性.
下面以"新购商品"接口为例进行说明.
步骤1请参照请求消息中的参数说明在ISVServer中预置参数值.
步骤2进入卖家中心页面.
步骤3单击左侧导航的"应用接入>应用接入调试".
步骤4在右侧页面的"新购商品"页签,填写步骤1中预置的各个参数值,单击"生成链接地址"生成请求消息示例,各参数说明参考接口描述.
(可选)如需发布支持多SKU定价的商品规格,且定价属性中包含数量类型的属性(数量、带宽、硬盘大小等),请先在商品属性管理页面新建数量类型属性,然后回到调试页面选择要进行调试的数量类型属性,填写参数值.
接口调试通过后,即可发布包含数量类型定价属性的SKU定价的商品.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司24(可选)"扩展参数":如需用户订购时填写额外参数信息,需点击"添加扩展参数"选择参数类型,最多支持添加3条.
如需添加默认值之外的参数类型,请先通过云市场邮箱联系运营经理申请配置所需的参数类型,具体申请结果以云市场反馈为准.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司25说明2018年5月12日新增接口参数:trialFlag和skuCode.
–2018年5月12日之后发布产品或已发布成功的产品新增规格时,请填写此新参数并通过接口调试(trialFlag的三种值都要调试通过).
–2018年5月12日之前已发布成功的产品如果不涉及免费试用变更,不要求做接口调试.
2018年8月9日新增SaaS计费模式"按次"发布接口,如需选择"按次"发布,遵循SaaS类商品接入指南调试通过后才可选择该计费模式"按次"发布商品.
扩展参数,非必填.
扩展参数格式为json数组字符串通过urlEncode(base64(saasExtendParams))携带到url参数中.
在得到saasExtendParams参数的值后,需要通过base64Decode(urlDecode(saasExtendParams))获取扩展参数json数组.
例如:[{"name":"emailDomainName","value":"test.
xxxx.
com"},{"name":"extendParamName","value":"extendParamValue"}]其中emailDomainName和extendParamName为发布商品时填写值.
发布WeLink开放平台开发的商品时,请先在应用接入调试页面调测"WeLink商品接口调测必选参数",测试请参照如下截图:tenantName:isv测试企业tenantId:4CA08CF8F3E34566A07584D4C74D41EDuserId:admin@isvtest步骤5单击"调测并保存用例".
系统会调用生产链接进行接口测试,如测试成功则会保存对应用例,继续执行步骤6;如测试失败,则会在页面下方展示对应错误信息,可根据对应信息进行接口修改.
说明如果发布包周期商品,需要调测和保存"新购商品"、"续费"、"过期"、"释放"四种场景的测试用例,且"新购商品"场景的计费模式需要选择包周期.
如果发布按次商品,需要调测和保存"新购商品"和"释放"场景的测试用例,其中"新购商品"场景的计费模式需要选择按次;包周期和按次同时发布时,只需要一个释放接口用例.
如果同时发布包周期和按次商品,则需要调测和保存"新购商品"、"续费"、"过期"、"释放"四种场景的测试用例,且"新购商品"场景需保存两条测试用例计费模式分别选择包周期和按次.
步骤6系统提示"调测用例成功!
",单击"保存用例".
调测成功的用例可以在"应用接入>调测用例管理"页面进行查询.
调测用例管理参考SaaS商品应用接入调试及调试用例管理.
----结束华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司261.
7代码示例(Java)1.
7.
1ISVServer验证所有的通知请求代码调用如下图所示.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司27/***校验通知消息的合法性*@paramrequesthttp请求通知消息*@paramaccessKey接入码*@paramencryptLength加密长度*@return验证结果*/publicstaticbooleanverificateRequestParams(javax.
servlet.
http.
HttpServletRequestrequest,StringaccessKey,intencryptLength){//解析出url内容MapparamsMap=request.
getParameterMap();StringtimeStamp=null;StringauthToken=null;String[]timeStampArray=paramsMap.
get("timeStamp");if(null!
=timeStampArray&&timeStampArray.
length>0){timeStamp=timeStampArray[0];}String[]authTokenArray=paramsMap.
get("authToken");if(null!
=authTokenArray&&authTokenArray.
length>0){authToken=authTokenArray[0];}//对剩下的参数进行排序,拼接成加密内容MapsortedMap=newTreeMap();sortedMap.
putAll(paramsMap);sortedMap.
remove("authToken");StringBufferstrBuffer=newStringBuffer();SetkeySet=sortedMap.
keySet();Iteratoriter=keySet.
iterator();while(iter.
hasNext()){Stringkey=iter.
next();Stringvalue=sortedMap.
get(key)[0];strBuffer.
append("&").
append(key).
append("=").
append(value);}//修正消息体,去除第一个参数前面的&华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司28StringreqParams=strBuffer.
toString().
substring(1);Stringkey=accessKey+timeStamp;Stringsignature=null;try{signature=generateResponseBodySignature(key,reqParams);}catch(InvalidKeyException|NoSuchAlgorithmException|IllegalStateException|UnsupportedEncodingExceptione){//TODOAuto-generatedcatchblock}returnauthToken.
equals(signature);}/***生成http响应消息体签名示例Demo*@paramkey用户在isvconsole分配的accessKey,请登录后查看*@parambodyhttp响应的报文*@return加密结果*@throwsInvalidKeyException*@throwsNoSuchAlgorithmException*@throwsIllegalStateException*@throwsUnsupportedEncodingException*/publicstaticStringgenerateResponseBodySignature(Stringkey,Stringbody)throwsInvalidKeyException,NoSuchAlgorithmException,IllegalStateException,UnsupportedEncodingException{returnbase_64(hmacSHA256(key,body));}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司29/****hamcSHA256加密算法*@parammacKey秘钥key*@parammacData加密内容-响应消息体*@return加密密文*@throwsNoSuchAlgorithmException*@throwsInvalidKeyException*@throwsIllegalStateException*@throwsUnsupportedEncodingException*/publicstaticbyte[]hmacSHA256(StringmacKey,StringmacData)throwsNoSuchAlgorithmException,InvalidKeyException,IllegalStateException,UnsupportedEncodingException{SecretKeySpecsecret=newSecretKeySpec(macKey.
getBytes(),"HmacSHA256");Macmac=Mac.
getInstance("HmacSHA256");mac.
init(secret);byte[]doFinal=mac.
doFinal(macData.
getBytes("UTF-8"));returndoFinal;}/****字节数组转字符串*@parambytes字节数组*@return字符串*/publicstaticStringbase_64(byte[]bytes){returnnewString(Base64.
encodeBase64(bytes));}1.
7.
2ISVServer对响应消息体进行签名代码请参见1.
7.
1ISVServer验证所有的通知请求中的generateResponseBodySignature方法.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司301.
7.
3ISVServer对资源开通后的用户名和密码加密代码调用如下图所示.
/***对资源开通后,返回的用户名和密码进行加密*@paramkey秘钥*@paramstr原文*@paramencryptLength加密长度*@return加密结果*/publicstaticStringgenerateSaaSUsernameOrPwd(Stringkey,Stringstr,intencryptLength){Stringiv=getRandomChars(16);StringafterEncryptStr="";try{afterEncryptStr=encryptAESCBCEncode(str,key,iv,encryptLength);}catch(InvalidKeyException|NoSuchAlgorithmException|NoSuchPaddingException|InvalidAlgorithmParameterException|IllegalBlockSizeException|BadPaddingExceptione){//TODO:异常处理}System.
out.
println(afterEncryptStr);returniv+afterEncryptStr;}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司31/***随机生成字符串*@paramlength随机字符串的长度*@return随机字符串*/publicstaticStringgetRandomChars(intlength){StringrandomChars="";SecureRandomrandom=newSecureRandom();for(inti=0;i16){Stringiv=str.
substring(0,16);StringencryptStr=str.
substring(16);Stringresult=null;try{result=decryptAESCBCEncode(encryptStr,key,iv,encryptLength);}catch(InvalidKeyException|NoSuchAlgorithmException|NoSuchPaddingException|InvalidAlgorithmParameterException|IllegalBlockSizeException|BadPaddingExceptione){//TODO:异常处理}returnresult;}returnnull;}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司36/***解密AESCBC*@paramcontent原文*@paramkey秘钥*@paramiv盐值*@return解密结果*@throwsBadPaddingException*@throwsIllegalBlockSizeException*@throwsInvalidAlgorithmParameterException*@throwsNoSuchPaddingException*@throwsNoSuchAlgorithmException*@throwsInvalidKeyException*/publicstaticStringdecryptAESCBCEncode(Stringcontent,Stringkey,Stringiv,intencryptType)throwsInvalidKeyException,NoSuchAlgorithmException,NoSuchPaddingException,InvalidAlgorithmParameterException,IllegalBlockSizeException,BadPaddingException{if(StringUtils.
isEmpty(content)||StringUtils.
isEmpty(key)||StringUtils.
isEmpty(iv)){returnnull;}returnnewString(decryptAESCBC(Base64.
decodeBase64(content.
getBytes()),key.
getBytes(),iv.
getBytes(),encryptType));}publicstaticbyte[]decryptAESCBC(byte[]content,byte[]keyBytes,byte[]iv,intencryptType)throwsNoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,InvalidAlgorithmParameterException,IllegalBlockSizeException,BadPaddingException{KeyGeneratorkeyGenerator=KeyGenerator.
getInstance("AES");SecureRandomsecureRandom=SecureRandom.
getInstance("SHA1PRNG");secureRandom.
setSeed(keyBytes);keyGenerator.
init(encryptType,secureRandom);SecretKeykey=keyGenerator.
generateKey();Ciphercipher=Cipher.
getInstance("AES/CBC/PKCS5Padding");cipher.
init(Cipher.
DECRYPT_MODE,key,newIvParameterSpec(iv));华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司37byte[]result=cipher.
doFinal(content);returnresult;}1.
7.
5Java代码示例(总)packagecom.
huawei.
cbc.
cbcmarketplacecommentservice.
ability.
jsonutils;importjava.
io.
UnsupportedEncodingException;importjava.
security.
InvalidAlgorithmParameterException;importjava.
security.
InvalidKeyException;importjava.
security.
NoSuchAlgorithmException;importjava.
security.
SecureRandom;importjava.
util.
HashMap;importjava.
util.
Iterator;importjava.
util.
Map;importjava.
util.
Set;importjava.
util.
TreeMap;importjavax.
crypto.
BadPaddingException;importjavax.
crypto.
Cipher;importjavax.
crypto.
IllegalBlockSizeException;importjavax.
crypto.
KeyGenerator;importjavax.
crypto.
Mac;importjavax.
crypto.
NoSuchPaddingException;importjavax.
crypto.
SecretKey;importjavax.
crypto.
spec.
IvParameterSpec;importjavax.
crypto.
spec.
SecretKeySpec;importorg.
apache.
commons.
codec.
binary.
Base64;importorg.
apache.
commons.
lang.
StringUtils;publicclassEncryptTest{//编码方式privatestaticfinalStringCHARSET="UTF-8";华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司38//加密类型256加密(AES256_CBC_PKCS5Padding)时传1,128加密(AES128_CBC_PKCS5Padding)时传2privatestaticfinalStringENCRYPT_TYPE_256="1";//服务商信息界面的key值(需要替换为自己的key)privatestaticfinalStringACCESS_KEY="xxxxxxx";publicstaticvoidmain(Stringargs[])throwsException{服务商验证请求-//将请求转换为map,模拟从request中获取参数操作(request.
getParameterMap())MapparamsMap=getTestUrlMap();//加密类型256加密(AES256_CBC_PKCS5Padding),128加密(AES128_CBC_PKCS5Padding)System.
out.
println("服务商验证请求:"+verificateRequestParams(paramsMap,ACCESS_KEY,256));//需要加密的手机、密码等StringneedEncryptStr="15905222222";StringencryptStr=generateSaaSUsernameOrPwd(needEncryptStr,ACCESS_KEY,ENCRYPT_TYPE_256);System.
out.
println("加密的手机、密码等:"+encryptStr);//解密StringdecryptStr=decryptMobilePhoneOrEMail(ACCESS_KEY,encryptStr,ENCRYPT_TYPE_256);System.
out.
println("解密的手机、密码等:"+decryptStr);//body签名StringneedEncryptBody="{\"resultCode\":\"00000\",\"resultMsg\":\"购买成功\",\"encryptType\":\"1\",\"instanceId\":\"000bd4e1-5726-4ce9-8fe4-fd081a179304\",\"appInfo\"{\"userName\":\"3LQvu8363e5O4zqwYnXyJGWz8y+GAcu0rpM0wQ==\",\"password\":\"RY31aEnR5GMCFmt3iG1hW7UF1HK09MuAL2sgxA==\"}}";StringencryptBody=generateResponseBodySignature(ACCESS_KEY,needEncryptBody);System.
out.
println("body签名:"+encryptBody);}privatestaticMapgetTestUrlMap(){//原始请求:http://bzapic.
natappfree.
ccactivity=newInstance&businessId=61e834ba-7b97-4418-b8f7-华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司39e5345137278c&customerId=68cbc86abc2018ab880d92f36422fa0e&expireTime=20200727153156&orderId=CS1906666666ABCDE&productId=00301-666666-0--0&testFlag=1&timeStamp=20200727073711903&authToken=Gzbfjf9LHRBcI3bFVi++sLinCNOBF6qa7is1fvjEgYQ=MapparamsMap=newHashMap();paramsMap.
put("activity",newString[]{"newInstance"});paramsMap.
put("businessId",newString[]{"61e834ba-7b97-4418-b8f7-e5345137278c"});paramsMap.
put("customerId",newString[]{"68cbc86abc2018ab880d92f36422fa0e"});paramsMap.
put("expireTime",newString[]{"20200727153156"});paramsMap.
put("orderId",newString[]{"CS1906666666ABCDE"});paramsMap.
put("productId",newString[]{"00301-666666-0--0"});paramsMap.
put("testFlag",newString[]{"1"});paramsMap.
put("timeStamp",newString[]{"20200727073711903"});paramsMap.
put("authToken",newString[]{"Gzbfjf9LHRBcI3bFVi++sLinCNOBF6qa7is1fvjEgYQ="});returnparamsMap;}/***校验通知消息的合法性**@paramaccessKey接入码*@paramencryptLength加密长度*@return验证结果*/publicstaticbooleanverificateRequestParams(MapparamsMap,StringaccessKey,intencryptLength){StringtimeStamp=null;StringauthToken=null;String[]timeStampArray=paramsMap.
get("timeStamp");if(null!
=timeStampArray&&timeStampArray.
length>0){timeStamp=timeStampArray[0];}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司40String[]authTokenArray=paramsMap.
get("authToken");if(null!
=authTokenArray&&authTokenArray.
length>0){authToken=authTokenArray[0];}//对剩下的参数进行排序,拼接成加密内容MapsortedMap=newTreeMap();sortedMap.
putAll(paramsMap);sortedMap.
remove("authToken");StringBufferstrBuffer=newStringBuffer();SetkeySet=sortedMap.
keySet();Iteratoriter=keySet.
iterator();while(iter.
hasNext()){Stringkey=iter.
next();Stringvalue=sortedMap.
get(key)[0];strBuffer.
append("&").
append(key).
append("=").
append(value);}//修正消息体,去除第一个参数前面的&StringreqParams=strBuffer.
toString().
substring(1);Stringkey=accessKey+timeStamp;Stringsignature=null;try{signature=generateResponseBodySignature(key,reqParams);}catch(InvalidKeyException|NoSuchAlgorithmException|IllegalStateException|UnsupportedEncodingExceptione){//TODOAuto-generatedcatchblock}returnauthToken.
equals(signature);}publicstaticStringgenerateResponseBodySignature(Stringkey,Stringbody)throwsInvalidKeyException,NoSuchAlgorithmException,IllegalStateException,UnsupportedEncodingException{returnbase_64(hmacSHA256(key,body));}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司41publicstaticbyte[]hmacSHA256(StringmacKey,StringmacData){try{try{SecretKeySpecsecret=newSecretKeySpec(macKey.
getBytes(CHARSET),"HmacSHA256");Macmac=Mac.
getInstance("HmacSHA256");mac.
init(secret);returnmac.
doFinal(macData.
getBytes(CHARSET));}catch(UnsupportedEncodingExceptione){}catch(InvalidKeyExceptione){}}catch(NoSuchAlgorithmExceptione){}returnnewbyte[0];}//服务商body签名publicstaticStringgenerateSaaSUsernameOrPwd(StringisvBody,StringdecryptAccessKey,StringsEncryptType){Stringiv=getRandomChars(16);intiEncryptType=0;try{iEncryptType=Integer.
parseInt(sEncryptType);}catch(NumberFormatExceptionexception){iEncryptType=1;}intencryptType;if(1==iEncryptType){encryptType=256;}else{encryptType=128;}StringisvEncryptBody=encryptAESCBCEncode(isvBody,decryptAccessKey,iv,encryptType);华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司42returniv+isvEncryptBody;}/***AESCBC256位加密**@paramcontent加密内容*@paramkey加密秘钥*@paramiv加密盐值*@return加密结果*/publicstaticStringencryptAESCBCEncode(Stringcontent,Stringkey,Stringiv,intencryptType){if(StringUtils.
isEmpty(content)||StringUtils.
isEmpty(key)||StringUtils.
isEmpty(iv)){returnnull;}try{byte[]encrypContent=encryptAESCBC(content.
getBytes(CHARSET),key.
getBytes(CHARSET),iv.
getBytes(CHARSET),encryptType);if(null!
=encrypContent){returnbase_64(encrypContent);}else{returnnull;}}catch(UnsupportedEncodingExceptione){returnnull;}}publicstaticbyte[]encryptAESCBC(byte[]content,byte[]keyBytes,byte[]iv,intencryptType){try{KeyGeneratorkeyGenerator=KeyGenerator.
getInstance("AES");华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司43SecureRandomsecureRandom=SecureRandom.
getInstance("SHA1PRNG");secureRandom.
setSeed(keyBytes);keyGenerator.
init(encryptType,secureRandom);SecretKeykey=keyGenerator.
generateKey();Ciphercipher=Cipher.
getInstance("AES/CBC/PKCS5Padding");cipher.
init(Cipher.
ENCRYPT_MODE,key,newIvParameterSpec(iv));returncipher.
doFinal(content);}catch(Exceptione){}returnnull;}publicstaticStringbase_64(byte[]bytes){try{returnnewString(Base64.
encodeBase64(bytes),CHARSET);}catch(UnsupportedEncodingExceptione){returnnull;}}staticStringdecryptMobilePhoneOrEMail(StringaccessKey,StringencryptStr,StringsEncryptType){Stringiv=encryptStr.
substring(0,16);intiEncryptType=1;try{iEncryptType=Integer.
parseInt(sEncryptType);}catch(NumberFormatExceptionexception){exception.
printStackTrace();}intencryptType;if(1==iEncryptType){encryptType=256;}else{encryptType=128;}华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司44StringdecryptBody=null;try{decryptBody=decryptAESCBCEncode(encryptStr.
substring(16),accessKey,iv,encryptType);}catch(Exceptione){e.
printStackTrace();returndecryptBody;}returndecryptBody;}publicstaticStringdecryptAESCBCEncode(Stringcontent,Stringkey,Stringiv,intencryptType)throwsInvalidKeyException,NoSuchAlgorithmException,NoSuchPaddingException,InvalidAlgorithmParameterException,IllegalBlockSizeException,BadPaddingException{if(StringUtils.
isEmpty(content)||StringUtils.
isEmpty(key)||StringUtils.
isEmpty(iv)){returnnull;}returnnewString(decryptAESCBC(org.
apache.
commons.
codec.
binary.
Base64.
decodeBase64(content.
getBytes()),key.
getBytes(),iv.
getBytes(),encryptType));}publicstaticbyte[]decryptAESCBC(byte[]content,byte[]keyBytes,byte[]iv,intencryptType)throwsNoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,InvalidAlgorithmParameterException,IllegalBlockSizeException,BadPaddingException{KeyGeneratorkeyGenerator=KeyGenerator.
getInstance("AES");SecureRandomsecureRandom=SecureRandom.
getInstance("SHA1PRNG");secureRandom.
setSeed(keyBytes);keyGenerator.
init(encryptType,secureRandom);SecretKeykey=keyGenerator.
generateKey();Ciphercipher=Cipher.
getInstance("AES/CBC/PKCS5Padding");华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司45cipher.
init(Cipher.
DECRYPT_MODE,key,newIvParameterSpec(iv));byte[]result=cipher.
doFinal(content);returnresult;}/***获取随机字符串**@paramlength字符串长度*@return*@authord00420944*/publicstaticStringgetRandomChars(intlength){StringBufferrandomCharsBuf=newStringBuffer(1024);SecureRandomrandom=newSecureRandom();for(inti=0;ibodySignisempty.
华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司46这是为什么bodySignisempty是云市场没有取到Body-Sign消息头时提示的错误消息.
调用生产接口时,ISV返回的消息头中必须有Body-Sign,而且大小写敏感,否则不能识别.
例如,消息头写成Body-sign,云市场是不能识别的.
2.
调试生产接口时,页面返回报错:httpheader->sign_typeisnotequalsHMAC-SHA256orsignatureisempty.
但是sign_type和signature都存在,这是为什么这是Body-Sign消息头中sign_type和signature的值没取到,可以看下返回给云市场的这两个值的格式正不正确.
下面是正确的格式:sign_type="HMAC-SHA256",signature="MkW2WiHUOpT4G/IFYV5kigY7djPRs3U5hOCe/EQrt8g="若这里的引号没有加,云市场不能解析出这两个值,页面就会报这个错.
3.
客户购买SaaS产品后,进入"资源中心>我的云市场>已购买的服务",单击"管理",为什么在详情页面看不到产品的用户名和密码可能的原因:–正式开通实例时,有些校验没有通过,例如用户密码的长度校验,加密之后的密文长度不能超过文档中规定的值.
–云市场解密失败.
ISV要按照云市场提供的方法进行加密,当编码语言不一致时,需要比对当前语言加密的密文结果与使用云市场提供的代码加密的密文结果是否一致.
若密文一致,还需要查看传给云市场的敏感信息加解密算法的encryptType参数是否正确传入,256加密(AES256_CBC_PKCS5Padding)时传1,128加密(AES128_CBC_PKCS5Padding)时传2.
4.
为什么服务商用云市场传过来的请求参数加密出来的authToken值与云市场传过来的authToken值不一致请求的URL串中的参数都经过了url编码,不能直接用来生成authToken.
应先将每一个参数url解码(其中客户的手机号和邮箱解码后是加密后的密文,不用解密),用解码后的参数来生成authToken.
5.
用户名密码的长度限制是对明文的限制还是密文的限制对密文值(包含向量iv)的限制.
为了避免服务商开通实例成功,但是云市场对用户名密码长度校验失败,导致商品在云市场"我的应用>已购买应用"页面展示开通中,建议服务商对加密后的用户名密码做长度校验.
6.
客户购买SaaS类商品支付成功后,云市场调用服务商新购商品接口开通实例失败,并且已经达到调用次数上限,ISV应该怎么处理才能再次开通找到开通实例失败的原因并作出修改后,然后登录卖家中心,选择左侧导航栏的"交易管理>生产接口消息",在右侧页面单击"重新启动".
7.
ISV遇到解决不了的SaaS类商品接入问题怎么办可通过邮箱partner@huaweicloud.
com反馈,邮件中需包含问题详细描述及问题相关截图,运营经理每天都会查看,并在两个工作日内给出反馈.
8.
代码示例是Java语言,如果服务商使用的开发语言不是Java,该怎么处理–服务商可以调试SaaS类商品接入指南中提供的代码,在调试自己所用开发语言时,可以对照参考.
–同时需要联系云市场运营提供自己所需开发语言的实例代码.
9.
服务商在应用接入调试页面完成新购商品接口的调试就可以了吗为了确保新购商品后续续费、过期、释放等业务的正常进行,请务必将新购、续费、过期、释放接口都调试通过,再发布SaaS产品.
10.
应用接入调试的敏感信息加密算法,在发布SaaS产品时是在哪里定义的华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司47在SaaS产品发布页面,勾选"需要用户授权"的选项时,会显示敏感信息加密算法,默认选择AES256_CBC_PKCS5Padding,用户可以根据自己需要选择加密算法.
11.
新购商品接口在应用接入调试通过了,用户购买时却调用失败,该怎么办a.
登录卖家中心,左侧导航栏选择"应用接入>应用接入调试",使用用户购买时云市场发送的真实请求和返回给云市场的真实消息体,在应用接入调试页面调试.
b.
如果调试通过,选择"交易管理>生产接口消息",单击对应记录右侧的"重新启动".
反之,则联系运营经理处理.
12.
同一个商品发布时,针对不同接口(新购、续费、过期和释放),是否可提供多个生产系统地址不可以,当前针对同一个商品,在发布时,只能配置一个"生产系统接口地址".
1.
9文档修订记录修订记录发布日期第七次正式发布本次变更说明如下:新增章节1.
2接口说明.
1.
6接口调试中步骤5增加关于发布按次商品的说明.
1.
8常见问题中新增FAQ12.
2019-08-02第六次正式发布本次变更说明如下:1.
6接口调试中步骤4增加扩展参数介绍.
1.
4.
1新购商品新增请求参数saasExtendParams.
2019-07-04第五次正式发布本次变更说明如下:1.
6接口调试中增加步骤5.
2019-04-26第四次正式发布本次变更说明如下:1.
1接入流程中对华为云云市场首页域名进行变更.
2018-07-12华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司48修订记录发布日期第三次正式发布本次变更说明如下:1.
4.
1新购商品新增请求参数skuCode、trialFlag,修改请求参数productId、testFlag.
1.
4.
2商品续费新增请求参数productId、trialToFormal,修改请求参数testFlag.
1.
4.
3商品过期修改请求参数testFlag.
1.
4.
4商品资源释放修改请求参数testFlag.
2018-05-14第二次正式发布本次变更说明如下:1.
8常见问题中增加FAQ8-FAQ11.
2018-03-30第一次正式发布2018-02-01华为云云市场接入指南1SaaS类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司492API类商品接入指南2.
1简介2.
2按量计费产品接入流程2.
3接口使用方法2.
4公共参数2.
5接口兼容性声明2.
6业务计量数据推送2.
7计量数据推送请求和响应处理(代码示例)2.
8常见问题2.
9文档修订记录2.
1简介API类商品接入到华为云云市场,需要先在华为云API网关发布API服务,整体接入说明如下:API产品支持按API调用次数计费和按量计费.
如果API产品是按照API调用后消耗的ISV业务服务资源来计费,需要ISV将租户的业务资源使用量信息通过2.
6业务计量数据推送接口推送给云市场,华为云云市场再对租户账户进行扣费.
1.
参考2.
2按量计费产品接入流程,发布API商品,选择计费方式为"按需计费",配置按量计费价格信息.
2.
参考2.
2按量计费产品接入流程和2.
6业务计量数据推送接口描述,推送业务使用量数据给云市场.
2.
2按量计费产品接入流程华为云云市场支持API类商品按量计费模式.
按量计费模式是指租户可以在华为云云市场免费开通按量计费API类商品规格,ISV统计租户调用API在ISV后台服务消耗相关资源的使用量,定期汇总之后,调用华为云云华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司50市场开放接口推送给华为云云市场,华为云云市场获取数据后对租户的华为云账户进行扣费.
说明单个租户针对单个商品规格,仅允许开通一次.
ISV在卖家中心发布API商品时,可以同时发布多个规格;单个规格可以选择两种计费模式之一,分别是按需计费、按次计费;按需计费模式又可选择多个计费维度.
当租户调用API时,ISV可以把这些维度的使用量数据,通过调用华为云云市场开放接口,推送给华为云云市场,华为云云市场对租户账户扣费.
当租户账户欠费时,华为云云市场会暂停租户API调用权限.
当租户缴清欠款后,华为云云市场会自动恢复该租户API调用权限.
API类商品接入云市场流程如下图所示:流程说明如下:1.
申请入驻云市场,成为服务商.
2.
云市场运营人员审核公司的资质信息.
3.
开通华为云API网关服务,创建API分组,开放业务能力.
4.
对于按量计费API产品,ISV服务需要具备业务使用量数据统计保存能力.
5.
在卖家中心申请发布API产品,新增规格,选择按需计费方式,配置价格信息.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司51说明创建API分组时,仅支持创建共享版的API分组.
ISV调试时,新增价格较低的API按需规格(例如,0.
01元/小时)进行测试,以免测试账户产生大额消费.
6.
云市场运营人员确认计量数据推送接口对接完成,审批通过后产品发布成功.
7.
对于按量计费API产品,根据本接入指南开发代码,调用业务使用量数据推送接口.
8.
自助验证按量计费和按次计费API产品开通、使用和扣费整体流程.
2.
3接口使用方法2.
3.
1使用方法华为云API符合RESTfulAPI设计理论.
REST从资源的角度观察整个网络,分布在各处的资源由URI(UniformResourceIdentifier)确定,客户端的应用通过URL(UnifiedResourceLocator)获取资源.
URL的一般格式为:https://Endpoint/uri.
URL中的参数说明如表2-1所示.
表2-1URL中的参数说明参数描述EndpointWeb服务入口点的URL,云市场的Endpoint为"mkt.
myhuaweicloud.
com".
uri资源路径,也即API访问路径.
从具体接口的URI模块获取,例如"v1.
0/{partner_id}/billing/bill-mgr/push-usage-data".
其中,uri中的用户标识参数说明如下:使用"partner_id"标识,表示该接口只能使用合作伙伴(ISV)自身的AK/SK或者Token调用.
华为云接口采用HTTP传输协议,有如下约束条件:1.
请求/响应报文使用JSON报文UTF-8字符集编码.
2.
媒体类型表示为Application/json.
3.
可选参数在消息体中可以不编码.
4.
接口请求参数和响应参数中时间格式统一为UTC时间(包括时区),格式为yyyyMMdd'T'HHmmss'Z'.
其中,HH范围是0~23,mm和ss范围是0~59.
2.
3.
2接口调用流程接口调用的流程为:华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司521.
获取AK/SK认证调用接口前,请获取请求认证,并将认证字段填充至下一步中的方法中,进行请示构建,实现请求的认证.
调用接口采用AK/SK认证方式.
AK/SK认证:通过AK(AccessKeyID)/SK(SecretAccessKey)加密调用请求.
通过API网关向下层服务发送请求时,必须使用AK(AccessKeyID)、SK(SecretAccessKey)对请求进行签名.
–AK(AccessKeyID):访问密钥ID.
与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名.
–SK(SecretAccessKey):与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改.
2.
构造请求方法填充请求参数构建请求方法.
3.
发起请求4.
解析消息响应2.
3.
3获取AK/SK认证2.
3.
3.
1生成AK、SK1.
注册并登录管理控制台.
2.
单击用户名,在下拉列表中单击"我的凭证".
3.
单击"管理访问密钥".
4.
单击"新增访问密钥",进入"新增访问密钥"页面.
5.
输入短信验证码,单击"确定",下载密钥,请妥善保管.
2.
3.
3.
2请求签名流程第三方应用对华为云API的访问需经过签名认证.
签名前的准备1.
下载API网关签名工具.
请单击此处下载后,解压下载的压缩包.
2.
创建java工程,将解压出来的jar引用到依赖路径中.
签名过程1.
创建用于签名的请求com.
cloud.
sdk.
DefaultRequest(JAVA).
2.
设置DefaultRequest的目标APIURL、HTTPS方法、内容等信息.
3.
对DefaultRequest进行签名:a.
调用SignerFactory.
getSigner(StringserviceName,StringregionName)获取一个签名工具实现的实例.
b.
调用Signer.
sign(Requestrequest,Credentialscredentials)对步骤1创建的请求进行签名.
以下代码展示了这个步骤:华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司53//选用签名算法,对请求进行签名Signersigner=SignerFactory.
getSigner(serviceName,region);//对请求进行签名,request会发生改变signer.
sign(request,newBasicCredentials(this.
ak,this.
sk));4.
把上步中签名产生的request转换为一个适合发送的请求,并将签名后request中的header信息放入新的request中.
5.
以ApacheHttpClient为例,需要把DefaultRequest转换为HttpRequestBase,把签名后的DefaultRequest的header信息放入HttpRequestBase中.
6.
具体过程请查看2.
3.
3.
3示例代码中的AccessServiceImpl.
java.
2.
3.
3.
3示例代码如下代码展示了如何对一个请求进行签名,并通过HTTPClient发送一个HTTPS请求的过程.
代码分成三个类进行演示:AccessService:抽象类,将GET/POST/PUT/DELETE归一成access方法.
Demo:运行入口,模拟用户进行GET/POST/PUT/DELETE请求.
AccessServiceImpl:实现access方法,具体与API网关通信的代码都在access方法中.
下面示例代码中的region请参考地区和终端节点.
serviceName为"CBCOpenAPI",如有其他取值,会在具体接口的功能介绍中说明.
AccessService.
java:packagecom.
cloud.
apigateway.
sdk.
demo;importjava.
io.
InputStream;importjava.
net.
URL;importjava.
util.
Map;importorg.
apache.
http.
HttpResponse;importcom.
cloud.
sdk.
http.
HttpMethodName;publicabstractclassAccessService{protectedStringserviceName=null;protectedStringregion=null;protectedStringak=null;protectedStringsk=null;publicAccessService(StringserviceName,Stringregion,Stringak,Stringsk){this.
region=region;this.
serviceName=serviceName;this.
ak=ak;this.
sk=sk;}publicabstractHttpResponseaccess(URLurl,Map<String,String>header,InputStreamcontent,LongcontentLength,HttpMethodNamehttpMethod)throwsException;publicHttpResponseaccess(URLurl,Map<String,String>header,HttpMethodNamehttpMethod)throwsException{returnthis.
access(url,header,null,0l,httpMethod);}华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司54publicHttpResponseaccess(URLurl,InputStreamcontent,LongcontentLength,HttpMethodNamehttpMethod)throwsException{returnthis.
access(url,null,content,contentLength,httpMethod);}publicHttpResponseaccess(URLurl,HttpMethodNamehttpMethod)throwsException{returnthis.
access(url,null,null,0l,httpMethod);}publicabstractvoidclose();publicStringgetServiceName(){returnserviceName;}publicvoidsetServiceName(StringserviceName){this.
serviceName=serviceName;}publicStringgetRegion(){returnregion;}publicvoidsetRegion(Stringregion){this.
region=region;}publicStringgetAk(){returnak;}publicvoidsetAk(Stringak){this.
ak=ak;}publicStringgetSk(){returnsk;}publicvoidsetSk(Stringsk){this.
sk=sk;}}Demo.
java:packagecom.
cloud.
apigateway.
sdk.
demo;importjava.
io.
BufferedReader;importjava.
io.
ByteArrayInputStream;importjava.
io.
IOException;importjava.
io.
InputStream;importjava.
io.
InputStreamReader;importjava.
net.
MalformedURLException;importjava.
net.
URL;importorg.
apache.
http.
HttpResponse;importcom.
cloud.
sdk.
http.
HttpMethodName;publicclassDemo{//replacerealregionprivatestaticfinalStringregion="regionName";//replacerealservicenameprivatestaticfinalStringserviceName="serviceName";华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司55publicstaticvoidmain(String[]args){//replacerealAKStringak="akString";//replacerealSKStringsk="skString";//getmethod//replacerealurlStringurl="urlString";get(ak,sk,url);//postmethod//replacerealurlStringpostUrl="urlString";//replacerealbodyStringpostbody="bodyString";post(ak,sk,postUrl,postbody);//putmethod//replacerealbodyStringputbody="bodyString";//replacerealurlStringputUrl="urlString";put(ak,sk,putUrl,putbody);//deletemethod//replacerealurlStringdeleteUrl="urlString";delete(ak,sk,deleteUrl);}publicstaticvoidput(Stringak,Stringsk,StringrequestUrl,StringputBody){AccessServiceaccessService=null;try{accessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=newURL(requestUrl);HttpMethodNamehttpMethod=HttpMethodName.
PUT;InputStreamcontent=newByteArrayInputStream(putBody.
getBytes());HttpResponseresponse=accessService.
access(url,content,(long)putBody.
getBytes().
length,httpMethod);System.
out.
println(response.
getStatusLine().
getStatusCode());}catch(Exceptione){e.
printStackTrace();}finally{accessService.
close();}}publicstaticvoidpatch(Stringak,Stringsk,StringrequestUrl,StringputBody){AccessServiceaccessService=null;try{accessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=newURL(requestUrl);HttpMethodNamehttpMethod=HttpMethodName.
PATCH;InputStreamcontent=newByteArrayInputStream(putBody.
getBytes());HttpResponseresponse=accessService.
access(url,content,(long)putBody.
getBytes().
length,httpMethod);华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司56System.
out.
println(convertStreamToString(response.
getEntity().
getContent()));}catch(Exceptione){e.
printStackTrace();}finally{accessService.
close();}}publicstaticvoiddelete(Stringak,Stringsk,StringrequestUrl){AccessServiceaccessService=null;try{accessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=newURL(requestUrl);HttpMethodNamehttpMethod=HttpMethodName.
DELETE;HttpResponseresponse=accessService.
access(url,httpMethod);System.
out.
println(convertStreamToString(response.
getEntity().
getContent()));}catch(Exceptione){e.
printStackTrace();}finally{accessService.
close();}}publicstaticvoidget(Stringak,Stringsk,StringrequestUrl){AccessServiceaccessService=null;try{accessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=newURL(requestUrl);HttpMethodNamehttpMethod=HttpMethodName.
GET;HttpResponseresponse;response=accessService.
access(url,httpMethod);System.
out.
println(convertStreamToString(response.
getEntity().
getContent()));}catch(Exceptione){e.
printStackTrace();}finally{accessService.
close();}}publicstaticvoidpost(Stringak,Stringsk,StringrequestUrl,Stringpostbody){AccessServiceaccessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=null;try{url=newURL(requestUrl);}catch(MalformedURLExceptione){e.
printStackTrace();}InputStreamcontent=newByteArrayInputStream(postbody.
getBytes());HttpMethodNamehttpMethod=HttpMethodName.
POST;HttpResponseresponse;try{response=accessService.
access(url,content,(long)postbody.
getBytes().
length,httpMethod);System.
out.
println(convertStreamToString(response.
getEntity()华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司57.
getContent()));}catch(Exceptione){e.
printStackTrace();}finally{accessService.
close();}}privatestaticStringconvertStreamToString(InputStreamis){BufferedReaderreader=newBufferedReader(newInputStreamReader(is));StringBuildersb=newStringBuilder();Stringline=null;try{while((line=reader.
readLine())!
=null){sb.
append(line+"\n");}}catch(IOExceptione){e.
printStackTrace();}finally{try{is.
close();}catch(IOExceptione){e.
printStackTrace();}}returnsb.
toString();}}AccessServiceImpl.
java:packagecom.
cloud.
apigateway.
sdk.
demo;importjava.
io.
IOException;importjava.
io.
InputStream;importjava.
net.
URISyntaxException;importjava.
net.
URL;importjava.
util.
HashMap;importjava.
util.
Map;importjavax.
net.
ssl.
SSLContext;importorg.
apache.
http.
Header;importorg.
apache.
http.
HttpHeaders;importorg.
apache.
http.
HttpResponse;importorg.
apache.
http.
client.
methods.
HttpDelete;importorg.
apache.
http.
client.
methods.
HttpGet;importorg.
apache.
http.
client.
methods.
HttpHead;importorg.
apache.
http.
client.
methods.
HttpPatch;importorg.
apache.
http.
client.
methods.
HttpPost;importorg.
apache.
http.
client.
methods.
HttpPut;importorg.
apache.
http.
client.
methods.
HttpRequestBase;importorg.
apache.
http.
conn.
ssl.
AllowAllHostnameVerifier;importorg.
apache.
http.
conn.
ssl.
SSLConnectionSocketFactory;importorg.
apache.
http.
conn.
ssl.
SSLContexts;importorg.
apache.
http.
conn.
ssl.
TrustSelfSignedStrategy;importorg.
apache.
http.
entity.
InputStreamEntity;importorg.
apache.
http.
impl.
client.
CloseableHttpClient;importorg.
apache.
http.
impl.
client.
HttpClients;importcom.
cloud.
sdk.
DefaultRequest;importcom.
cloud.
sdk.
Request;importcom.
cloud.
sdk.
auth.
credentials.
BasicCredentials;importcom.
cloud.
sdk.
auth.
signer.
Signer;importcom.
cloud.
sdk.
auth.
signer.
SignerFactory;importcom.
cloud.
sdk.
http.
HttpMethodName;华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司58publicclassAccessServiceImplextendsAccessService{privateCloseableHttpClientclient=null;publicAccessServiceImpl(StringserviceName,Stringregion,Stringak,Stringsk){super(serviceName,region,ak,sk);}/**{@inheritDoc}*/publicHttpResponseaccess(URLurl,Map<String,String>headers,InputStreamcontent,LongcontentLength,HttpMethodNamehttpMethod)throwsException{//Makearequestforsigning.
Requestrequest=newDefaultRequest(this.
serviceName);try{//Settherequestaddress.
request.
setEndpoint(url.
toURI());StringurlString=url.
toString();Stringparameters=null;if(urlString.
contains("")){parameters=urlString.
substring(urlString.
indexOf("")+1);Mapparametersmap=newHashMap<String,String>();if(null!
=parameters&&!
"".
equals(parameters)){String[]parameterarray=parameters.
split("&");for(Stringp:parameterarray){Stringkey=p.
split("=")[0];Stringvalue=p.
split("=")[1];parametersmap.
put(key,value);}request.
setParameters(parametersmap);}}}catch(URISyntaxExceptione){//Itisrecommendedtoaddlogsinthisplace.
e.
printStackTrace();}//Settherequestmethod.
request.
setHttpMethod(httpMethod);if(headers!
=null){//Addrequestheaderinformationifrequired.
request.
setHeaders(headers);}//Configuretherequestcontent.
request.
setContent(content);//Selectanalgorithmforrequestsigning.
Signersigner=SignerFactory.
getSigner(serviceName,region);//Signtherequest,andtherequestwillchangeafterthesigning.
signer.
sign(request,newBasicCredentials(this.
ak,this.
sk));//MakearequestthatcanbesentbytheHTTPclient.
HttpRequestBasehttpRequestBase=createRequest(url,null,request.
getContent(),contentLength,httpMethod);Map<String,String>requestHeaders=request.
getHeaders();//Puttheheaderofthesignedrequesttothenewrequest.
for(Stringkey:requestHeaders.
keySet()){if(key.
equalsIgnoreCase(HttpHeaders.
CONTENT_LENGTH.
toString())){continue;华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司59}httpRequestBase.
addHeader(key,requestHeaders.
get(key));}HttpResponseresponse=null;SSLContextsslContext=SSLContexts.
custom().
loadTrustMaterial(null,newTrustSelfSignedStrategy()).
useTLS().
build();SSLConnectionSocketFactorysslSocketFactory=newSSLConnectionSocketFactory(sslContext,newAllowAllHostnameVerifier());client=HttpClients.
custom().
setSSLSocketFactory(sslSocketFactory).
build();//Sendtherequest,andaresponsewillbereturned.
response=client.
execute(httpRequestBase);returnresponse;}/***MakearequestthatcanbesentbytheHTTPclient.
**@paramurl*specifiestheAPIaccesspath.
*@paramheader*specifiestheheaderinformationtobeadded.
*@paramcontent*specifiesthebodycontenttobesentintheAPIcall.
*@paramcontentLength*specifiesthelengthofthecontent.
Thisparameterisoptional.
*@paramhttpMethod*specifiestheHTTPmethodtobeused.
*@returnspecifiestherequestthatcanbesentbyanHTTPclient.
*/privatestaticHttpRequestBasecreateRequest(URLurl,Headerheader,InputStreamcontent,LongcontentLength,HttpMethodNamehttpMethod){HttpRequestBasehttpRequest;if(httpMethod==HttpMethodName.
POST){HttpPostpostMethod=newHttpPost(url.
toString());if(content!
=null){InputStreamEntityentity=newInputStreamEntity(content,contentLength);postMethod.
setEntity(entity);}httpRequest=postMethod;}elseif(httpMethod==HttpMethodName.
PUT){HttpPutputMethod=newHttpPut(url.
toString());httpRequest=putMethod;if(content!
=null){InputStreamEntityentity=newInputStreamEntity(content,contentLength);putMethod.
setEntity(entity);}}elseif(httpMethod==HttpMethodName.
PATCH){HttpPatchpatchMethod=newHttpPatch(url.
toString());httpRequest=patchMethod;if(content!
=null){InputStreamEntityentity=newInputStreamEntity(content,contentLength);patchMethod.
setEntity(entity);}}elseif(httpMethod==HttpMethodName.
GET){httpRequest=newHttpGet(url.
toString());}elseif(httpMethod==HttpMethodName.
DELETE){httpRequest=newHttpDelete(url.
toString());}elseif(httpMethod==HttpMethodName.
HEAD){华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司60httpRequest=newHttpHead(url.
toString());}else{thrownewRuntimeException("UnknownHTTPmethodname:"+httpMethod);}httpRequest.
addHeader(header);returnhttpRequest;}@Overridepublicvoidclose(){try{if(client!
=null){client.
close();}}catch(IOExceptione){//Itisrecommendedtoaddlogsinthisplace.
e.
printStackTrace();}}}2.
3.
4构造请求方法每一个请求通常由三部分组成,分别是:请求行、请求消息头、请求正文(可选).
请求行请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:MethodRequest-URIHTTP-VersionCRLFMethod:表示请求方法(所有方法全为大写),各个方法的解释如下:–GET:请求获取Request-URI所标识的资源.
–POST:在Request-URI所标识的资源后附加新的数据.
–PUT:请求服务器存储一个资源,并用Request-URI作为其标识.
–DELETE:请求服务器删除Request-URI所标识的资源.
Request-URI:是一个统一资源标识符.
说明可以在URI后面用''和'&'添加不同的查询条件组合.
URI中"{}"中包含的内容为URI的参数,其中""之前的部分是路径参数,之后的部分是查询参数.
HTTP-Version:表示请求的HTTP协议版本.
CRLF:表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符).
请求消息头请求消息头由若干头域构成,每个头域由一个域名、冒号(:)和域值组成.
具体可参见2.
4.
1公共请求消息头参数.
请求正文以JSON格式封装,基本语法是嵌套式的key:value形式.
HTTP请求的正文针对不同的URI对象有不同的必须字段和可选字段.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司612.
3.
5发起请求共有三种方式可以基于已构建好的请求消息发起请求,分别为:cURLcURL是一个命令行工具,用来执行各种URL操作和信息传输.
cURL充当的是HTTP客户端,可以发送HTTP请求给服务端,并接收响应消息.
cURL适用于接口调试.
关于cURL详细信息请参见https://curl.
haxx.
se/.
编码通过编码调用接口,组装请求消息,并发送处理请求消息.
REST客户端Mozilla、Google都为REST提供了图形化的浏览器插件,发送处理请求消息.
针对Firefox,请参见FirefoxRESTClient.
针对Chrome,请从Chrome网上应用店搜索RESTClient应用.
2.
3.
6解析消息响应在接收和解释请求消息后,服务返回一个HTTP响应消息.
响应也是由三个部分组成,分别是:状态行、消息报头、响应正文.
状态行状态行格式如下:HTTP-VersionStatus-CodeReason-PhraseCRLFHTTP-Version:表示服务器HTTP协议的版本号.
Status-Code:表示服务器发回的响应状态代码.
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:–1xx:指示信息,表示请求已接收,继续处理.
–2xx:成功,表示请求已被成功接收、理解、接受.
–3xx:重定向,要完成请求必须进行更进一步的操作.
–4xx:客户端错误,请求有语法错误或请求无法实现.
–5xx:服务器端错误,服务器未能实现合法的请求.
Reason-Phrase:表示状态代码的文本描述.
响应报头响应的消息报头在大多数情况下含如表2-4所示的响应报头.
响应正文响应正文为JSON格式的文本.
2.
3.
7状态码HTTP响应状态码如表2-2所示.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司62表2-2HTTP响应状态码状态码编码错误码说明100Continue继续请求.
这个临时响应用来通知客户端,它的部分请求已经被服务器接收,且仍未被拒绝.
101SwitchingProtocols切换协议.
只能切换到更高级的协议.
例如,切换到HTTP的新版本协议.
201Created创建类的请求完全成功.
202Accepted已经接受请求,但未处理完成.
203Non-AuthoritativeInformation非授权信息,请求成功.
204NoContent请求完全成功,同时HTTP响应不包含响应体.
在响应OPTIONS方法的HTTP请求时返回此状态码.
205ResetContent重置内容,服务器处理成功.
206PartialContent服务器成功处理了部分GET请求.
300MultipleChoices多种选择.
请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择.
301MovedPermanently永久移动,请求的资源已被永久的移动到新的URI,返回信息会包括新的URI.
302Found资源被临时移动.
303SeeOther查看其它地址.
使用GET和POST请求查看.
304NotModified所请求的资源未修改,服务器返回此状态码时,不会返回任何资源.
305UseProxy所请求的资源必须通过代理访问.
306Unused已经被废弃的HTTP状态码.
400BadRequest非法请求.
建议直接修改该请求,不要重试该请求.
401Unauthorized在客户端提供认证信息后,返回该状态码,表明服务端指出客户端所提供的认证信息不正确或非法.
402PaymentRequired保留请求.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司63状态码编码错误码说明403Forbidden请求被拒绝访问.
返回该状态码,表明请求能够到达服务端,且服务端能够理解用户请求,但是拒绝做更多的事情,因为该请求被设置为拒绝访问,建议直接修改该请求,不要重试该请求.
404NotFound所请求的资源不存在.
建议直接修改该请求,不要重试该请求.
405MethodNotAllowed请求中带有该资源不支持的方法.
建议直接修改该请求,不要重试该请求.
406NotAcceptable服务器无法根据客户端请求的内容特性完成请求.
407ProxyAuthenticationRequired请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权.
408RequestTime-out服务器等候请求时发生超时.
客户端可以随时再次提交该请求而无需进行任何更改.
409Conflict服务器在完成请求时发生冲突.
返回该状态码,表明客户端尝试创建的资源已经存在,或者由于冲突请求的更新操作不能被完成.
410Gone客户端请求的资源已经不存在.
返回该状态码,表明请求的资源已被永久删除.
411LengthRequired服务器无法处理客户端发送的不带Content-Length的请求信息.
412PreconditionFailed未满足前提条件,服务器未满足请求者在请求中设置的其中一个前提条件.
413RequestEntityTooLarge由于请求的实体过大,服务器无法处理,因此拒绝请求.
为防止客户端的连续请求,服务器可能会关闭连接.
如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息.
414Request-URITooLarge请求的URI过长(URI通常为网址),服务器无法处理.
415UnsupportedMediaType服务器无法处理请求附带的媒体格式.
416Requestedrangenotsatisfiable客户端请求的范围无效.
417ExpectationFailed服务器无法满足Expect的请求头信息.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司64状态码编码错误码说明422UnprocessableEntity请求格式正确,但是由于含有语义错误,无法响应.
429TooManyRequests表明请求超出了客户端访问频率的限制或者服务端接收到多于它能处理的请求.
建议客户端读取相应的Retry-After首部,然后等待该首部指出的时间后再重试.
500InternalServerError表明服务端能被请求访问到,但是不能理解用户的请求.
501NotImplemented服务器不支持请求的功能,无法完成请求.
502BadGateway充当网关或代理的服务器,从远端服务器接收到了一个无效的请求.
503ServiceUnavailable被请求的服务无效.
建议直接修改该请求,不要重试该请求.
504ServerTimeout请求在给定的时间内无法完成.
客户端仅在为请求指定超时(Timeout)参数时会得到该响应.
505HTTPVersionnotsupported服务器不支持请求的HTTP协议的版本,无法完成处理.
2.
4公共参数2.
4.
1公共请求消息头参数表2-3公共请求消息头名称描述是否必选示例x-sdk-date请求的发生时间,格式为:yyyyMMdd'T'HHmmss'Z'.
取值为当前系统的GMT时间.
否使用AK/SK认证时必选20160629T101459ZAuthorization签名认证信息该值来源于请求签名结果.
请参考2.
3.
3.
2请求签名流程.
否使用AK/SK认证时必选-华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司65名称描述是否必选示例Host请求的服务器信息,从服务API的URL中获取.
值为hostname[:port].
端口缺省时使用默认的端口,https的默认端口为443.
否使用AK/SK认证时必选mkt.
myhuaweicloud.
comContent-type发送的实体的MIME类型.
是application/json2.
4.
2公共响应消息头参数表2-4公共响应消息头名称描述示例DateHTTP协议标准报头.
表示消息发送的时间,时间的描述格式由rfc822定义.
Mon,12Nov200715:55:01GMTServerHTTP协议标准报头.
包含了服务器用来处理请求的软件信息.
NginxContent-LengthHTTP协议标准报头.
用于指明实体正文的长度,以字节方式存储的十进制数字来表示.
xxxContent-TypeHTTP协议标准报头.
用于指明发送给接收者的实体正文的媒体类型.
application/json2.
5接口兼容性声明接口变更时,如果其V版本不变,则云市场保证接口是兼容的,如计量数据推送接口接口V1.
0版本,其URI为:POST/v1.
0/{partner_id}/billing/bill-mgr/push-usage-data,在接口修改时,如果该接口的V版本仍然为V1.
0,其URI应该保持不变,接口能够保证是兼容的.
如果该接口出现不兼容的变更,则云市场会修改接口的V版本,如新的不兼容接口的URI为:POST/v1.
1/{partner_id}/billing/bill-mgr/push-usage-data.
在未通知接口调用方配合修改并已切换到新V版本的API之前,原V版本的API会继续保持可用.
注意:云市场视以下变更为兼容性变更,请接口调用方保证在出现这些类型的接口变更时,接口调用方能够自动保证兼容.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司66表2-5变更类型说明变更类型说明兼容性建议请求消息增加可选的输入参数接口的请求消息中增加可选的输入参数.
无.
响应消息增加返回参数响应消息增加返回对象,原有的返回对象增加属性等.
调用方在解析JSON消息时,需要保证JSON解析代码能够自动适配响应消息体内新增返回对象或返回码对象增加属性的情况.
增加返回码因为业务场景扩展,接口增加了新的返回码.
调用方需要自动处理新增返回码的机制,如将新增错误码按其他错误处理.
2.
6业务计量数据推送功能介绍ISV在云市场发布按量计费API产品后,租户购买(开通)按量计费API产品,并调用API进行消费,对于调用API产生的业务使用量,以视频服务的点播流量和视频转码的输出视频时长为例,业务按照流量(字节)和转码视频的时长(秒)进行计费,ISV通过接口推送使用量数据给云市场,云市场对租户账户进行扣费.
调用流程图如下:华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司67URIPOST/v1.
0/{partner_id}/billing/bill-mgr/push-usage-data参数说明请参见表2-6.
表2-6参数说明参数是否必选取值范围描述partner_idM最大长度:64合作伙伴(ISV)的ID(华为分配).
说明业务计量数据推送接口仅支持https协议.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司68请求消息表2-7请求参数参数是否必选参数类型取值范围描述usageRecordsMList-业务使用量纪录集合,UsageRecord个数不得超过100.
表2-8UsageRecord参数是否必选参数类型取值范围描述instanceIdMString64产品实例IDrecordTimeMString17使用量记录生成时间(UTC),格式为:yyyyMMdd'T'HHmmss'Z'beginTimeMString17计量开始时间(UTC),格式为:yyyyMMdd'T'HHmmss'Z'endTimeMString17计量结束时间(UTC),格式为:yyyyMMdd'T'HHmmss'Z'usageEntityMUsageEntity-计费实体集合表2-9UsageEntity参数是否必选参数类型取值范围描述DurationOLong8时长(单位:秒):按时长计费产品必选取值>0最多12位整数华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司69参数是否必选参数类型取值范围描述downStreamOLong8下行流量(单位:字节):按流量计费产品必选取值>0最多12位整数quantityOLong8使用数量(单位:个):在费用中心消费明细页面,以个为单位展示用户单位时间使用量timesOLong8使用次数(单位:次):在费用中心消费明细页面,以次为单位展示用户单位时间使用量piecesOLong8使用张数(单位:次):在费用中心消费明细页面,以张为单位展示用户单位时间使用量peakBandwidthOLong8峰值带宽(单位:bps):每日峰值带宽速度,在费用中心消费明细页面,以bps为单位展示用户单位时间(日)使用量.
storageOLong8存储空间(单位:Byte):在费用中心消费明细页面,以Byte为单位展示用户单位时间使用量.
VODTranscodeSmoothOLong8点播转码-普通-流畅(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司70参数是否必选参数类型取值范围描述VODTranscodeSDOLong8点播转码-普通-标清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeHDOLong8点播转码-普通-高清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeUCOLong8点播转码-普通-超清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeSmoothEPOLong8点播转码-感知增强-流畅(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeSDEPOLong8点播转码-感知增强-标清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeHDEPOLong8点播转码-感知增强-高清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
VODTranscodeUCEPOLong8点播转码-感知增强-超清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
externalNetworkTrafficOLong8外网流量(单位:Byte):在费用中心消费明细页面,以Byte为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司71参数是否必选参数类型取值范围描述liveVideoTranscodeSmoothOLong8直播转码-普通-流畅(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
liveVideoTranscodeSDOLong8直播转码-普通-标清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
liveVideoTranscodeHDOLong8直播转码-普通-高清(单位:秒):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
liveVideoTranscodeUCOLong8直播转码-普通-超清(单位:秒):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
liveVideoTranscodeSmoothEPOLong8直播转码-感知增强-流畅(单位:秒):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
liveVideoTranscodeSDEPOLong8直播转码-感知增强-标清(单位:秒):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
liveVideoTranscodeHDEPOLong8直播转码-感知增强-高清(单位:秒):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
liveVideoTranscodeUCEPOLong8直播转码-感知增强-超清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司72参数是否必选参数类型取值范围描述microphoneUsageDurOLong8上麦时长(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
streamMixDurSDOLong8混流时长-标清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
streamMixDurHDOLong8混流时长-高清(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
screenShotOLong8截图(单位:张):在费用中心消费明细页面,以张为单位展示用户单位时间使用量.
pornIdentifyByAlgorithmOLong8鉴黄-算法确定(单位:张):在费用中心消费明细页面,以张为单位展示用户单位时间(日)使用量.
pornIdentifyByHumanOLong8鉴黄-待用户确认(单位:张):在费用中心消费明细页面,以张为单位展示用户单位时间(日)使用量.
metadataOLong8元信息(单位:次):在费用中心消费明细页面,以次为单位展示用户单位时间使用量.
watermarkOLong8鉴黄-待用户确认(单位:次):在费用中心消费明细页面,以次为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司73参数是否必选参数类型取值范围描述videoTransEncapsOLong8转封装(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoToAudioOLong8转音频(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
liveStreamEditOLong8流拆条(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
cloudBroadcastOLong8云轮播(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
cloudSwitchboardOLong8云导播(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
cloudFastVideoEditOLong8云快编(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
otherRequestsOLong8其他请求(单位:次):在费用中心消费明细页面,以次为单位展示用户单位时间使用量.
videoTranscode_H264_4kOLong8普通-H.
264-4K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_2kOLong8普通-H.
264-2K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司74参数是否必选参数类型取值范围描述videoTranscodeH264_HDOLong8普通-H.
264-HD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_SDOLong8普通-H.
264-SD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_LDOLong8普通-H.
264-LD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_4kOLong8普通-H.
265-4K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_2kOLong8普通-H.
265-2K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscodeH265_HDOLong8普通-H.
265-HD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_SDOLong8普通-H.
265-SD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_LDOLong8普通-H.
265-LD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司75参数是否必选参数类型取值范围描述videoTranscode_H264_4k_EPOLong8感知增强-H.
264-4K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_2k_EPOLong8感知增强-H.
264-2K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscodeH264_HD_EPOLong8感知增强-H.
264-HD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_SD_EPOLong8感知增强-H.
264-SD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_LD_EPOLong8感知增强-H.
264-LD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_4k_EPOLong8感知增强-H.
265-4K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_2k_EPOLong8感知增强-H.
265-2K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscodeH265_HD_EPOLong8感知增强-H.
265-HD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司76参数是否必选参数类型取值范围描述videoTranscode_H265_SD_EPOLong8感知增强-H.
265-SD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H265_LD_EPOLong8感知增强-H.
265-LD(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_4k_AccelOLong8倍速-H.
264-4K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscode_H264_2k_AccelOLong8倍速-H.
264-2K(单位:秒):在费用中心消费明细页面,以秒为单位展示用户单位时间使用量.
videoTranscodeH264_HD_AccelOLong8倍速-H.
264-HD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscode_H264_SD_AccelOLong8倍速-H.
264-SD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscode_H264_LD_AccelOLong8倍速-H.
264-LD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscode_H265_4k_AccelOLong8倍速-H.
265-4K(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司77参数是否必选参数类型取值范围描述videoTranscode_H265_2k_AccelOLong8倍速-H.
265-2K(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscodeH265_HD_AccelOLong8倍速-H.
265-HD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscode_H265_SD_AccelOLong8倍速-H.
265-SD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
videoTranscode_H265_LD_AccelOLong8倍速-H.
265-LD(单位:分钟):在费用中心消费明细页面,以分钟为单位展示用户单位时间使用量.
请求注意事项:需要对mkt.
myhuaweicloud.
comHTTPS证书进行强校验,不能忽略证书校验,从而保证调用的是真实而非伪造的云市场服务.
华为云云市场以instanceId为维度,对计量数据推送接口进行流控(对于单个instanceId,请求频次要求1次/分钟),每次请求最大计量记录数100条.
计量记录的周期(endTime减去startTime的差值)必须=1小时,endTime和startTime必须是整点,例如:20170107T090000Z.
startTime必须大于API类产品发布上架时间,recordTime必须大于endTime,endTime必须小于当前时间.
请求示例POST/v1.
0/{partner_id}/billing/bill-mgr/push-usage-dataHost:HostServerContent-Type:application/jsonX-Sdk-Date:requesttimeAuthorization:authorization{"usageRecords":[{"instanceId":"455be31e-6771-4d6f-b8c1-7e8bdb10c21f","recordTime":"20170107T153030Z","beginTime":"20170107T090000Z","endTime":"20170107T110000Z","usageEntity":{"Duration":3524华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司78}},{"instanceId":"f98081a9-8254-41fd-a489-bb74dac3c9a5","recordTime":"20170107T155031Z","beginTime":"20170107T130000Z","endTime":"20170107T140000Z","usageEntity":{"DownStream":1073741824}},…]}响应消息表2-10响应参数参数是否必选参数类型取值范围描述resultCodeMString16结果码.
具体请参考表2-12.
resultMsgMString1024结果消息.
具体请参考表2-12.
extra_infoOExtraInfo4096附加信息.
具体请参考表2-11.
结构体表2-11ExtraInfo参数是否必选参数类型取值范围描述usageRecordOUsageRecord-业务使用量记录.
具体请参考表2-8.
productUrlOString1024业务使用量记录对应的产品链接.
当产品在售时,返回产品链接.
产品链接不需要登录即可查看.
snapshotUrlOString1024业务使用量记录对应的产品快照链接.
当产品下架时,返回产品快照链接.
产品快照链接需要登录才能查看.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司79错误码表2-12错误码http状态码error_codeerror_msg描述200CBC.
0000Success.
请求成功500CBC.
0999Systeminternalerror.
其它服务内部错误500CBC.
0100Failureofinputparameter输入参数校验失败参数范围超限,非法值或格式错误400CBC.
0101Invalidparameter参数无效输入非接口定义的参数,多参数或少必选参数400CBC.
0199Requestparametererror请求参数错误其它参数错误401CBC.
0150Illegaloperation通常是进行了不被授权的操作,例如instanceId对应的产品不是AK/SK对应的ISV发布的401CBC.
0151Noauthority无API访问权限token非ISV角色401CBC.
0154Illegaltoken鉴权失败token无效406CBC.
0250Accessfrequencyoverlimit访问频率超限500CBC.
9001InstanceIDnotfound.
实例ID不存在(商品续费、过期、资源释放接口可能返回)500CBC.
9002Invalidusageenties.
计量实体无效500CBC.
9003Usagerecordsextendssizelimit.
计量记录数超出限制(100条)500CBC.
9004RecordbeginTimeextendsLimit.
计量记录的起始时间超出有效期(当前时间21天以内)其中,仅在resultCode为CBC.
0100、CBC.
0150、CBC.
0250、CBC.
9001、CBC.
9002、CBC.
9004、CBC.
9005时,失败响应中包含extra_info字段.
失败响应中resultMsg除字段描述,还包含响应失败详情.
您可以结合失败详情和extra_info内容定位并解决问题.
成功响应示例HTTP/1.
1200OKContent-Type:application/json;charset=UTF-8华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司80Content-Length:lengthDate:responsetime{"resultCode":"CBC.
0000","resultMsg":"success"}失败响应示例HTTP/1.
1401UnauthorizedContent-Type:application/json;charset=UTF-8Content-Length:lengthDate:responsetime{"resultCode":"CBC.
0150","resultMsg":"Illegaloperation.
param[isvId]andparam[instanceId]doesnotmatch.
","extraInfo":{"usageRecord":{"instanceId":"xxxxxxxxxxxxxxxxxxxxxxxxxx","recordTime":"20180906T083929Z","beginTime":"20180906T060000Z","endTime":"20180906T070000Z","usageEntity":{"times":"2"}},"productUrl":"https://market.
huaweicloud.
com/product/00301-196117-0--0"}}2.
7计量数据推送请求和响应处理(代码示例)Java代码示例:StringserviceName="";Stringregion="";Stringak="";Stringsk="";StringpartnerId="042ffe758bba44ab9dd73f7c40c0d66b";StringmktUrl="https://mkt.
myhuaweicloud.
com/v1.
0/"+partnerId+"/billing/bill-mgr/push-usage-data";MapusageRecords=newHashMap();//封装第一条业务计量数据(根据实际情况,将此段写在循环中处理)MapusageEntity=newHashMap();usageEntity.
put("Duration","3524");MapusageRecordData1=newHashMap();usageRecordData1.
put("instanceId","455be31e-6771-4d6f-b8c1-7e8bdb10c21f");usageRecordData1.
put("recordTime","20180117T151020Z");usageRecordData1.
put("beginTime","20180117T150000Z");usageRecordData1.
put("endTime","20180117T160000Z");usageRecordData1.
put("usageEntity",usageEntity);List>usageRecordDataList=newArrayList>();usageRecordDataList.
add(usageRecordData1);usageRecords.
put("usageRecords",usageRecordDataList);//封装第二条业务计量数据,参照封装第一条业务计量数据的代码示例//…//将请求数据转成json字符串格式,并且调用接口发送到华为云云市场StringrequestMsgBody=JSON.
toJSONString(usageRecords);System.
out.
println(requestMsgBody);//构造并发送请求AccessServiceaccessService=newAccessServiceImpl(serviceName,region,ak,sk);URLurl=null;HttpResponseresponse=null;StringresponseMsgBody="";try华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司81{url=newURL(mktUrl);HttpMethodNamehttpMethod=HttpMethodName.
POST;InputStreamcontent=newByteArrayInputStream(requestMsgBody.
getBytes());response=accessService.
access(url,content,(long)requestMsgBody.
getBytes().
length,httpMethod);if(null==response){//TODO:响应异常处理return;}HttpEntityentity=response.
getEntity();if(null==entity){//TODO:响应报文读取异常处理return;}responseMsgBody=EntityUtils.
toString(entity);}catch(MalformedURLExceptione){//TODOURL异常处理return;}catch(Exceptione){//TODO其他异常处理return;}intresponseStatus=response.
getStatusLine().
getStatusCode();JSONObjectrspJsonObject=JSON.
parseObject(responseMsgBody);StringerrorCode=null;StringerrorMsg=null;if(null!
=rspJsonObject){if(rspJsonObject.
containsKey("error_code")){errorCode=rspJsonObject.
getString("error_code");}if(rspJsonObject.
containsKey("error_msg")){errorMsg=rspJsonObject.
getString("error_msg");}}else{//TODO:报文解析异常处理return;}if(null==errorCode||null==errorMsg){//TODO:参数异常处理return;}if(200==responseStatus){//TODO:业务正常处理}else{//TODO:根据error_code处理异常return;}说明partnerId即账号ID.
region取空""或者"all",serviceName取CBCOpenAPI.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司822.
8常见问题1.
如何获取请求的instanceId参数租户调用API产品接口时,API网关会自动将instanceId通过X-APIGW-MKT-INSTANCEID头域携带给ISV服务,X-APIGW-MKT-INSTANCEID即instanceId,用于标识租户购买的API产品实例,ISV服务可以将X-APIGW-MKT-INSTANCEID持久存储到接口调用信息里,产生业务使用量后,记录实例的使用量信息,再通过业务计量数据推送接口传递给云市场.
2.
instanceId的含义及与用户有什么关系,计费数据推送是怎样对用户计费的instanceId是租户购买API产品后,云市场自动生成的产品实例标识.
不同用户购买同一产品,会生成不同的实例.
isv调用计量数据推送接口,仅需要传递intanceId,云市场会自动识别instanceId归属不同的用户,根据记录的业务使用量,最终对用户计费.
3.
租户未实际产生API产品使用量,但ISV却调用接口上报计量费用,如何处理由于此问题导致的租户投诉及相关法律问题,由ISV自行承担.
4.
AK/SK更新后如何处理一般调用云市场接口所需的AK/SK信息需要以安全的方式配置保存起来,如果因为其他原因,需要刷新华为云"我的凭证"页面的AK/SK,需要同步刷新相关配置项,以保证通知接口可以正常调用.
5.
由于请求流控限制,在什么情况下,可以立即发起请求,而不需要等一分钟后对于以下错误码,不需要等到一分钟之后:CBC.
0100、CBC.
0101、CBC.
0199、CBC.
9001、CBC.
9002、CBC.
9003、CBC.
9004.
6.
最迟可以推送多长时间之前的计量数据云市场要求ISV推送的单条计量记录的beginTime必须在当前时间三周以内(21天),请求中有超过21天的计量记录,整个请求将被拒绝,视为参数错误.
7.
能否重复推送相同的计量数据调用业务计量数据推送接口,传入的计量记录的instanceId、beginTime、endTime值与之前调用该接口传入的值相同,视为重复提交的计量记录,云市场不会对租户重复计费,但会产生重复单记录,请ISV做好相关控制,计量记录推送成功后,做好相关标记,不要重复推送计量数据.
8.
如何保证业务的计量数据不丢失业务计量数据的保存,建议ISV做持久化高可用设计,发送请求推送成功后,云市场会妥善保存相关计量数据,如果计量数据记录推送失败,请做好相关记录的重发逻辑处理.
9.
ISV遇到解决不了的API类商品接入问题怎么办可通过邮箱partner@huaweicloud.
com反馈,邮件中需包含问题详细描述及问题相关截图,运营经理每天都会查看,并在两个工作日内给出反馈.
10.
ISV是否可以使用同一账号发布API产品、购买API产品接口或进行API消费调试由于实际业务场景中,ISV没有必要购买自己发布的API产品再消费,当前不支持ISV购买自己发布的API产品.
如果ISV需要进行API产品购买和计量数据推送接口调试,可以使用其他一般华为云账号进行购买及消费.
11.
计量数据推送接口的partnerId怎样获取进入华为云我的凭证页面,账号ID即是计量数据推送接口的partnerId.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司8312.
发布API商品与APIG有什么关系服务商在华为云官网申请APIG公测并且审批通过后,到控制台的API网关页面创建API分组,然后再创建API并发布后,才可以在卖家中心发布API商品.
13.
什么是API分组API分组是同一种业务API的集合,一个API分组可视为一种服务(如征信查询服务).
API开发者以API分组为单位,管理分组内的所有API.
14.
在APIG创建API分组后,在卖家中心发布API时选不到API分组服务商需要先创建API分组,然后在API分组下创建API并发布,在卖家中心发布API产品添加规格选择API分组时才能展示.
15.
举例说明计量维度的两个计费因子是怎么计费的时长是指调用时长吗,怎样理解计量维度:计费的一种维度,不同纬度的计费方式不同.
按量付费:按量付费即先使用后付费的计费模式.
您在华为云账户先充值,系统每小时统计前一小时的实际用量并进行结算,从账户余额中扣除实际消费金额.
按照时长计费:按照业务调用时长计费,例如转码业务,调用不同格式的转码均按转码时长进行计费.
按照流量计费:下行流量,例如根据播放视频时产生的下行流量消耗计费.
16.
API前缀是有什么作用API前缀为接口提供一个别名,可以理解为子域名,供买家调用.
17.
怎么发布免费商品发布产品时定价为0.
18.
如果想修改上线产品的API分组名称或调整API的接口是否必须先下线产品修改API接口必须先下线商品,修改上线产品的API分组名称不需要下线商品.
19.
上线产品中有一个规格已经被下架,这个下架规格的API分组在修改或删除的时候提示指定的API分组状态冲突.
这是为什么怎么解决是否修改下架规格中的API也必须下架产品当前,下架API商品不影响已开通客户的继续使用.
因此,下架规格的商品修改API分组时,由于该商品有用户在使用(或使用过),因此提示冲突.
解决方案:建议重新创建一个API分组.
华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司84已下架产品规格中的API不支持修改.
20.
ISV希望重新设置产品规格,发现下架所有规格后修改按钮是不可用状态,请问如何操作下架的产品不能修改,可以重新发布或者通过邮箱partner@huaweicloud.
com反馈给运营经理处理.
21.
API产品规格是否只能下线、新增,不能编辑或删除API的产品规格可以下架、新增、修改,不允许删除.
说明按需计费的API产品规格不能改价.
22.
业务计量数据推送接口中region和serviceName对应的值指的是什么region取空""或者"all",serviceName取CBCOpenAPI.
请先按照这样取值调试,如果字段澄清还有问题,可以通过邮箱partner@huaweicloud.
com反馈给运营经理处理.
2.
9文档修订记录修订记录发布日期第六次正式发布.
本次变更说明如下:表2-10中增加extra_info字段.
新增表2-11.
表2-12下增加如何结合失败详情和ExtraInfo内容定位并解决问题的相关描述;新增失败响应示例.
2018-10-18第五次正式发布.
本次变更说明如下:2.
2按量计费产品接入流程中对华为云云市场首页域名进行变更.
2018-07-12第四次正式发布.
本次变更说明如下:表2-9中UsageEntity新增参数(业务使用量类型)定义.
2018-04-26第三次正式发布.
本次变更说明如下:2.
7计量数据推送请求和响应处理(代码示例)中对region和serviceName进行说明.
2.
8常见问题中增加FAQ12-FAQ22.
2018-03-15华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司85修订记录发布日期第二次正式发布.
本次变更说明如下:2.
3.
3.
3示例代码中对serviceName进行说明.
2.
7计量数据推送请求和响应处理(代码示例)中增加partnerId的说明.
2.
8常见问题中增加FAQ2、FAQ10、FAQ11.
2018-03-01第一次正式发布2018-01-19华为云云市场接入指南2API类商品接入指南文档版本01(2021-03-25)版权所有华为技术有限公司86

湖北22元/月(昔日数据)云服务器,国内湖北十堰云服务器,首月6折

昔日数据怎么样?昔日数据新上了湖北十堰云服务器,湖北十堰市IDC数据中心 母鸡采用e5 2651v2 SSD MLC企业硬盘 rdid5阵列为数据护航 100G高防 超出防御峰值空路由2小时 不限制流量。目前,国内湖北十堰云服务器,首月6折火热销售限量30台价格低至22元/月。(注意:之前有个xrhost.cn也叫昔日数据,已经打不开了,一看网站LOGO和名称为同一家,有一定风险,所以尽量不要选择...

丽萨主机:美国CN2 GIA精品网/KVM/9折,美国原生IP,最低27元/月

丽萨主机怎么样?丽萨主机,团队于2017年成立。成立之初主要做的是 CDN 和域名等相关业务。最近开辟新领域,新增了独立服务器出租、VPS 等业务,为了保证业务质量从一开始就选择了中美之间的 CN2 GIA 国际精品网络,三网回程 CN2 GIA,电信去程 CN2 GIA + BGP 直连智能路由,联通移动去程直连,原生IP。适合对网络要求较高的用户,同时价格也比较亲民。点击进入:丽萨主机官方网站...

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

403forbidden怎么解决为你推荐
firetrap我淘宝店还是卖二单就被删,怎么回事!广东GDP破10万亿__年,我国国内生产总值(GDP)首破10万亿元.目前,我国经济总量排名世界第___位?lunwenjiance我写的论文,检测相似度是21.63%,删掉参考文献后就只有6.3%,这是为什么?杰景新特杰德特这个英雄怎么样haole018.comse.haole004.com为什么手机不能放?www.bbb551.com100bbb网站怎样上不去了66smsm.comffff66com手机可以观看视频吗?555sss.comms真的是500万像素?javlibrary.comSSPD-103的AV女主角是谁啊1!!!!求解鹤城勿扰黑龙江省的那个 城市是被叫做鹤城?
虚拟主机控制面板 cn域名注册 网游服务器租用 krypt 缓存服务器 网站挂马检测工具 蜗牛魔方 北京双线机房 刀片服务器的优势 北京双线 hkg 太原网通测速平台 免费dns解析 空间购买 空间登陆首页 中国电信测速网站 云服务器比较 脚本大全 godaddyssl 建站技术 更多