MenuModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Runtime.Serialization;
  5. using System.Runtime.Serialization.Json;
  6. using System.Text;
  7. namespace LYFZ.Weixin.SDK
  8. {
  9. [System.Runtime.Serialization.DataContract]
  10. public class MenuModel
  11. {
  12. public MenuModel()
  13. {
  14. }
  15. public MenuModel(WXMenuType _type, string _name, string _Key = "", string _Url = "", string _Media_id = "", string _appid="", string _pagepath="")
  16. {
  17. this.type = _type;
  18. this.name = _name;
  19. this.key = _Key;
  20. this.url = _Url;
  21. this.media_id = _Media_id;
  22. this._appid = _appid;
  23. this._pagepath = _pagepath;
  24. }
  25. public override string ToString()
  26. {
  27. string tempString = "";
  28. string tempSub_button = "";
  29. if (this.sub_buttons.Count > 0)
  30. {
  31. for (int i = 0; i < 5; i++)
  32. {
  33. if (i < this.sub_buttons.Count)
  34. {
  35. MenuModel button = this.sub_buttons[i];
  36. tempSub_button += button.ToString() + ",";
  37. }
  38. else
  39. {
  40. break;
  41. }
  42. }
  43. tempSub_button = tempSub_button.Trim(',');
  44. tempString = "{"
  45. + "\"name\": \"" + this.name + "\","
  46. + "\"sub_button\":[" + tempSub_button + "]"
  47. + "}";
  48. }
  49. else
  50. {
  51. tempString = "{"
  52. + "\"type\":\"" + this.type.ToString() + "\","
  53. + "\"name\":\"" + this.name + "\","
  54. + GetKey_Url_Media_id()
  55. + "}";
  56. }
  57. return tempString;
  58. }
  59. /// <summary>
  60. /// 获取Key_Url_Media_id
  61. /// </summary>
  62. /// <returns></returns>
  63. string GetKey_Url_Media_id()
  64. {
  65. string myKey_Url_Media_id = "";
  66. switch (this.type)
  67. {
  68. case WXMenuType.click:
  69. case WXMenuType.location_select:
  70. myKey_Url_Media_id = "\"key\": \"" + this.key + "\"";
  71. break;
  72. case WXMenuType.view:
  73. myKey_Url_Media_id = "\"url\": \"" +System.Web.HttpUtility.UrlEncode(this.url) + "\"";
  74. break;
  75. case WXMenuType.miniprogram:
  76. myKey_Url_Media_id = "\"url\": \"" + System.Web.HttpUtility.UrlEncode(this.url) + "\""
  77. + ",\"appid\":\""+this._appid+"\""
  78. + ",\"pagepath\":\"" + this._pagepath + "\"";
  79. break;
  80. case WXMenuType.view_limited:
  81. case WXMenuType.media_id:
  82. myKey_Url_Media_id = "\"media_id\": \"" + this.media_id + "\"";
  83. break;
  84. case WXMenuType.scancode_waitmsg:
  85. case WXMenuType.scancode_push:
  86. case WXMenuType.pic_sysphoto:
  87. case WXMenuType.pic_photo_or_album:
  88. case WXMenuType.pic_weixin:
  89. myKey_Url_Media_id = "\"key\": \"" + this.key + "\","
  90. + "\"sub_button\": [ ]";
  91. break;
  92. case WXMenuType.sub_button: break;
  93. default:
  94. goto case WXMenuType.click;
  95. // break;
  96. }
  97. return myKey_Url_Media_id;
  98. }
  99. public string ToXml(bool isSub_btuuon=false)
  100. {
  101. string tempString = "";
  102. string tempSub_button = "";
  103. if (this.sub_buttons.Count > 0)
  104. {
  105. for (int i = 0; i < 5; i++)
  106. {
  107. if (i < this.sub_buttons.Count)
  108. {
  109. MenuModel button = this.sub_buttons[i];
  110. tempSub_button += button.ToXml(true);
  111. }
  112. else
  113. {
  114. break;
  115. }
  116. }
  117. tempString = "<button>"
  118. + "<name>" + this.name + "</name>"
  119. + tempSub_button
  120. + "</button>";
  121. }
  122. else
  123. {
  124. tempString = "<type>" + this.type.ToString() + "</type>"
  125. + "<name>" + this.name + "</name>"
  126. + GetKey_Url_Media_id_Xml();
  127. if (isSub_btuuon)
  128. {
  129. tempString = "<sub_button>" + tempString + "</sub_button>";
  130. }
  131. else {
  132. tempString = "<button>" + tempString + "</button>";
  133. }
  134. }
  135. return tempString;
  136. }
  137. /// <summary>
  138. /// 获取Key_Url_Media_id
  139. /// </summary>
  140. /// <returns></returns>
  141. string GetKey_Url_Media_id_Xml()
  142. {
  143. string myKey_Url_Media_id = "";
  144. switch (this.type)
  145. {
  146. case WXMenuType.click:
  147. case WXMenuType.location_select:
  148. myKey_Url_Media_id = "<key>" + this.key + "</key>";
  149. break;
  150. case WXMenuType.view:
  151. myKey_Url_Media_id = "<url>" + System.Web.HttpUtility.UrlEncode(this.url) + "</url>";
  152. break;
  153. case WXMenuType.miniprogram:
  154. myKey_Url_Media_id = "<url>" + System.Web.HttpUtility.UrlEncode(this.url) + "</url>"
  155. + "<appid>" + System.Web.HttpUtility.UrlEncode(this.url) + "</appid>"
  156. + "<pagepath>" + System.Web.HttpUtility.UrlEncode(this.url) + "</pagepath>";
  157. break;
  158. case WXMenuType.view_limited:
  159. case WXMenuType.media_id:
  160. myKey_Url_Media_id = "<media_id>" + this.media_id + "</media_id>";
  161. break;
  162. case WXMenuType.scancode_waitmsg:
  163. case WXMenuType.scancode_push:
  164. case WXMenuType.pic_sysphoto:
  165. case WXMenuType.pic_photo_or_album:
  166. case WXMenuType.pic_weixin:
  167. myKey_Url_Media_id = "<key>" + this.key + "</key>";
  168. break;
  169. case WXMenuType.sub_button: break;
  170. default:
  171. goto case WXMenuType.click;
  172. // break;
  173. }
  174. return myKey_Url_Media_id;
  175. }
  176. string name = "";
  177. /// <summary>
  178. /// 必填 菜单标题,不超过16个字节,子菜单不超过40个字节
  179. /// </summary>
  180. [DataMember(IsRequired = true)]
  181. public string Name
  182. {
  183. get { return name; }
  184. set { name = value; }
  185. }
  186. WXMenuType type = WXMenuType.click;
  187. /// <summary>
  188. /// 必填 菜单的响应动作类型
  189. /// </summary>
  190. public WXMenuType Type
  191. {
  192. get { return type; }
  193. set { type = value; }
  194. }
  195. string key = "";
  196. /// <summary>
  197. /// click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
  198. /// </summary>
  199. public string Key
  200. {
  201. get { return key; }
  202. set { key = value; }
  203. }
  204. string url = "";
  205. /// <summary>
  206. /// view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节
  207. /// </summary>
  208. public string Url
  209. {
  210. get { return url; }
  211. set { url = value; }
  212. }
  213. string media_id = "";
  214. /// <summary>
  215. /// media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id
  216. /// </summary>
  217. public string Media_id
  218. {
  219. get { return media_id; }
  220. set { media_id = value; }
  221. }
  222. private string _appid = "";
  223. /// <summary>
  224. /// 小程序的appid(仅认证公众号可配置)
  225. /// </summary>
  226. public string Appid
  227. {
  228. get { return _appid; }
  229. set { _appid = value; }
  230. }
  231. string _pagepath = "";
  232. /// <summary>
  233. /// 小程序的页面路径
  234. /// </summary>
  235. public string Pagepath
  236. {
  237. get { return _pagepath; }
  238. set { _pagepath = value; }
  239. }
  240. List<MenuModel> sub_buttons = new List<MenuModel>();
  241. /// <summary>
  242. /// 二级菜单数组,个数应为1~5个
  243. /// </summary>
  244. public List<MenuModel> Sub_buttons
  245. {
  246. get { return sub_buttons; }
  247. set { sub_buttons = value; }
  248. }
  249. }
  250. /// <summary>
  251. /// 自定义菜单 MenuModel 类型
  252. /// </summary>
  253. public enum WXMenuType
  254. {
  255. /// <summary>
  256. /// 含有子菜单
  257. /// </summary>
  258. sub_button,
  259. /// <summary>
  260. /// 点击推事件
  261. /// 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
  262. /// </summary>
  263. click,
  264. /// <summary>
  265. /// 跳转URL
  266. ///用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
  267. /// </summary>
  268. view,
  269. /// <summary>
  270. /// 扫码推事件
  271. /// 用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。
  272. /// </summary>
  273. scancode_push,
  274. /// <summary>
  275. /// 扫码推事件且弹出“消息接收中”提示框
  276. /// 用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。
  277. /// </summary>
  278. scancode_waitmsg,
  279. /// <summary>
  280. /// 弹出系统拍照发图
  281. ///用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,会将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。
  282. /// </summary>
  283. pic_sysphoto,
  284. /// <summary>
  285. /// 弹出拍照或者相册发图
  286. ///用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。
  287. /// </summary>
  288. pic_photo_or_album,
  289. /// <summary>
  290. /// 弹出微信相册发图器
  291. ///用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。
  292. /// </summary>
  293. pic_weixin,
  294. /// <summary>
  295. /// 弹出地理位置选择器
  296. ///用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。
  297. /// </summary>
  298. location_select,
  299. /// <summary>
  300. /// 下发消息(除文本消息)
  301. ///用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
  302. /// </summary>
  303. media_id,
  304. /// <summary>
  305. /// 跳转图文消息URL
  306. ///用户点击view_limited类型按钮后,微信客户端将打开开发者在按钮中填写的永久素材id对应的图文消息URL,永久素材类型只支持图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
  307. /// </summary>
  308. view_limited,
  309. /// <summary>
  310. /// 小程序
  311. /// appid 小程序的appid(仅认证公众号可配置) pagepath 小程序的页面路径
  312. /// </summary>
  313. miniprogram,
  314. }
  315. /// <summary>
  316. /// 自定义菜单 类型
  317. /// </summary>
  318. public enum CustomWXMenuType
  319. {
  320. /// <summary>
  321. /// 含有子菜单
  322. /// </summary>
  323. [Description("含有子菜单|sub_button")]
  324. Sub_button,
  325. /// <summary>
  326. /// 触发关键词
  327. /// </summary>
  328. [Description("触发关键词|click")]
  329. Click,
  330. /// <summary>
  331. /// 跳转URL
  332. ///用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
  333. /// </summary>
  334. [Description("跳转URL|view")]
  335. View,
  336. /// <summary>
  337. /// 小程序
  338. /// </summary>
  339. [Description("链接小程序|miniprogram")]
  340. miniprogram,
  341. /* /// <summary>
  342. /// 手机APP
  343. /// </summary>
  344. [Description("手机APP|view")]
  345. LYFZ_MobileAPP,
  346. /// <summary>
  347. /// 订单查询
  348. /// </summary>
  349. [Description("订单查询|click")]
  350. LYFZ_OrderQuery,
  351. /// <summary>
  352. /// 会员查询
  353. /// </summary>
  354. [Description("会员查询|click")]
  355. LYFZ_MemberQuery,
  356. /// <summary>
  357. /// 帐号绑定
  358. /// </summary>
  359. [Description("帐号绑定|click")]
  360. LYFZ_AccountBonding,
  361. /// <summary>
  362. /// 帐号解除绑定
  363. /// </summary>
  364. [Description("帐号解除绑定|click")]
  365. LYFZ_JCBDZH,*/
  366. }
  367. }