一、获取阿里云市场Key
登录服务商管理后台(msp.aliyun.com)概览页面,获取“Key 值”;Key用在验证Token是否正确。
二、验证Token
阿里云的每一条数据请求都会带上token参数,用于验证数据的有效性!
1 /// <summary> 2 /// 验证Token 3 /// </summary> 4 /// <param name="url"></param> 5 /// <param name="reqToken"></param> 6 /// <returns></returns> 7 public static bool CheckToken(Uri url, string reqToken) 8 { 9 /* 10 * token 值 11 1) 说明:token 值作为云市场与服务商之间进行安全校验必有参数,云市场每次调用服务 12 商接口的参数中都会带有 token 值。服务商根据生成规则生成 token 值,并与接口中获 13 取的 token 值进行比较。完全相同即为校验通过。 14 2) 生成规则:取所有的 http get 请求参数(排除 token),对参数名进行字典排序,在字符串的 15 最后加上你的 key,然后对整个字符串进行 md5 加密。 16 3) 举例: 17 服务商收到的调用请求数据示例: 18 http://www.isvwebsite.com?p1=1&p2=2&p3=3&token=xxxx 19 sort(P1,P2,P3); 不要加入 token 20 token 生成:”p1=1&p2=2&p3=3&key=isvkey”.toMD5() 21 */ 22 23 string key = HostManager.Config.AliyunMarketKey; 24 SortedDictionary<string, string> sortDict = GetUrlPara(url); //排序,按key的首字母从小到大排序 如 abcd...z 25 Dictionary<string, string> dict = FilterPara(sortDict); //筛选,去掉不参加的key,如sign , sign_type , token 26 string localToken = Sign(CreateLinkString(dict), "&key=" + key, "utf-8"); 27 28 return localToken == reqToken; //比较自己生成的token和参数中的token 29 }
生成签名
1 /// <summary> 2 /// 签名字符串 3 /// </summary> 4 /// <param name="prestr">需要签名的字符串</param> 5 /// <param name="key">**</param> 6 /// <param name="_input_charset">编码格式</param> 7 /// <returns>签名结果</returns> 8 public static string Sign(string prestr, string key, string _input_charset) 9 { 10 StringBuilder sb = new StringBuilder(32); 11 12 prestr = prestr + key; 13 14 MD5 md5 = new MD5CryptoServiceProvider(); 15 byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr)); 16 for (int i = 0; i < t.Length; i++) 17 { 18 sb.Append(t[i].ToString("x").PadLeft(2, '0')); 19 } 20 21 return sb.ToString(); 22 }
只有请求的token和我们自己生成的token对应,才认为是完整可靠的数据!
三、参数
阿里云通过url传递参数。如
http://master.ue.net.cn/YunMarket/AliyunReq.aspx?token=a8a7a6e1b9615b85ddaa2297d45233b4&action=createInstance&skuId=yuncode1670300001&orderBizId=5814572&aliUid=1958990661482662&accountQuantity=1&trial=false&orderId=202104434880603&package_version=yuncode1670300001&expiredOn=2019-06-09+00:00:00
token用于验证签名。action表示要执行的操作。skuId是商品规格标识,与商品唯一对应。
orderId 订单ID,orderBizId 业务ID。一个订单有多个商品时,需要分批生成,那每个单次操作就用业务ID区分!
四、新购商品,创建实例
string startDate = System.DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"); //从明天开始算起 string endDate = WebUtils.GetQueryString("expiredOn"); //过期的时间 AliyunMarketInstanceResponse response = BLL.AliyunMarket.CreateSite(req, startDate, endDate); //用于返回信息给阿里云市场 req.Status = response.instanceId == "0" ? 0 : 1; //成功的 req.BackResult = JsonUtils.ObjectToJson<AliyunMarketInstanceResponse>(response);
需要返回给阿里云的数据结构
public class AliyunMarketInstanceResponse : YunMarketResponse { /// <summary> /// 实例 ID,服务商提供的唯一标识 /// </summary> public string instanceId { get; set; } /// <summary> /// 主机信息 /// </summary> public HostInfo hostInfo { get; set; } /// <summary> /// 网站信息 /// </summary> public AppInfo appInfo { get; set; } /// <summary> /// 自定义 Key-Value 数据 /// </summary> public string info { get; set; } }
如:
{ "instanceId": "5814572", "hostInfo": { "name": "FTP登录信息", "ip": "39.108.247.1**", "innerIp": null, "username": null, "password": null, "cname": null, "tempDomain": null, "ftpUsername": "a32b29c6", "ftpPassword": "7e7ec1a501", "region": null, "beianInfo": null, "databaseInfo": null }, "appInfo": { "frontEndUrl": "http://a32b29c6.master.ue.net.cn", "adminUrl": "http://a32b29c6.master.ue.net.cn/platform/login", "username": "admin", "password": "d22***", "authUrl": "http://master.ue.net.cn/user/login?906AF91E891321B6E13C56E7C16E3172E946BB6B4483E0204A0CC2E6AE9D****" }, "info": "" }
instanceId 实例唯一标识。
创建实例(网站)成功后,需要返回给阿里云,阿里云收到后认为实例创建成功。
其它操作,如续费,销毁等,阿里云会传递此Id给服务商。
用户查看订单可以查看详情
五、其它
用户下单后,阿里云会不断的发出请求,直到服务商返回成功的信息。
更多的请查看api文档
云市场商品接入API文档
https://help.aliyun.com/knowledge_detail/37986.html