一、获取阿里云市场Key
登录服务商管理后台(msp.aliyun.com)概览页面,获取“Key 值”;Key用在验证Token是否正确。
二、验证Token
阿里云的每一条数据请求都会带上token参数,用于验证数据的有效性!
/// <summary>
/// 验证Token
/// </summary>
/// <param name="url"></param>
/// <param name="reqToken"></param>
/// <returns></returns>
public static bool CheckToken(Uri url, string reqToken)
{
/*
* token 值
1) 说明:token 值作为云市场与服务商之间进行安全校验必有参数,云市场每次调用服务
商接口的参数中都会带有 token 值。服务商根据生成规则生成 token 值,并与接口中获
取的 token 值进行比较。完全相同即为校验通过。
2) 生成规则:取所有的 http get 请求参数(排除 token),对参数名进行字典排序,在字符串的
最后加上你的 key,然后对整个字符串进行 md5 加密。
3) 举例:
服务商收到的调用请求数据示例:
http://www.isvwebsite.com?p1=1&p2=2&p3=3&token=xxxx
sort(P1,P2,P3); 不要加入 token
token 生成:”p1=1&p2=2&p3=3&key=isvkey”.toMD5()
*/
string key = HostManager.Config.AliyunMarketKey;
SortedDictionary<string, string> sortDict = GetUrlPara(url); //排序,按key的首字母从小到大排序 如 abcd...z
Dictionary<string, string> dict = FilterPara(sortDict); //筛选,去掉不参加的key,如sign , sign_type , token
string localToken = Sign(CreateLinkString(dict), "&key=" + key, "utf-8");
return localToken == reqToken; //比较自己生成的token和参数中的token
}
生成签名
/// <summary>
/// 签名字符串
/// </summary>
/// <param name="prestr">需要签名的字符串</param>
/// <param name="key">密钥</param>
/// <param name="_input_charset">编码格式</param>
/// <returns>签名结果</returns>
public static string Sign(string prestr, string key, string _input_charset)
{
StringBuilder sb = new StringBuilder(32);
prestr = prestr + key;
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr));
for (int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
只有请求的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