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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章