CreateCardAPI.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using LYFZ.Weixin.SDK.Helpers;
  6. using Codeplex.Data;
  7. using System.Net.Http;
  8. using System.IO;
  9. namespace LYFZ.Weixin.SDK.Card
  10. {
  11. /// <summary>
  12. /// 创建卡券接口
  13. /// </summary>
  14. public class CreateCardAPI
  15. {
  16. /// <summary>
  17. ///上传LOGO接口
  18. ///开发者需调用该接口上传商户图标至微信服务器,获取相应logo_url,用于卡券创建。
  19. ///注意事项
  20. ///1.上传的图片限制文件大小限制1MB,像素为300*300,支持JPG格式。
  21. ///2.调用接口获取的logo_url进支持在微信相关业务下使用,否则会做相应处理。
  22. /// </summary>
  23. /// <param name="access_token"></param>
  24. /// <param name="file"></param>
  25. /// <returns>返回上传后路径</returns>
  26. public static string UploadLogo(string access_token, string fileName, Stream inputStream)
  27. {
  28. var url = string.Format("http://api.weixin.qq.com/cgi-bin/uploadimg?access_token={0}", access_token);
  29. var returnMessage = DynamicJson.Parse(Util.HttpRequestPost(url, "buffer", fileName, inputStream));
  30. if (returnMessage.errcode != 0) return string.Empty;
  31. return returnMessage.url;
  32. }
  33. /// <summary>
  34. /// 批量导入门店信息
  35. /// 接口说明
  36. ///支持商户调用该接口批量导入/新建门店信息,获取门店ID。
  37. ///注:通过该接口导入的门店信息将进入门店审核流程,审核期间可正常使用。若导入的
  38. ///门店信息未通过审核,则会被剔除出门店列表。
  39. /// </summary>
  40. /// <param name="access_token"></param>
  41. /// <param name="location_list">门店列表
  42. /// 数据示意:
  43. /// {"location_list":[
  44. ///{
  45. ///"business_name":"麦当劳",
  46. ///"branch_name":"赤岗店",
  47. ///"province":"广东省",
  48. ///"city":"广州市",
  49. ///"district":"海珠区",
  50. ///"address":"中国广东省广州市海珠区艺苑路11号",
  51. ///"telephone":"020-89772059",
  52. ///"category":"房产小区",
  53. ///"longitude":"115.32375",
  54. ///"latitude":"25.097486"
  55. ///},
  56. ///{
  57. ///"business_name":"麦当劳",
  58. ///"branch_name":"珠江店",
  59. ///"province":"广东省",
  60. ///"city":"广州市",
  61. ///"district":"海珠区",
  62. ///"address":"中国广东省广州市海珠区艺苑路12号",
  63. ///"telephone":"020-89772059",
  64. ///"category":"房产小区",
  65. ///"longitude":"113.32375",
  66. ///"latitude":"23.097486"
  67. ///}]}</param>
  68. /// <returns>
  69. /// {
  70. /// "errcode":0,
  71. /// "errmsg":"ok",
  72. /// "location_id_list":[271262077,-1]
  73. ///}
  74. ///其中location_id_list中的 -1 表示失败
  75. /// </returns>
  76. public static dynamic BatchAddLocation(string access_token, dynamic location_list)
  77. {
  78. var url = string.Format("https://api.weixin.qq.com/card/location/batchadd?access_token={0}", access_token);
  79. var client = new HttpClient();
  80. var result = client.PostAsync(url, new StringContent(DynamicJson.Serialize(location_list))).Result;
  81. if (result.IsSuccessStatusCode) return null;
  82. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  83. }
  84. /// <summary>
  85. /// 拉取门店列表
  86. /// 获取在公众平台上申请创建及API导入的门店列表,用于创建卡券
  87. /// </summary>
  88. /// <param name="access_token"></param>
  89. /// <param name="offset">偏移量,0开始</param>
  90. /// <param name="count">拉取数量,为0时默认拉取全部门店。</param>
  91. /// <returns>
  92. /// 返回数据示意:
  93. /// { "errcode":0,
  94. ///"errmsg":"ok",
  95. ///"location_list":[
  96. ///{
  97. ///"location_id":“493”,
  98. ///"business_name":"steventaohome",
  99. ///"phone":"020-12345678",
  100. ///"address":"广东省广州市番禺区广东省广州市番禺区南浦大道",
  101. ///"longitude":113.280212402,
  102. ///"latitude":23.0350666046
  103. ///},
  104. ///{
  105. ///"location_id":“468”,
  106. ///"business_name":"TIT创意园B4",
  107. ///"phone":"020-12345678",
  108. ///"address":"广东省广州市海珠区",
  109. ///"longitude":113.325248718,
  110. ///"latitude":23.1008300781
  111. ///}
  112. ///],
  113. ///"count":2
  114. ///}
  115. /// </returns>
  116. public static dynamic BatchGetLocation(string access_token, int offset, int count)
  117. {
  118. var url = string.Format("https://api.weixin.qq.com/card/location/batchget??access_token={0}", access_token);
  119. var client = new HttpClient();
  120. var sb = new StringBuilder();
  121. sb.Append("{")
  122. .Append('"' + "offset" + '"' + ":").Append(offset)
  123. .Append('"' + "count" + '"' + ":").Append(count)
  124. .Append("}");
  125. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  126. if (result.IsSuccessStatusCode) return null;
  127. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  128. }
  129. /// <summary>
  130. /// 获取颜色列表接口
  131. /// 获得卡券的最新颜色列表,用于卡券创建。
  132. /// </summary>
  133. /// <param name="access_token"></param>
  134. /// <returns>
  135. /// 返回数据结果示意:
  136. /// {
  137. ///"errcode":0,
  138. ///"errmsg":"ok",
  139. ///"colors":[
  140. ///{"name":"Color010","value":"#55bd47"},
  141. ///{"name":"Color020","value":"#10ad61"},
  142. ///{"name":"Color030","value":"#35a4de"},
  143. ///{"name":"Color040","value":"#3d78da"},
  144. ///{"name":"Color050","value":"#9058cb"},
  145. ///{"name":"Color060","value":"#de9c33"},
  146. ///{"name":"Color070","value":"#ebac16"},
  147. ///{"name":"Color080","value":"#f9861f"},
  148. ///{"name":"Color081","value":"#f08500"},
  149. ///{"name":"Color090","value":"#e75735"},
  150. ///{"name":"Color100","value":"#d54036"},
  151. ///{"name":"Color101","value":"#cf3e36"}
  152. ///]
  153. ///}</returns>
  154. public static dynamic GetColors(string access_token)
  155. {
  156. var url = string.Format("https://api.weixin.qq.com/card/getcolors?access_token={0}", access_token);
  157. var client = new HttpClient();
  158. var result = client.GetAsync(url).Result;
  159. if (result.IsSuccessStatusCode) return null;
  160. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  161. }
  162. /// <summary>
  163. /// 创建卡券
  164. /// </summary>
  165. /// <param name="access_token"></param>
  166. /// <param name="card">
  167. /// 数据示意:
  168. /// {"card":{
  169. /// "card_type":"GROUPON",
  170. /// "groupon":{
  171. /// "base_info":{
  172. /// "logo_url":
  173. /// "http:\/\/www.supadmin.cn\/uploads\/allimg\/120216\/1_120216214725_1.jpg",
  174. /// "brand_name":"海底捞",
  175. /// "code_type":"CODE_TYPE_TEXT",
  176. /// "title":"132元双人火锅套餐",
  177. /// "sub_title":"",
  178. /// "color":"Color010",
  179. /// "notice":"使用时向服务员出示此券",
  180. /// "service_phone":"020-88888888",
  181. /// "description":"不可与其他优惠同享\n如需团购券发票,请在消费时向商户提出\n店内均可
  182. /// 使用,仅限堂食\n餐前不可打包,餐后未吃完,可打包\n本团购券不限人数,建议2人使用,超过建议人
  183. /// 数须另收酱料费5元/位\n本单谢绝自带酒水饮料",
  184. /// "date_info":{
  185. /// "type":1,
  186. /// "begin_timestamp":1397577600,
  187. /// "end_timestamp":1422724261
  188. /// },
  189. /// "sku":{
  190. /// "quantity":50000000
  191. /// },
  192. /// "get_limit":3,
  193. /// "use_custom_code":false,
  194. /// "bind_openid":false,
  195. /// "can_share":true,
  196. /// "can_give_friend":true,
  197. /// "location_id_list": [123,12321,345345],
  198. /// "url_name_type":"URL_NAME_TYPE_RESERVATION",
  199. /// "custom_url":"http://www.qq.com",
  200. /// "source":"大众点评"
  201. /// },
  202. /// "deal_detail":"以下锅底2选1(有菌王锅、麻辣锅、大骨锅、番茄锅、清补凉锅、酸菜鱼锅可
  203. /// 选):\n大锅1份12元\n小锅2份16元\n以下菜品2选1\n特级肥牛1份30元\n洞庭鮰鱼卷1份
  204. /// 20元\n其他\n鲜菇猪肉滑1份18元\n金针菇1份16元\n黑木耳1份9元\n娃娃菜1份8元\n冬
  205. /// 瓜1份6元\n火锅面2个6元\n欢乐畅饮2位12元\n自助酱料2位10元"}
  206. /// }
  207. /// }
  208. /// 具体参数意义,请参见官方文档。
  209. /// </param>
  210. /// <returns>
  211. /// {
  212. ///"errcode":0,
  213. ///"errmsg":"ok",
  214. ///"card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI"
  215. /// }</returns>
  216. public static dynamic CreateCard(string access_token, dynamic card)
  217. {
  218. var url = string.Format("https://api.weixin.qq.com/card/create?access_token={0}", access_token);
  219. var client = new HttpClient();
  220. var result = client.PostAsync(url, new StringContent(DynamicJson.Serialize(card))).Result;
  221. if (result.IsSuccessStatusCode) return null;
  222. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  223. }
  224. /// <summary>
  225. /// 为检测跳转外链请求来自微信,会在URL参数里加上签名。
  226. /// </summary>
  227. /// <param name="appscret">appscret</param>
  228. /// <param name="encrypt_code">指定的卡券code码,只能被领一次。</param>
  229. /// <param name="card_id">创建卡券时获得的卡券ID</param>
  230. /// <returns></returns>
  231. public static string SignCustomUrl(string appscret, string encrypt_code, string card_id)
  232. {
  233. var stringADict = new Dictionary<string, string>();
  234. stringADict.Add("appscret", appscret);
  235. stringADict.Add("card_id", card_id);
  236. stringADict.Add("encrypt_code", encrypt_code);
  237. var sb = new StringBuilder();
  238. foreach (var sA in stringADict.OrderBy(x => x.Key))//参数名ASCII码从小到大排序(字典序);
  239. {
  240. if (string.IsNullOrEmpty(sA.Value)) continue;//参数的值为空不参与签名;
  241. sb.Append(sA.Key).Append("=").Append(sA.Value).Append("&");
  242. }
  243. var string1 = sb.ToString();
  244. string1 = string1.Remove(string1.Length - 1, 1);
  245. return Util.Sha1(string1, "UTF-8");//对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
  246. }
  247. }
  248. }