C# 淘宝商品微信返利助手开发-(五)返利助手开发(3)淘口令如何通过API转换为链接

系列教程一目录:返利助手原理

系列教程二目录:返利助手开放文档以及帐号申请地址

系列教程三目录:返利助手开发(1)API介绍

系列教程四目录:返利助手开发(2)淘宝分享的内容如何只取淘口令

系列教程五目录:返利助手开发(3)淘口令如何通过API转换为链接

系列教程六目录:返利助手开发(4)如果通过淘口令解析的出来的地址获得返利信息

系列教程七目录:返利助手开发(5)如何将优惠券地址转为淘口令

系列教程八目录:微信号对接

系列教程九目录:编写一个vue页面用于复制淘口令

系列教程十目录:其他

#通过上分分享我们知道了如何通过方法来只取到淘口令的值,这时候我们如何通过淘口令解析出商品的链接呢
API文档
其实淘宝有API来把淘口令转换为链接并取到商品ID
淘口令API.png
在开始API编写前我在最开始的编写过程中没有加入公众参数导致后面一直请求API失败,虽然本章内容是要讲解taobao.tbk.tpwd.convert这个接口但是所有API都得传入公共参数这个内容,所以在本章中我觉得先讲解公众参数的封装以便后面的快速调用

公共参数.png
展开公众参数我们发现里面有一堆东西这里可能有人难道就大了,我这里把里面的内容做整理
封装了一个实体类来存储这里东西一些固定的东西我已经赋值了

  public class initdata
    {
        public String method { get; set; }
        public String app_key { get; set; }
        public String target_app_key { get; set; }
        public String sign_method { get; set; } = "md5";
        public String session { get; set; }
        public String timestamp { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo);
        public String format { get; set; } = "json";
        public String v { get; set; } = "2.0";
        public String partner_id { get; set; } = "top-apitools";
        public Boolean simplify { get; set; }
    }

写到这里有细心的朋友已经法相了这里还有一个必传的内容我没有写那就是sign这个字段
为什么我没有把sign字段写进来呢因为我们看sign的算法介绍
Sign.png
Sign这个字段是需要将公众参数和业务参数,全部通过ASCII码排序过后
然后拼接,拼接后的值再拿去md5加密再hmac密码

既然每次都要都这麻烦的话我们把方法给封装一下

 public class AppUtil
    {
        /// <summary>
        /// 将参数排序组装
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string BuildParamStr(Dictionary<string, string> param)
        {
            if (param == null || param.Count == 0)
            {
                return "";
            }
            Dictionary<string, string> ascDic = param.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
            StringBuilder sb = new StringBuilder();
            foreach (var item in ascDic)
            {
                if (!string.IsNullOrEmpty(item.Value))
                {
                    sb.Append(item.Key).Append("=").Append(item.Value).Append("&");
                }
                
            }

            return sb.ToString().Substring(0,sb.ToString().Length-1);
        }

        public static string signParam(Dictionary<string, string> param, string appkey)
        {
            if (param == null || param.Count == 0)
            {
                return "";
            }
            param.Add("key", appkey);
            string blankStr = BuildParamStr(param);
            return MD5Encrypt(blankStr);

        }


        /// <summary>
        /// 将实体转化为json
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string ObjectToJson(object o)
        {
            string json = JsonConvert.SerializeObject(o);
            return json;
        }


        /// <summary>
        /// md5加签
        /// </summary>
        /// <param name="strText"></param>
        /// <returns></returns>
        public static string MD5Encrypt(string strText)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] result = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strText));
            // 第四步:把二进制转化为大写的十六进制
            StringBuilder results = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                results.Append(result[i].ToString("X2"));
            }

            return results.ToString();
        }
        public static string SignTopRequest(IDictionary<string, string> parameters, string secret, string signMethod)
        {
            // 第一步:把字典按Key的字母顺序排序
            IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
            IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

            // 第二步:把所有参数名和参数值串在一起
            StringBuilder query = new StringBuilder();
            if (Constants.SIGN_METHOD_MD5.Equals(signMethod))
            {
                query.Append(secret);
            }
            while (dem.MoveNext())
            {
                string key = dem.Current.Key;
                string value = dem.Current.Value;
                if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
                {
                    query.Append(key).Append(value);
                }
            }

            // 第三步:使用MD5/HMAC加密
            byte[] bytes;
            if (Constants.SIGN_METHOD_HMAC.Equals(signMethod))
            {
                HMACMD5 hmac = new HMACMD5(Encoding.UTF8.GetBytes(secret));
                bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
            }
            else
            {
                query.Append(secret);
                MD5 md5 = MD5.Create();
                bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));
            }

            // 第四步:把二进制转化为大写的十六进制
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                result.Append(bytes[i].ToString("X2"));
            }

            return result.ToString();
        }

       
    }

这样我们通过调用 AppUtil的 SignTopRequest方法就可以得到sign值了,可能这里每次都要反复写公共直还是有点麻烦我们进一步封装一下

  private Dictionary<string, string> buildBasicParam(initdata rsp)
        {
            Dictionary<string, string> param = new Dictionary<string, string>();
            if (!String.IsNullOrEmpty(rsp.method))
            {
                param.Add("method", rsp.method);
            }
            if (!String.IsNullOrEmpty(rsp.app_key))
            {
                param.Add("app_key", rsp.app_key);
            }

            if (!String.IsNullOrEmpty(rsp.sign_method))
            {
                param.Add("sign_method", rsp.sign_method);
            }

            if (!String.IsNullOrEmpty(rsp.session))
            {
                param.Add("session", rsp.session);
            }
            if (!String.IsNullOrEmpty(rsp.timestamp))
            {
                param.Add("timestamp", rsp.timestamp);
            }
            if (!String.IsNullOrEmpty(rsp.format))
            {
                param.Add("format", rsp.format);
            }
            if (!String.IsNullOrEmpty(rsp.v))
            {
                param.Add("v", rsp.v);
            }
           
            return param;
        }
        string appkey = SiteConfig.GetSite("appkey");
        string appsecret = SiteConfig.GetSite("appsecret");
        string sessionkey = SiteConfig.GetSite("sessionkey");
        string adzone_id = SiteConfig.GetSite("adzone_id");
        string site_id = SiteConfig.GetSite("site_id");
        string usertoken = SiteConfig.GetSite("usertoken");
        string Taobaourl = SiteConfig.GetSite("Taobaourl");

       public string AutoUrl(string method, Dictionary<string, string> adddic)
        {

            initdata rsp = new initdata();
            rsp.method = method;
            rsp.app_key = appkey;
            rsp.session = sessionkey;
            rsp.sign_method = "hmac";
            Dictionary<string, string> paramDic = buildBasicParam(rsp);
            paramDic = paramDic.Concat(adddic).ToDictionary(k => k.Key, v => v.Value);
            paramDic.Add("sign", AppUtil.SignTopRequest(paramDic, appsecret, "hmac"));
            WebUtils utils = new WebUtils();
            string  shorturl = utils.DoPost(Taobaourl, paramDic);
         
            return shorturl;
        }

封装好之后我们每次只用调用AutoUrl将每个接口的这业务参数传过来个就能快速的完成对各个接口的访问了

至于这个接口我们通过 这么一段简短代码就能实现对API的访问了

     Dictionary<string, string> param = new Dictionary<string, string>();
     param.Add("password_content", password_content);
     param.Add("adzone_id", adzone_id);
     string  Url= taoserver.AutoUrl("taobao.tbk.tpwd.convert", param);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章