ManageCardAPI.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Http;
  6. using Codeplex.Data;
  7. namespace LYFZ.Weixin.SDK.Card
  8. {
  9. /// <summary>
  10. /// 卡券管理接口
  11. /// </summary>
  12. public class ManageCardAPI
  13. {
  14. /// <summary>
  15. /// 删除卡券
  16. /// 删除卡券接口允许商户删除任意一类卡券。删除卡券后,该卡券对应已生成的领取用二维码、添加到卡包JSAPI均会失效。
  17. /// 注意:如用户在商家删除卡券前已领取一张或多张该卡券依旧有效。即删除卡券不能删除已被用户领取,保存在微信客户端中的卡券。
  18. /// </summary>
  19. /// <param name="access_token"></param>
  20. /// <param name="card_id">卡券ID</param>
  21. /// <returns>{
  22. ///"errcode":0,
  23. ///"errmsg":"ok"
  24. ///}</returns>
  25. public static string DeleteCard(string access_token, string card_id)
  26. {
  27. var url = string.Format("https://api.weixin.qq.com/card/delete?access_token={0}", access_token);
  28. var client = new HttpClient();
  29. var sb = new StringBuilder();
  30. sb.Append("{")
  31. .Append('"' + "card_id" + '"' + ":").Append(card_id)
  32. .Append("}");
  33. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  34. if (result.IsSuccessStatusCode) return string.Empty;
  35. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  36. }
  37. /// <summary>
  38. /// 查询code
  39. ///
  40. /// 调用查询code接口可获取code的有效性(非自定义code),该code对应的用户openid、卡券有效期等信息。
  41. /// 自定义code(use_custom_code为true)的卡券调用接口时,post数据中需包含card_id,非自定义code不需上报。
  42. /// </summary>
  43. /// <param name="access_token"></param>
  44. /// <param name="code">要查询的序列号</param>
  45. /// <param name="card_id">要消耗序列号所述的card_id,生成券时use_custom_code填写true时必填。非自定义code不必填写。</param>
  46. /// <returns>{
  47. ///"errcode":0,
  48. ///"errmsg":"ok",
  49. ///"openid":"oFS7Fjl0WsZ9AMZqrI80nbIq8xrA",
  50. ///"card":{
  51. ///"card_id":"pFS7Fjg8kV1IdDz01r4SQwMkuCKc",
  52. ///"begin_time":1404205036,
  53. ///"end_time":1404205036,
  54. ///}
  55. ///}
  56. ///
  57. ///注:固定时长有效期会根据用户实际领取时间转换,如用户2013年10月1日领取,固定时长有效期为90天,即有效时间为2013年10月1日-12月29日有效。
  58. /// </returns>
  59. public static string GetCardCode(string access_token, string code, string card_id = "")
  60. {
  61. var url = string.Format("https://api.weixin.qq.com/card/get?access_token={0}", access_token);
  62. var client = new HttpClient();
  63. var sb = new StringBuilder();
  64. sb.Append("{")
  65. .Append('"' + "code" + '"' + ":").Append(code);
  66. if (!string.IsNullOrEmpty(card_id))
  67. {
  68. sb.Append('"' + "card_id" + '"' + ":").Append(card_id);
  69. }
  70. sb.Append("}");
  71. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  72. if (result.IsSuccessStatusCode) return string.Empty;
  73. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  74. }
  75. /// <summary>
  76. /// 批量查询卡列表
  77. /// </summary>
  78. /// <param name="access_token"></param>
  79. /// <param name="offset">查询卡列表的起始偏移量,从0开始,即offset:5是指从从列表里的第六个开始读取。</param>
  80. /// <param name="count">需要查询的卡片的数量(数量最大50)</param>
  81. /// <returns>{
  82. /// "errcode":0,
  83. /// "errmsg":"ok",
  84. /// "card_id_list":["ph_gmt7cUVrlRk8swPwx7aDyF-pg"],
  85. /// "total_num":1
  86. /// }</returns>
  87. public static string BatchGetCard(string access_token, int offset, int count)
  88. {
  89. var url = string.Format("https://api.weixin.qq.com/card/batchget?access_token={0}", access_token);
  90. var client = new HttpClient();
  91. var sb = new StringBuilder();
  92. sb.Append("{")
  93. .Append('"' + "offset" + '"' + ":").Append(offset)
  94. .Append('"' + "count" + '"' + ":").Append(count)
  95. .Append("}");
  96. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  97. if (result.IsSuccessStatusCode) return string.Empty;
  98. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  99. }
  100. /// <summary>
  101. /// 查询卡券详情
  102. /// </summary>
  103. /// <param name="access_token"></param>
  104. /// <param name="card_id">卡券ID</param>
  105. /// <returns>
  106. /// 返回结果示意
  107. ///{"errcode":0,
  108. ///"errmsg":"ok",
  109. ///"card":{
  110. ///"card_type": "GROUPON",
  111. ///"groupon":{
  112. ///"base_info":{
  113. ///"status":1,
  114. ///"id":"p1Pj9jr90_SQRaVqYI239Ka1erkI",
  115. ///"logo_url":
  116. ///"http://www.supadmin.cn/uploads/allimg/120216/1_120216214725_1.jpg",
  117. ///"appid":"wx588def6b0089dd48",
  118. ///"code_type":"CODE_TYPE_TEXT",
  119. ///"brand_name":"海底捞",
  120. ///"title":"132元双人火锅套餐",
  121. ///"sub_title":"",
  122. ///"date_info":{
  123. ///"type":1,
  124. ///"begin_timestamp":1397577600,
  125. ///"end_timestamp":1399910400
  126. ///},
  127. ///"color":"#3373bb",
  128. ///"notice":"使用时向服务员出示此券",
  129. ///"service_phone":"020-88888888",
  130. ///"description":"不可与其他优惠同享\n如需团购券发票,请在消费时向商户提出\n店内均可使用,仅限堂食\n餐前不可打包,餐后未吃完,可打包\n本团购券不限人数,建议2人使用,超过建议人数须另收酱料费5元/位\n本单谢绝自带酒水饮料",
  131. /// "use_limit":1,
  132. ///"get_limit":3,
  133. ///"can_share":true,
  134. ///"location_id_list": [123,12321,345345]
  135. ///"url_name_type":"URL_NAME_TYPE_RESERVATION",
  136. ///"custom_url":"http://www.qq.com",
  137. ///"source":"大众点评"
  138. ///"sku":{
  139. ///"quantity":0
  140. ///}
  141. ///},
  142. ///"deal_detail":"以下锅底2选1(有菌王锅、麻辣锅、大骨锅、番茄锅、清补凉锅、酸菜鱼锅可选):\n大锅1份12元\n小锅2份16元\n以下菜品2选1\n特级肥牛1份30元\n洞庭鮰鱼卷1份20元\n其他\n鲜菇猪肉滑1份18元\n金针菇1份16元\n黑木耳1份9元\n娃娃菜1份8元\n冬瓜1份6元\n火锅面2个6元\n欢乐畅饮2位12元\n自助酱料2位10元",
  143. ///}
  144. ///}
  145. ///}
  146. ///}
  147. ///<returns>
  148. public static string GetCard(string access_token, string card_id)
  149. {
  150. var url = string.Format("https://api.weixin.qq.com/card/get?access_token={0}", access_token);
  151. var client = new HttpClient();
  152. var sb = new StringBuilder();
  153. sb.Append("{")
  154. .Append('"' + "card_id" + '"' + ":").Append(card_id)
  155. .Append("}");
  156. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  157. if (result.IsSuccessStatusCode) return string.Empty;
  158. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  159. }
  160. /// <summary>
  161. /// 更改code
  162. /// 为确保转赠后的安全性,微信允许自定义code的商户对已下发的code进行更改。
  163. ///注:为避免用户疑惑,建议仅在发生转赠行为后(发生转赠后,微信会通过事件推送的方式告知商户被转赠的卡券code)对用户的code进行更改。
  164. /// </summary>
  165. /// <param name="access_token"></param>
  166. /// <param name="card_id">卡券ID</param>
  167. /// <param name="code">卡券的code编码</param>
  168. /// <param name="new_code">新的卡券code编码</param>
  169. /// <returns>
  170. /// {
  171. ///"errcode":0,
  172. ///"errmsg":"ok"
  173. ///}</returns>
  174. public static string UpdateCardCode(string access_token, string code, string card_id, string new_code)
  175. {
  176. var url = string.Format("https://api.weixin.qq.com/card/code/update?access_token={0}", access_token);
  177. var client = new HttpClient();
  178. var sb = new StringBuilder();
  179. sb.Append("{")
  180. .Append('"' + "code" + '"' + ":").Append(code)
  181. .Append('"' + "card_id" + '"' + ":").Append(card_id)
  182. .Append('"' + "new_code" + '"' + ":").Append(new_code)
  183. .Append("}");
  184. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  185. if (result.IsSuccessStatusCode) return string.Empty;
  186. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  187. }
  188. /// <summary>
  189. /// 设置卡券失效接口
  190. /// 为满足改票、退款等异常情况,可调用卡券失效接口将用户的卡券设置为失效状态。
  191. /// 注:设置卡券失效的操作不可逆,即无法将设置为失效的卡券调回有效状态,商家须慎重调用该接口。
  192. /// </summary>
  193. /// <param name="access_token"></param>
  194. /// <param name="code">需要设置为失效的code</param>
  195. /// <param name="card_id">自定义code的卡券必填。非自定义code的卡券不填。</param>
  196. /// <returns>
  197. /// {
  198. ///"errcode":0,
  199. ///"errmsg":"ok"
  200. ///}
  201. ///</returns>
  202. public static string UnavailableCardCode(string access_token, string code, string card_id = "")
  203. {
  204. var url = string.Format("https://api.weixin.qq.com/card/code/unavailable?access_token={0}", access_token);
  205. var client = new HttpClient();
  206. var sb = new StringBuilder();
  207. sb.Append("{")
  208. .Append('"' + "code" + '"' + ":").Append(code);
  209. if (!string.IsNullOrEmpty(card_id))
  210. {
  211. sb.Append('"' + "card_id" + '"' + ":").Append(card_id);
  212. }
  213. sb.Append("}");
  214. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  215. if (result.IsSuccessStatusCode) return string.Empty;
  216. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  217. }
  218. /// <summary>
  219. /// 查询卡券详情
  220. /// </summary>
  221. /// <param name="access_token"></param>
  222. /// <param name="new_card">
  223. /// {
  224. ///"card_id": "xxxxxxxxxxxxx",
  225. ///"member_card":{
  226. ///"base_info":{
  227. ///"logo_url":
  228. ///"http:\/\/www.supadmin.cn\/uploads\/allimg\/120216\/1_120216214725_1.jpg",
  229. ///"color":"Color010",
  230. ///"notice":"使用时向服务员出示此券",
  231. ///"service_phone":"020-88888888",
  232. ///"description":"不可与其他优惠同享\n如需团购券发票,请在消费时向商户提出\n店内均可使用,仅限堂食\n餐前不可打包,餐后未吃完,可打包\n本团购券不限人数,建议2人使用,超过建议人数须另收酱料费5元/位\n本单谢绝自带酒水饮料"
  233. ///"location_id_list": [123,12321,345345]
  234. ///},
  235. ///"bonus_cleared":"aaaaaaaaaaaaaa",
  236. ///"bonus_rules":"aaaaaaaaaaaaaa",
  237. ///"prerogative":""
  238. ///}
  239. ///}
  240. /// </param>
  241. /// <returns>
  242. /// {
  243. ///"errcode":0,
  244. ///"errmsg":"ok"
  245. ///}
  246. ///</returns>
  247. public static string UpdateCard(string access_token, dynamic new_card)
  248. {
  249. var url = string.Format("https://api.weixin.qq.com/card/update?access_token={0}", access_token);
  250. var client = new HttpClient();
  251. var result = client.PostAsync(url, new StringContent(DynamicJson.Serialize(new_card))).Result;
  252. if (result.IsSuccessStatusCode) return string.Empty;
  253. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  254. }
  255. /// <summary>
  256. /// 库存修改接口
  257. /// 增减某张卡券的库存。
  258. /// </summary>
  259. /// <param name="access_token"></param>
  260. /// <param name="card_id">卡券ID</param>
  261. /// <param name="increase_stock_value">增加多少库存,可以不填或填0</param>
  262. /// <param name="reduce_stock_value">减少多少库存,可以不填或填0</param>
  263. /// <returns>
  264. /// {
  265. ///"errcode":0,
  266. ///"errmsg":"ok"
  267. ///}
  268. ///</returns>
  269. public static string ModifyCardStock(string access_token, string card_id, int increase_stock_value, int reduce_stock_value)
  270. {
  271. var url = string.Format("https://api.weixin.qq.com/card//modifystock?access_token={0}", access_token);
  272. var client = new HttpClient();
  273. var sb = new StringBuilder();
  274. sb.Append("{")
  275. .Append('"' + "card_id" + '"' + ":").Append(card_id)
  276. .Append('"' + "increase_stock_value" + '"' + ":").Append(increase_stock_value)
  277. .Append('"' + "reduce_stock_value" + '"' + ":").Append(reduce_stock_value)
  278. .Append("}");
  279. var result = client.PostAsync(url, new StringContent(sb.ToString())).Result;
  280. if (result.IsSuccessStatusCode) return string.Empty;
  281. return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
  282. }
  283. }
  284. }