标签:
其实自己在撸这篇文章之前,就已经一直想要在博客园上写写博,奈何自己是个菜鸟,且从来没写过博,所以一直拖着,现在有些空闲时间,所以撸篇文章给从来没接触过开放平台的朋友走个捷径。
所以在正式介绍之前,先熟悉熟悉现在开放平台用的最多的Oauth2.0协议,建议这篇文章,自己读过后感觉非常好。http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
所以看过上面那篇文章之后,应该了解到,在开放平台的调用中,无非就是这么一个过程。
以上如图,其实很简单,只要滤清楚就好。
以下便开始具体的调用过程:
1.首先需在阿里巴巴开放平台(http://open.1688.com/)上Get一个开发者账号。
2.其次在自己的开发者账号中Get若干的客户端。得到对应的AppKey和AppSecretKey
3.有了上面这些,我们就要开始向服务器发送请求了。
4.所以打开vs,新建一个Dos程序,填入如下代码:
1 static void Main(string[] args) 2 { 3 //通过执行以下代码获得用户授权地址 4 GetAuthUrl(); 5 } 6 7 public static string GetAuthUrl() 8 { 9 10 //1.根据已有的appkey:appAppSecretKey开始请求code 11 var model = GetAppModel(); 12 //2.新建一个数组加入需要的参数 13 var dics = new Dictionary<string, string>(); 14 dics.Add("client_id", model.AppKey); 15 dics.Add("site", "china"); 16 dics.Add("redirect_uri", "http://localhost:51006/Test/Authroize?state=" + model.AppKey); 17 18 var str = Sign(string.Empty, dics, model.AppSecreKey); 19 //拼接出用户登录连接 20 var url = 21 "http://gw.open.1688.com/auth/authorize.htm?" + 22 "client_id=" + model.AppKey + 23 "&site=china&redirect_uri=http://localhost:51006/Test/Authroize?state=" + model.AppKey + 24 "&_aop_signature=" + 25 str; 26 return SeedHttpRequest(url); 27 } 28 /// <summary> 29 /// 发送http请求 30 /// </summary> 31 /// <param name="url">请求的url</param> 32 /// <returns></returns> 33 static string SeedHttpRequest(string url) 34 { 35 var req = (HttpWebRequest)WebRequest.Create(url); 36 try 37 { 38 using (var hwr = (HttpWebResponse)req.GetResponse()) 39 { 40 using (var sr = new StreamReader(hwr.GetResponseStream(), Encoding.UTF8)) 41 { 42 return sr.ReadToEnd(); 43 } 44 } 45 } 46 catch 47 { 48 return "出错:Url" + url; 49 } 50 } 51 /// <summary> 52 /// 此方法为阿里巴巴参数戳加密方法 53 /// </summary> 54 /// <param name="urlPath"></param> 55 /// <param name="paramDic"></param> 56 /// <param name="secretKey"></param> 57 /// <returns></returns> 58 static string Sign(string urlPath, Dictionary<string, string> paramDic, string secretKey = null) 59 { 60 if (string.IsNullOrEmpty(secretKey)) 61 { 62 return null; 63 } 64 byte[] signatureKey = Encoding.UTF8.GetBytes(secretKey);//此处用自己的签名密钥 65 List<string> list = new List<string>(); 66 foreach (KeyValuePair<string, string> kv in paramDic) 67 { 68 list.Add(kv.Key + kv.Value); 69 } 70 list.Sort(); 71 string tmp = urlPath; 72 foreach (string kvstr in list) 73 { 74 tmp = tmp + kvstr; 75 } 76 77 HMACSHA1 hmacsha1 = new HMACSHA1(signatureKey); 78 hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(tmp)); 79 80 byte[] hash = hmacsha1.Hash; 81 return BitConverter.ToString(hash).Replace("-", string.Empty).ToUpper(); 82 } 83 static MyClass GetAppModel() 84 { 85 return new MyClass(); 86 } 87 }
5.这个时候我们已经Get到一个用户授权页面的地址了。
出现如下界面:
这个时候让用户输入账号之后,页面就会被重定向至之前app的返回地址。并把code和state传给此返回地址,
然后我们在此程序中再次加入一个方法,用于获得访问令牌和刷新令牌
private string GetUserBase(AppInfo model,string code) { string loginUrl = "https://gw.open.1688.com/openapi/http/1/system.oauth2/getToken/" + model.AppKey; var parameters = new Dictionary<string, string>(); parameters.Add("grant_type", "authorization_code"); parameters.Add("need_refresh_token", "true"); parameters.Add("client_id", model.AppKey); parameters.Add("client_secret", model.AppSecretKey); parameters.Add("redirect_uri", "http://localhost:51006/Test/Index"); parameters.Add("code", code); //此处的必须发送https请求 return GetSeedPostHttpData(loginUrl, parameters); }
经过这个方法执行之后,我们已经Get该用户的基本信息,访问令牌的过期时间为9小时,刷新令牌过期时间为半年
详细的调接口方式,就不赘述了。
详细请见:http://open.1688.com/doc/api/cn/sys_auth.htm?ns=cn.alibaba.open#
标签:
原文地址:http://www.cnblogs.com/TznBlog/p/4383345.html