临时二维码:
{"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:
///
/// 创建二维码ticket
///
///
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(result);
//UploadMM _mode = JsonHelper.ParseFromJson(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 + "
");
str = str.Split('_')[0].ToString();
str = GetTicketImage(str);
Image1.ImageUrl = str;
Response.Write(str);
}
上面用到了一个Ticket类,我把代码也粘贴出来:
///
///Ticket 的摘要说明
///
public class Ticket
{
public Ticket()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
string _ticket;
string _expire_seconds;
///
/// 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
///
public string ticket
{
get { return _ticket; }
set { _ticket = value; }
}
///
/// 凭证有效时间,单位:秒
///
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”信息。
用途很多很多,不过还是那个前提-----“只能用微信扫!”
先就说这么多吧,等我把这些最基础的技术开发写完,我们在来共同探讨和开发几个成品案例。