微信公衆號開發C#系列-十一、生成帶參數二維碼應用場景

一、概述

咱們在微信公衆號開發C#系列-七、消息管理-接收事件推送章節有對掃描帶參數二維碼事件的處理作了講解。本篇主要講解經過微信公衆號開發平臺提供的接口生成帶參數的二維碼及應用場景。php

微信公衆號平臺提供了生成帶參數二維碼的接口,使用該接口能夠得到多個帶不一樣場景值的二維碼,用戶掃描後,公衆號能夠接收到事件推送。
目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過時時間,最大爲1800秒,但可以生成較多數量,後者無過時時間,數量較少(目前參數只支持1--100000)。兩種二維碼分別適用於賬號綁定、用戶來源統計等場景。nginx

用戶掃描帶場景值二維碼時,可能推送如下兩種事件:git

  1. 若是用戶還未關注公衆號,則用戶能夠關注公衆號,關注後微信會將帶場景值關注事件推送給開發者。github

  2. 若是用戶已經關注公衆號,在用戶掃描後會自動進入會話,微信也會將帶場景值掃描事件推送給開發者。json

獲取帶參數的二維碼的過程包括兩步,首先建立二維碼ticket,而後憑藉ticket到指定URL換取二維碼。api

二、建立二維碼ticket

每次建立二維碼ticket須要提供一個開發者自行設定的參數(scene_id),分別介紹臨時二維碼和永久二維碼的建立二維碼ticket過程。服務器

2.一、建立臨時二維碼接口說明

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"}}}

2.二、建立永久二維碼接口說明

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"}}}

2.三、參數說明

參數說明框架

參數 說明
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 二維碼圖片解析後的地址,開發者可根據該地址自行生成須要的二維碼圖片

2.四、經過ticket換取二維碼

獲取二維碼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;
}

在上面的代碼中用戶掃描了帶場景值的二維碼進入公衆號後咱們返回了一個提示的文本消息。這是很是有用的功能,經常使用途推廣,能夠根據不一樣的二維碼場景值分別作不一樣的業務處理,如能夠統計關注的每個粉絲從哪裏來的,作到渠道推廣分析,可是關注的都是同一個公衆號。

經過掃描帶場景值的二維碼進入

五、生成帶參數的二維碼用途

微信公衆號生成帶參數的二維碼有何用途?

  1. 能夠區分粉絲來源,只須要生成不一樣的帶參數的二維碼,把這些二維碼分別投放到各個渠道,粉絲經過這些渠道二維碼進來就能夠區分粉絲來源,微號幫後臺渠道粉絲列表中有粉絲數及明細;
  2. 粉絲經過掃描渠道二維碼關注公衆號,會打標籤分組,好比粉絲掃商店A、B的二維碼進來的, 在微信公衆號後來的用戶管理中可查看到商店A/B二維碼名下的粉絲明細及分組狀況;
  3. 能夠生成多個不一樣的渠道二維碼配置不一樣的營銷活動,設置不一樣的關注回覆信息,讓粉絲第一時間瞭解活動動機,是否有興趣參與等等;
  4. 能夠利用渠道二維碼生成功能,能夠實現微信收款前關注公衆號,間接分析粉絲後續消費狀況;
    考覈推廣員完成任務的進度,如以推廣名字生成多不個同的二維碼,分配給不一樣的推廣員,每一個推廣員吸引了多少粉絲關注公衆號,微號幫後臺均可以一一明細;
  5. 帶參數的二維碼也叫渠道二維碼或者場景二維碼,生存的數量有限,且是永久二維碼。當數量用完後能夠刪除一些不用的二維碼釋放出來,二次利用。
  6. 其餘用途。

參考文章

微信公衆平臺技術文檔-官方

Senparc.Weixin SDK + 官網示例源代碼

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),及時瞭解最新動態。

掃描二維碼當即關注

微信號:guosisoft

相關文章
相關標籤/搜索