微信公共服務平台開發(.Net 的實現)9-------處理二維碼


   今天我們來共同學習一下微信公共服務平台中一個重要內容---二維碼掃描。眾所周知二維碼目前應用范圍很廣,在這里不再敘述背景了,但是值得一提的是目前大家手機上面應用的二維碼掃描工具是支持的都是QR碼和PDF417碼標准,這就是為什么你用各種掃碼工具掃出來的都一樣的原因,因為大家都使用了同樣的標准。

    在微信中的“掃一掃”功能也支持了這種標准,但是我們如果在微信公共服務平台中開發,使用的就不是這種標准了,而是微信自己的標准。也就是說如果你用通用軟件生成的二維碼“微信”,“我查查”等都可以掃描出來,但是你用微信公共服務平台中生成的二維碼,就“只能用微信的掃一掃進行掃描”,別的軟件掃描出來的結果均是微信自己加密的連接。這一點真的可以看出騰訊的野心了,不過話說回來了,你用人家的微信平台,肯定必須用人家的微信的掃一掃了。

    只是有一點,如果我們把生成好的二維碼貼出來,讓用戶掃的時候必須都要加上一句“請使用微信的掃一掃進行掃描”,也就是說用戶要想掃你的二維碼就必須用微信軟件,自己就必須用微信號!好陰險啊!!

    下面說一說我理解的微信二維碼使用的過程,首先我們可以把自己想放在二維碼里面的信息,使用自己的微信公共號生成這個二維碼,通過web或者什么以圖片的形式輸出出來,然后我們對這這個二維碼用微信的“掃一掃”掃描,如果你還未關注這個微信公共號,微信會提醒你關注,並反饋相應的信息,如果你關注了這個號,那么會自動反饋給你二維碼里面的內容。

    下面開始代碼的內容:
    首先我們參考微信的教程,使用自己的微信公共號生成一個二維碼,並通過web顯示出來。利用我們之前講過的Access_Token創建一個含有自己信息的Ticket,自己的信息在這里叫做“scene_id”。微信平台使用了這樣Json對象來描述Ticket:

