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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之单向环形列表解决josef问题

1.定义节点类 该节点类中只有孩子的编号,以及指向下一个节点的"指针" package com.ebiz.list.josepfu;/*** author YHj* create 2019-07-17 22:21* 表示节点的类*/ public class Boy {private int no;private Boy next; //指向下一个节点public Boy(int no) {this.n…

考研英语核心词汇辨析(黑魔方系列2007版之十二)

revolve, evolve, involverevolve v.旋转&#xff0c;转动。The room began to revolve , then he fainted.屋子开始旋转&#xff0c;然后他就昏倒了。evolve v.发展&#xff0c;演变。Agriculture evolved slowly over thousands of years.几千年来&#xff0c;农业发展得很缓…

[html] HTML为什么要语义化?语义化有什么好处?

[html] HTML为什么要语义化&#xff1f;语义化有什么好处&#xff1f; 1.利于SEO 2.结构与表现分离 3.利于维护个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

C# 淘宝商品微信返利助手开发-(六)返利助手开发(4)如何通过淘口令解析的出来的地址获得返利信息

系列教程一目录&#xff1a;返利助手原理 系列教程二目录&#xff1a;返利助手开放文档以及帐号申请地址 系列教程三目录&#xff1a;返利助手开发&#xff08;1&#xff09;API介绍 系列教程四目录&#xff1a;返利助手开发&#xff08;2&#xff09;淘宝分享的内容如何只取…

Oracle 大规模 delete,update 操作 注意事项

一. 说明 如果对大表进行大规模的delete 和update&#xff0c;那么可以注意一下如下说明&#xff1a; &#xff08;1&#xff09; 查看执行计划&#xff0c;如果说删除的记录很多&#xff0c;走索引的成本会比全表扫描更大&#xff0c;因为更新数据时还需要做一些约束校验和创…

template标签_Django实战: 利用自定义模板标签实现仿CSDN博客月度归档

应网友慕之岩的请求&#xff0c;现提供下Django项目中如何使用自定义标签实现仿CSDN博客的月度归档(如下图所示)。要求按月统计每个月发表的博文篇数, 跳过空白月份&#xff0c;最后结果按发布时间逆序排列。点击每个月份可以看到详细博文列表清单。本文着重讲述如何实现&#…

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写?

[html] 如何关闭HTML页面在IOS下的键盘首字母自动大写&#xff1f; autocapitalize"none"个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

javascript的stack overflow

写一个很简单的页面和脚本 1<html>2<head>3<title>fanweixiaos test</title>4<script type"text/javascript">5function onclick() 6{ 7 alert(范维肖); 8} 9</script>10</head>11<body>12<input type"b…

GLSL 小細節

"if-else" statement ""gl_FragColor""變數名稱""算指令數,迴圈的指令數要展開來算,才是真的指令數!!!!!!!!!!!!!!"不能下太多很像有限制.........假如出現無謂的ERROR 要注意這點!!!!!!!!!!!转载于:https://www.cnblogs.com/Gam…

Hibernate中inverse属性与cascade属性

Hibernate集合映射中&#xff0c;经常会使用到"inverse"和"cascade"这两个属性。对于我这样&#xff0c;Hibernate接触不深和语文水平够烂的种种因素&#xff0c;发现这两个属性实在是难以理解&#xff0c;无奈只好将这个两个属性解释工作交给了Google和Ba…

h5 nan_h5页面在不同ios设备上的问题总结

最近在写嵌入到小程序webview的一个h5页面&#xff0c;是一个文章评论的功能&#xff0c;这个过程中&#xff0c;遇到很多兼容性的问题&#xff0c;在不同机型上的表现也很不一致&#xff0c;所以总结了以下这些问题&#xff0c;记录下来&#xff0c;以便以后查看。1、日期问题…

[html] 写一个左中右的满屏布局,左右固定220px,中间自适应并且要优先加载

[html] 写一个左中右的满屏布局&#xff0c;左右固定220px,中间自适应并且要优先加载 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

C# 淘宝商品微信返利助手开发-(七)返利助手开发(5)如何将优惠券地址转为淘口令

系列教程一目录&#xff1a;返利助手原理 系列教程二目录&#xff1a;返利助手开放文档以及帐号申请地址 系列教程三目录&#xff1a;返利助手开发&#xff08;1&#xff09;API介绍 系列教程四目录&#xff1a;返利助手开发&#xff08;2&#xff09;淘宝分享的内容如何只取…

什么是活动策划5表

昨晚&#xff0c;看了《非你莫属》&#xff0c;黄欢提到活动策划的五表。我以前也没听说过&#xff0c;不过现场她也没说清楚&#xff0c;今在网上查了一下&#xff0c;从一个博客中搬过来&#xff0c;权作一个指导工作的一个知识点吧。 活动流程表&#xff1b; 任务分工表&…

ftp改为sftp_科普!一文详解 FTP、FTPS 与 SFTP 的原理

FTP、FTPS 与 SFTP 简介FTPFTP 即 文件传输协议&#xff08;英语&#xff1a;File Transfer Protocol 的缩写&#xff09;是一个用于计算机网络上在客户端和服务器之间进行文件传输的应用层协议。完整的 FTP 是由 FTP 服务器 和 FTP 客户端组成的&#xff0c;客户端可以将本地的…

动手学servlet(四) cookie和session

Cookie cookie是保存在客户端的一个“键值对”&#xff0c;用来存储用户的一些信息 cookie的应用&#xff1a; -在电子商务会话中标识用户 -对网站进行定制&#xff0c;比如你经常浏览哪些内容&#xff0c;就展示哪些页面给你 -网站广告&#xff0c;比如百度联盟&#xff0c;你…

[html] html标签中的lang属性有什么作用?

[html] html标签中的lang属性有什么作用&#xff1f; 根据lang属性来设定不同语言的css样式&#xff0c;或者字体告诉搜索引擎做精确的识别让语法检查程序做语言识别帮助翻译工具做识别帮助网页阅读程序做识别等等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识…

【C++ 学习笔记】:STL-map

查找 map<int,int>map_test;map_test.insert(pair<int,int>(1,2));map_test.insert(pair<int,int>(1,3));map_test.insert(pair<int,int>(2,2));inta map_test[1];intb map_test[3];map<int,int>::iterator p map_test.find(4);if(p map_test.en…

[html] 说说base标签有什么作用?

[html] 说说base标签有什么作用&#xff1f; base标签为页面上的所有链接规定默认地址. 例如<head> <base href"http://h-camel.com/show/" /> </head>//略过其中结构<a href"2679.html">说说base标签有什么作用</a>个人简…

16进制 转为图片 php_Python 十六进制hex-bytes-str之间的转换和Bcc码的生成

前言近期做测试模拟器用到了hex-bytes-str之间的转换bcc码的校验&#xff0c;这里总结了一些方法。实例直接上代码转为十六进制&#xff08;Hex&#xff09;字符串def 执行代码&#xff1a;方法&#xff1a;getStringFromNumber(size,value)参数一为生成几个batys&#xff0c;参…