C# 获取微信参数二维码 scene_id———处理二维码

版权所有,禁止匿名转载;禁止商业使用。

 下面说一说我理解的微信二维码使用的过程,首先我们可以把自己想放在二维码里面的信息,使用自己的微信公共号生成这个二维码,通过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;  
  }


/// <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();  
  }


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);  
  }  
sharp] view plaincopy在CODE上查看代码片派生到我的代码片
otected 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; }  
  }


/// <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)  
   {  
message 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);  
   }


protected void Page_Load(object sender, EventArgs e)  
   {  
message 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”信息。


0 0