臨時二維碼:
{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
第一個參數代表有效時間,第二個參數就是臨時二維碼的標識,是一個常量,第三個參數就是我們要放進去的“scene_id”

永久二維碼:
{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
只是缺少了有效時間,其他不再解釋了


看看下面創建Ticket的代碼,函數返回值是包含了我們自定義信息的Ticket:

 

/// <summary>
/// 創建二維碼ticket
/// </summary>
/// <returns></returns>
public static string CreateTicket(string TOKEN)
{

string result = "";
//string strJson = @"{""expire_seconds"":1800, ""action_name"": ""QR_SCENE"", ""action_info"": {""scene"": {""scene_id"":100000023}}}";
string strJson = @"{""action_name"": ""QR_LIMIT_SCENE"", ""action_info"": {""scene"": {""scene_id"":100000024}}}";
string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN;

WebClient myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;
try
{

result = myWebClient.UploadString(wxurl, "POST", strJson);
//WriteLog("上傳result:" + result);
Ticket _mode = JsonHelper.ParseFromJson<Ticket>(result);
//UploadMM _mode = JsonHelper.ParseFromJson<UploadMM>(result);
//result = _mode.ticket;
result = _mode.ticket + "_" + _mode.expire_seconds;
}
catch (Exception ex)
{
result = "Error:" + ex.Message;
}
//WriteLog("上傳MediaId:" + result);

return result;
}

創建了Ticket以后,我們再根據這個Ticket創建一個圖片,並保存在服務器上,函數返回的是圖片在服務器上的路徑(便於我們使用image控件顯示出來):

public string GetTicketImage(string TICKET)
{
string content = string.Empty;
string strpath = string.Empty;
string savepath = string.Empty;

string stUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + Server.UrlEncode(TICKET);

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl);

req.Method = "GET";

using (WebResponse wr = req.GetResponse())
{
HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
strpath = myResponse.ResponseUri.ToString();

WebClient mywebclient = new WebClient();

savepath = Server.MapPath("image") + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next().ToString().Substring(0, 4) + "." + myResponse.ContentType.Split('/')[1].ToString();

try
{
mywebclient.DownloadFile(strpath, savepath);
}
catch (Exception ex)
{
savepath = ex.ToString();
}


}
return strpath.ToString();
}

然后我們把這個圖片顯示出來就可以了:

protected void Page_Load(object sender, EventArgs e)
{
string _access_token = string.Empty;
_access_token = IsExistAccess_Token();

string str = CreateTicket(_access_token);
Response.Write(str + "<br/>");
str = str.Split('_')[0].ToString();
str = GetTicketImage(str);
Image1.ImageUrl = str;
Response.Write(str);
}

上面用到了一個Ticket類,我把代碼也粘貼出來:

 

/// <summary>
///Ticket 的摘要說明
/// </summary>
public class Ticket
{
public Ticket()
{
//
//TODO: 在此處添加構造函數邏輯
//
}

string _ticket;
string _expire_seconds;

/// <summary>
/// 獲取的二維碼ticket,憑借此ticket可以在有效時間內換取二維碼。
/// </summary>
public string ticket
{
get { return _ticket; }
set { _ticket = value; }
}

/// <summary>
/// 憑證有效時間,單位:秒
/// </summary>
public string expire_seconds
{
get { return _expire_seconds; }
set { _expire_seconds = value; }
}
}

 

第一部的工作我們做完了,按照微信自己的標准生成了一個包含我們自定義信息的二維碼了,下面就是掃碼過程了,這里您可以使用其他標准的掃碼工具掃一下試試,我們包含的“scene_id”信息是掃不出來的,剛才說過了,這不是一個標准的二維碼標准,是微信自己的!下面我們來寫一下微信掃碼的事件響應就OK了,這里有兩個事件:第一是我們沒有關注這個微信號時直接掃(掃完會提醒您關注),第二是我們已經關注后掃,我們把之前的代碼加上這兩個事件,不再解釋了:

 

protected void Page_Load(object sender, EventArgs e)
{
wxmessage wx = GetWxMessage();
string res = "";


if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
{
string content = "";
if (!wx.EventKey.Contains("qrscene_"))
{
content = "/:rose歡迎北京永傑友信科技有限公司/:rose\n直接回復“你好”";
res = sendTextMessage(wx, content);
}
else
{
content = "二維碼參數:\n" + wx.EventKey.Replace("qrscene_", "");
res = sendTextMessage(wx, content);
}
}

else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.ToLower() == "scan")
{
string str = "二維碼參數:\n" + wx.EventKey;
res = sendTextMessage(wx, str);
}
else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")
{
if(wx.EventKey=="HELLO")
res = sendTextMessage(wx, "你好,歡迎使用北京永傑友信科技有限公司公共微信平台!");
}
else
{
if (wx.MsgType == "text" && wx.Content == "你好")
{
res = sendTextMessage(wx, "你好,歡迎使用北京永傑友信科技有限公司公共微信平台!");
}
else if (wx.MsgType == "voice")
{
res = sendTextMessage(wx, wx.Recognition);
}
else
{
res = sendTextMessage(wx, "你好,未能識別消息!");
}
}

Response.Write(res);
}

 

 OK,這樣我們就完成了上面所設想的功能,掃碼后先判斷了是否關注,沒有關注的提示關注,然后反饋我們自定義的參數“scene_id”,如果關注了同樣直接反饋“scene_id”信息。

    這種應用很廣的,我現在能想象到的有以下幾個場景:
1、餐館/商店
    我們把每道菜都用一個二維碼進行標注,客人在點餐的時候使用微信的掃一掃功能進行點餐,第一次掃就提示客人請關注我們餐館的微信號,並點了第一個菜,然后第二道。。這樣我們就能很輕松的做到兩件事情,第一,他關注了我們的微信號(為了留住回頭客),第二,我們知道他喜歡吃什么口味,如喜歡川菜還是粵菜(為了給回頭客更好的推薦)

2、調查表
    雖然大家都關注的是同一個微信號,但是不同的二維碼有不同的意義,大家在掃碼的過程中會有不同的需求,比如說我們准備3個二維碼分別對應不同的表格給老中青三種客戶,用戶在掃碼的同時就可以進入表格進行填寫,如果在二維碼中加入調查員的信息,我們還能對調查員進行績效考核。

3、產品溯源
    同樣的道理,沒種產品或者不同的批次不同的地區都可以用不同的二維碼進行編碼,返回不同的信息,同時用戶在掃碼的同時又關注了我們的微信號。

4、掃碼支付
    利用臨時的二維碼,每一筆交易,不同的帳戶,不同的金額,生成不同的碼,用戶拍完以后進入不同的“微支付”。

 


    用途很多很多,不過還是那個前提-----“只能用微信掃!”
    先就說這么多吧,等我把這些最基礎的技術開發寫完,我們在來共同探討和開發幾個成品案例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM