.Net6+Furion+Sqlsugar+SenparcSdk開發微信公衆號系列之八:自定義菜單

一、創建接口

1.1、注意事項

  1. 自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。
  2. 一級菜單最多4個漢字,二級菜單最多8個漢字,多出來的部分將會以“...”代替。
  3. 創建自定義菜單後,菜單的刷新策略是,在用戶進入公衆號會話頁或公衆號 profile 頁時,如果發現上一次拉取菜單的請求在5分鐘以前,就會拉取一下菜單,如果菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公衆賬號後再次關注,則可以看到創建後的效果。​

1.2、按鈕類型

  1. click:點擊推事件用戶點擊 click 類型按鈕後,微信服務器會通過消息接口推送消息類型爲 event 的結構給開發者(參考消息接口指南),並且帶上按鈕中開發者填寫的 key 值,開發者可以通過自定義的 key 值與用戶進行交互;
  2. view:跳轉 URL 用戶點擊 view 類型按鈕後,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
  3. scancode_push:掃碼推事件用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操作後顯示掃描結果(如果是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者可以下發消息。
  4. scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操作後,將掃碼的結果傳給開發者,同時收起掃一掃工具,然後彈出“消息接收中”提示框,隨後可能會收到開發者下發的消息。
  5. pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕後,微信客戶端將調起系統相機,完成拍照操作後,會將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨後可能會收到開發者下發的消息。
  6. pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕後,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機相冊選擇”。用戶選擇後即走其他兩種流程。
  7. pic_weixin:彈出微信相冊發圖器用戶點擊按鈕後,微信客戶端將調起微信相冊,完成選擇操作後,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨後可能會收到開發者下發的消息。
  8. location_select:彈出地理位置選擇器用戶點擊按鈕後,微信客戶端將調起地理位置選擇工具,完成選擇操作後,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨後可能會收到開發者下發的消息。
  9. media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕後,微信服務器會將開發者填寫的永久素材 id 對應的素材下發給用戶,永久素材類型可以是圖片、音頻、視頻 、圖文消息。請注意:永久素材 id 必須是在“素材管理/新增永久素材”接口上傳後獲得的合法id。
  10. view_limited:跳轉圖文消息 URL 用戶點擊view_limited類型按鈕後,微信客戶端將打開開發者在按鈕中填寫的永久素材 id 對應的圖文消息URL,永久素材類型只支持圖文消息。請注意:永久素材 id 必須是在“素材管理/新增永久素材”接口上傳後獲得的合法id。
  11. article_id:用戶點擊 article_id 類型按鈕後,微信客戶端將會以卡片形式,下發開發者在按鈕中填寫的圖文消息
  12. article_view_limited:類似 view_limited,但不使用 media_id 而使用 article_id

注意: 草稿接口灰度完成後,將不再支持圖文信息類型的 media_id 和 view_limited,有需要的,請使用 article_id 和 article_view_limited 代替

請注意,3到8的所有事件,僅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用戶,舊版本微信用戶點擊後將沒有迴應,開發者也不能正常接收到事件推送。9~12,是專門給第三方平臺旗下未微信認證(具體而言,是資質認證未通過)的訂閱號準備的事件類型,它們是沒有事件推送的,能力相對受限,其他類型的公衆號不必使用。

1.3、使用測試賬號

默認賬號沒有認證是不能新建自定義菜單的

可以使用平臺測試賬號調試接口

1.4、WebApi

Services文件夾下新建文件夾Menu和菜單服務MenuService.cs

新建創建菜單接口

namespace WeiXinApi.Application.Services
{
    public class MenuService : BaseService
    {

        /// <summary>
        /// 創建菜單
        /// </summary>
        /// <param name="resultFull"></param>
        /// <returns></returns>
        [HttpPost("/menu/add")]
        public dynamic CrateMenu(GetMenuResultFull resultFull)
        {
            try
            {
                var buttonGroup = CommonApi.GetMenuFromJsonResult(resultFull, new ButtonGroup()).menu;
                var result = CommonApi.CreateMenu(AppId, buttonGroup);
                if (result.errmsg == "ok")
                {
                    return "菜單更新成功";
                }
                else
                {
                    return result;
                }
            }
            catch (Exception ex)
            {

                throw Oops.Oh($"更新失敗:{ex.Message}");
            }

        }

    }
}

使用apipost測試接口

測試數據

{
	"menu": {
		"button": [
			{
				"type": "click",
				"name": "今日歌曲",
				"key": "V1001_TODAY_MUSIC"
			},
			{
				"name": "菜單",
				"sub_button": [
					{
						"type": "view",
						"name": "搜索",
						"url": "http://www.baidu.com/"
					},
					{
						"type": "click",
						"name": "贊一下我們",
						"key": "V1001_GOOD"
					}
				]
			},
			{
				"name": "發圖",
				"sub_button": [
					{
						"type": "pic_sysphoto",
						"name": "系統拍照發圖",
						"key": "rselfmenu_1_0",
						"sub_button": []
					},
					{
						"type": "pic_photo_or_album",
						"name": "拍照或者相冊發圖",
						"key": "rselfmenu_1_1",
						"sub_button": []
					},
					{
						"type": "pic_weixin",
						"name": "微信相冊發圖",
						"key": "rselfmenu_1_2",
						"sub_button": []
					}
				]
			}
		]
	}
}

二、查詢接口

2.1、說明

本接口將會提供公衆號當前使用的自定義菜單的配置,如果公衆號是通過 API 調用設置的菜單,則返回菜單的開發配置,而如果公衆號是在公衆平臺官網通過網站功能發佈菜單,則本接口返回運營者設置的菜單配置。

請注意:

  1. 第三方平臺開發者可以通過本接口,在旗下公衆號將業務授權給你後,立即通過本接口檢測公衆號的自定義菜單配置,並通過接口再次給公衆號設置好自動回覆規則,以提升公衆號運營者的業務體驗。
  2. 本接口與自定義菜單查詢接口的不同之處在於,本接口無論公衆號的接口是如何設置的,都能查詢到接口,而自定義菜單查詢接口則僅能查詢到使用 API 設置的菜單配置。
  3. 認證/未認證的服務號/訂閱號,以及接口測試號,均擁有該接口權限。
  4. 從第三方平臺的公衆號登錄授權機制上來說,該接口從屬於消息與菜單權限集。
  5. 本接口中返回的圖片/語音/視頻爲臨時素材(臨時素材每次獲取都不同,3天內有效,通過素材管理 - 獲取臨時素材接口來獲取這些素材),本接口返回的圖文消息爲永久素材素材(通過素材管理 - 獲取永久素材接口來獲取這些素材)。

2.2、WebApi

新建接口

        /// <summary>
        /// 獲取菜單
        /// </summary>
        /// <returns></returns>
        [HttpGet("/menu/list")]
        public dynamic GetMenu()
        {
            try
            {
                var result = CommonApi.GetMenu(AppId);
                if (result == null)
                {
                    throw Oops.Oh($"菜單不存在或驗證失敗");
                }
                else
                {
                    //正常序列化只返回菜單Name,因爲GetMenuResult裏面button只有name字段,所以這裏需要轉換一下
                    var menu = JsonConvert.DeserializeObject<GetMenuResultFull>(result.ToJson());
                    return menu;
                }
            }
            catch (Exception ex)
            {
                throw Oops.Oh($"菜單不存在或驗證失敗:{ex.Message}");

            }
        }

測試接口

三、刪除接口

3.1、說明

使用接口創建自定義菜單後,開發者還可使用接口刪除當前使用的自定義菜單。另請注意,在個性化菜單時,調用此接口會刪除默認菜單及全部個性化菜單。

3.2、WebApi

        /// <summary>
        /// 刪除菜單
        /// </summary>
        /// <returns></returns>
        [HttpGet("/menu/delete")]
        public dynamic Delete()
        {
            try
            {
                var result = CommonApi.DeleteMenu(AppId);
                if (result.errmsg == "ok")
                {
                    return "刪除菜單成功";
                }
                else
                {
                    return result.errmsg;
                }
            }
            catch (Exception ex)
            {
                throw Oops.Oh($"刪除菜單失敗:{ex.Message}");

            }

        }

請求測試

可以看到公衆號也就沒有菜單了

四、事件推送

詳情請看事件推送章節

五、個性化菜單

5.1、說明

爲了幫助公衆號實現靈活的業務運營,微信公衆平臺新增了個性化菜單接口,開發者可以通過該接口,讓公衆號的不同用戶羣體看到不一樣的自定義菜單。該接口開放給已認證訂閱號和已認證服務號。

開發者可以通過以下條件來設置用戶看到的菜單:

  1. 用戶標籤(開發者的業務需求可以藉助用戶標籤來完成)
  2. 性別
  3. 手機操作系統
  4. 地區(用戶在微信客戶端設置的地區)
  5. 語言(用戶在微信客戶端設置的語言)

注意:爲保護個人隱私,公衆號個性化菜單將不再支持對性別、地區、語言這類涉及個人隱私數據的信息進行篩選的功能,具體調整如下:

  1. 創建時,只要匹配條件中包含隱私信息的,將被拒絕,並返回錯誤碼 65320;
  2. 已經創建的,如包含隱私信息的則自動失效,不包含的則正常匹配;
  3. 開發者仍然可以正常通過測試接口,獲取到粉絲看到的菜單;
  4. 查詢個性化菜單時,所有規則正常顯示。

個性化菜單接口說明:

  1. 個性化菜單要求用戶的微信客戶端版本在iPhone6.2.2,Android 6.2.4以上,暫時不支持其他版本微信
  2. 菜單的刷新策略是,在用戶進入公衆號會話頁或公衆號 profile 頁時,如果發現上一次拉取菜單的請求在5分鐘以前,就會拉取一下菜單,如果菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公衆賬號後再次關注,則可以看到創建後的效果
  3. 普通公衆號的個性化菜單的新增接口每日限制次數爲2000次,刪除接口也是2000次,測試個性化菜單匹配結果接口爲20000次
  4. 出於安全考慮,一個公衆號的所有個性化菜單,最多隻能設置爲跳轉到3個域名下的鏈接
  5. 創建個性化菜單之前必須先創建默認菜單(默認菜單是指使用普通自定義菜單創建接口創建的菜單)。如果刪除默認菜單,個性化菜單也會全部刪除
  6. 個性化菜單接口支持用戶標籤,請開發者注意,當用戶身上的標籤超過1個時,以最後打上的標籤爲匹配

個性化菜單匹配規則說明:

個性化菜單的更新是會被覆蓋的。 例如公衆號先後發佈了默認菜單,個性化菜單1,個性化菜單2,個性化菜單3。那麼當用戶進入公衆號頁面時,將從個性化菜單3開始匹配,如果個性化菜單3匹配成功,則直接返回個性化菜單3,否則繼續嘗試匹配個性化菜單2,直到成功匹配到一個菜單。 根據上述匹配規則,爲了避免菜單生效時間的混淆,決定不予提供個性化菜單編輯API,開發者需要更新菜單時,需將完整配置重新發布一輪。 

5.2、創建個性化菜單

新增AddPersonalInput.cs類,用來接收前端傳過來的值

實體類內容

namespace WeiXinApi.Application.Services
{
    public class AddPersonalInput
    {
        /// <summary>
        /// 菜單
        /// </summary>
        public GetMenuResultFull ResultFull { get; set; }

        /// <summary>
        /// 規則
        /// </summary>
        public MenuMatchRule MenuMatchRule { get; set; }
    }
}

MenuService.cs新增接口

        /// <summary>
        /// 創建個性化菜單
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpPost("/menu/addpersonal")]
        public dynamic CratePersonalMenu(AddPersonalInput input)
        {
            try
            {
                WxJsonResult result = null;
                var buttonGroup = CommonApi.GetMenuFromJsonResult(input.ResultFull, new ConditionalButtonGroup()).menu;

                var addConditionalButtonGroup = buttonGroup as ConditionalButtonGroup;
                addConditionalButtonGroup.matchrule = input.MenuMatchRule;
                result = CommonApi.CreateMenuConditional(AppId, addConditionalButtonGroup);
                var message = $"menuid:{(result as CreateMenuConditionalResult).menuid}";
                if (result.errcode == 0)
                {
                    return "菜單更新成功:" + message;
                }
                else
                {
                    return result;
                }
            }
            catch (Exception ex)
            {

                throw Oops.Oh($"更新失敗:{ex.Message}");
            }

        }

啓動項目測試接口,成功添加

手機上測試看看效果

電腦上的微信還是原來的菜單

5.3、測試個性化菜單匹配結果

MenuService新建接口

        /// <summary>
        /// 測試個性化菜單匹配結果
        /// </summary>
        /// <param name="user_id"></param>
        /// <returns></returns>
        [HttpPost("/menu/test")]
        public dynamic PersonalMenuTest(string user_id)
        {
            var result = CommonApi.TryMatch(AppId, user_id);
            return result;
        }

測試一下,這裏沒有返回菜單,可能是因爲傳的userid,我沒有根據用戶的個性化設置,所以返回的是空的,不過這功能無關緊要,沒必要糾結。

六、本章Gitee地址鏈接

https://gitee.com/huguodong520/weixinapi/tree/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章