咱们在微信公众号开发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),及时了解最新动态。
扫描二维码当即关注