咱們在微信公衆號開發C#系列-七、消息管理-接收事件推送章節有對掃描帶參數二維碼事件的處理作了講解。本篇主要講解經過微信公衆號開發平臺提供的接口生成帶參數的二維碼及應用場景。php
微信公衆號平臺提供了生成帶參數二維碼的接口,使用該接口能夠得到多個帶不一樣場景值的二維碼,用戶掃描後,公衆號能夠接收到事件推送。
目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過時時間,最大爲1800秒,但可以生成較多數量,後者無過時時間,數量較少(目前參數只支持1--100000)。兩種二維碼分別適用於賬號綁定、用戶來源統計等場景。nginx
用戶掃描帶場景值二維碼時,可能推送如下兩種事件:git
若是用戶還未關注公衆號,則用戶能夠關注公衆號,關注後微信會將帶場景值關注事件推送給開發者。github
若是用戶已經關注公衆號,在用戶掃描後會自動進入會話,微信也會將帶場景值掃描事件推送給開發者。json
獲取帶參數的二維碼的過程包括兩步,首先建立二維碼ticket,而後憑藉ticket到指定URL換取二維碼。api
每次建立二維碼ticket須要提供一個開發者自行設定的參數(scene_id),分別介紹臨時二維碼和永久二維碼的建立二維碼ticket過程。服務器
http請求方式: POST微信
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST數據格式:json POST數據例子: {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可使用如下POST數據建立字符串形式的二維碼參數:微信公衆平臺
{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
http請求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST數據格式:json POST數據例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可使用如下POST數據建立字符串形式的二維碼參數: {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
參數說明框架
參數 | 說明 |
---|---|
expire_seconds | 該二維碼有效時間,以秒爲單位。 最大不超過2592000(即30天),此字段若是不填,則默認有效期爲30秒。 |
action_name | 二維碼類型,QR_SCENE爲臨時的整型參數值,QR_STR_SCENE爲臨時的字符串參數值,QR_LIMIT_SCENE爲永久的整型參數值,QR_LIMIT_STR_SCENE爲永久的字符串參數值 |
action_info 二維碼詳細信息 | |
scene_id | 場景值ID,臨時二維碼時爲32位非0整型,永久二維碼時最大值爲100000(目前參數只支持1--100000) |
scene_str | 場景值ID(字符串形式的ID),字符串類型,長度限制爲1到64 |
返回說明
正確的Json返回結果:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}
參數 | 說明 |
---|---|
ticket | 獲取的二維碼ticket,憑藉此ticket能夠在有效時間內換取二維碼。 |
expire_seconds | 該二維碼有效時間,以秒爲單位。 最大不超過2592000(即30天)。 |
url | 二維碼圖片解析後的地址,開發者可根據該地址自行生成須要的二維碼圖片 |
獲取二維碼ticket後,開發者可用ticket換取二維碼圖片。請注意,本接口無須登陸態便可調用。
請求說明
HTTP GET請求(請使用https協議)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET 提醒:TICKET記得進行UrlEncode
返回說明
ticket正確狀況下,http 返回碼是200,是一張圖片,能夠直接展現或者下載。 HTTP頭(示例)以下: Accept-Ranges:bytes Cache-control:max-age=604800 Connection:keep-alive Content-Length:28026 Content-Type:image/jpg Date:Wed, 16 Oct 2013 06:37:10 GMT Expires:Wed, 23 Oct 2013 14:37:10 +0800 Server:nginx/1.4.1 錯誤狀況下(如ticket非法)返回HTTP錯誤碼404。
咱們能夠直接使用Senparc.Weixin SDK提供的接口Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.Create來建立臨時或永久二維碼。
利用Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.GetShowQrCodeUrl來獲取臨時或永久二維碼。
Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi代碼參考:
//API:http://mp.weixin.qq.com/wiki/index.php?title=%E7%94%9F%E6%88%90%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E4%BA%8C%E7%BB%B4%E7%A0%81 /// <summary> /// 二維碼接口 /// </summary> public static class QrCode { /// <summary> /// 建立二維碼 /// </summary> /// <param name="expireSeconds">該二維碼有效時間,以秒爲單位。 最大不超過1800。0時爲永久二維碼</param> /// <param name="sceneId">場景值ID,臨時二維碼時爲32位整型,永久二維碼時最大值爲1000</param> /// <returns></returns> public static CreateQrCodeResult Create(string accessToken, int expireSeconds, int sceneId) { var urlFormat = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}"; object data = null; if (expireSeconds > 0) { data = new { expire_seconds = expireSeconds, action_name = "QR_SCENE", action_info = new { scene = new { scene_id = sceneId } } }; } else { data = new { action_name = "QR_LIMIT_SCENE", action_info = new { scene = new { scene_id = sceneId } } }; } return CommonJsonSend.Send<CreateQrCodeResult>(accessToken, urlFormat, data); } /// <summary> /// 獲取二維碼(不須要AccessToken) /// 錯誤狀況下(如ticket非法)返回HTTP錯誤碼404。 /// </summary> /// <param name="ticket"></param> /// <param name="stream"></param> public static void ShowQrCode(string ticket, Stream stream) { var urlFormat = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={0}"; HttpUtility.Get.Download(string.Format(urlFormat, ticket), stream); } }
要使用微信提供的永久或臨時二維碼的功能,咱們須要界面來生成或獲取二維碼,以下圖所示。
控制器代碼參考:
[HttpPost] [ValidateInput(false)] [LoginAuthorize] public ActionResult GenerateQrCode() { string ticket = CacheFactory.Cache().GetCache<string>("Weixin-Qr-Ticket"); if (string.IsNullOrEmpty(ticket)) { WeixinOfficialAccountEntity currentWeixinOfficialAccountEntity = RDIFrameworkService.Instance.WeixinBasicService.GetCurrentOfficialAccountEntity(ManageProvider.Provider.Current()); string token = currentWeixinOfficialAccountEntity.AccessToken; var result = Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.Create(token, 600, 10, Senparc.Weixin.MP.QrCode_ActionName.QR_SCENE); if (result.errcode == Senparc.Weixin.ReturnCode.請求成功) { ticket = result.ticket; CacheFactory.Cache().WriteCache<string>(result.ticket, "Weixin-Qr-Ticket", DateTime.Now.AddSeconds(600)); } } string qrUrl = Senparc.Weixin.MP.AdvancedAPIs.QrCodeApi.GetShowQrCodeUrl(ticket); return Content(new JsonMessage { Success = true, Data = qrUrl, Type = ResultType.Success, Message = RDIFrameworkMessage.MSG3010 }.ToString()); }
上面的代碼咱們建立了一個場景值爲10的臨時二維碼。用戶經過掃描這個二維碼,咱們就能夠在服務器端作處理,掃描帶參數二維碼事件只須要重寫OnEvent_ScanRequest事件代碼便可,以下咱們返回了一個文本消息,實現代碼參考:
public override IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage) { //經過掃描關注 var responseMessage = CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = responseMessage.Content ?? string.Format("歡迎關注國思軟件,經過掃描二維碼進入,場景值:{0}", requestMessage.EventKey); return responseMessage; }
在上面的代碼中用戶掃描了帶場景值的二維碼進入公衆號後咱們返回了一個提示的文本消息。這是很是有用的功能,經常使用途推廣,能夠根據不一樣的二維碼場景值分別作不一樣的業務處理,如能夠統計關注的每個粉絲從哪裏來的,作到渠道推廣分析,可是關注的都是同一個公衆號。
微信公衆號生成帶參數的二維碼有何用途?
RDIFramework.NET — 基於.NET的快速信息化系統開發框架 — 系列目錄
RDIFramework.NET ━ .NET快速信息化系統開發框架 ━ 工做流程組件介紹
RDIFramework.NET框架SOA解決方案(集Windows服務、WinForm形式與IIS形式發佈)-分佈式應用
RDIFramework.NET代碼生成器全新V3.5版本發佈-重大升級
一路走來數個年頭,感謝RDIFramework.NET框架的支持者與使用者,你們能夠經過下面的地址瞭解詳情。
RDIFramework.NET官方網站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
同時須要說明的,之後的全部技術文章以官方網站爲準,歡迎你們收藏!
RDIFramework.NET框架由專業團隊長期打造、一直在更新、一直在升級,請放心使用!
歡迎關注RDIFramework.net框架官方公衆微信(微信號:guosisoft),及時瞭解最新動態。
掃描二維碼當即關注