C#动态生成带参数的小程序二维码

一给  金牌会员 | 2024-7-21 09:26:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 542|帖子 542|积分 1626

 
应用场景

在微信小程序管理背景,我们可以生成下载标准的小程序二维码,提供主程序入口功能。在现实应用开发中,小程序二维码是可以携带参数的,可以动态举行生成,如如下场景:
1、不同参数决定的显示界面不同。
2、不同参数决定的功能不同。
3、由于小程序考核机制,我们将不同的应用集成在一个小程序里,通过不同的参数举行入口控制。

关键代码

操作界面

我们以一种验证、绑定手机的小程序功能为例,该小程序可以生成动态校验码,以实现现实业务应用的别的场景。界面中我们设计了提示信息Label,生成按钮 Button 和扫码图片 Image 等Asp.net控件。
示例界面如下,通过点击按钮,动态生成二维码图片,该参数将引导用户进入动态码生成功能:
​​


示例UI代码如下:

  1. <div class="user-box">
  2.             <span>验证手机</span><br>
  3.             <br>
  4.             <div class="query-box">
  5.                 <label>
  6.                     扫描二维码获取动态校验码</label>
  7.                 <br>
  8.                 <label>
  9.                     建议您PC注册,如果微信,可常按并选择前往图中包含的小程序打开(某些手机系统可能不支持此操作)</label></div>
  10.             <br>
  11.             <br>
  12.             <asp:Button ID="createCode" Text="新注册或换手机号点这里生成以获取动态校验码" Visible="true" CssClass="form-control"
  13.                 runat="server" OnClick="createCode_Click"></asp:Button>
  14.         </div>
  15.         <div class="user-box" id="ecodepanel" align="center" visible="false" runat="server">
  16.             <br />
  17.             <asp:Image ID="ecode" Width="200px" Height="200px" Visible="false" runat="server"></asp:Image>
  18.             <br>
  19.             <span style='color: silver'></span>
  20.             <br>
  21.             <br>
  22.         </div>
复制代码

服务端点击事件

点击按钮,通过设置参数值,并访问腾讯API,生成小程序二维码,转换为图片BASE64编码,假如生成成功则显示在Image控件里,点击事件的,示例代码如下:
  1. protected void createCode_Click(object sender, EventArgs e)
  2.     {
  3.         string paras = "reqvmobile";    //参数值设置
  4.                 //可以更改小程序二维码的色系
  5.         int r = 4;
  6.         int g = 128;
  7.         int b = 188;
  8.         ecode.ImageUrl = getBase64(255, r, g, b);   //将生成成功的BASE64编码赋值给Image控件
  9.         ecode.Visible = true;
  10.         ecodepanel.Visible = true;
  11.     }
  12.     //获取小程序二维码图片的 Base64值
  13.     string getBase64(string paras, int width, int linecolor_R, int linecolor_G, int linecolor_B)
  14.     {
  15.         string desimg = Request.PhysicalApplicationPath + "\\app_data\" + System.Guid.NewGuid().ToString() + ".jpg";  //目标图片临时路径
  16.                 //生成二维码图片文件
  17.         System.IO.File.WriteAllBytes(desimg, getMpBuffer(wxmp_accesstoken, paras, width, linecolor_R, linecolor_G, linecolor_B));
  18.         string base64 = ImgToBase64String(desimg, true);
  19.         System.IO.File.Delete(desimg);  //删除临时文件
  20.         return base64;
  21.     }
  22. //图片转BASE64方法
  23. public string ImgToBase64String(string Imagefilename,bool outFullString=false)
  24.             {
  25.                 try
  26.                 {
  27.                     System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(Imagefilename);
  28.                     MemoryStream ms = new MemoryStream();
  29.                     //            bmp.Save(ms,ImageFormat.Jpeg)
  30.                     System.Drawing.Imaging.ImageFormat iformat = System.Drawing.Imaging.ImageFormat.Jpeg;
  31.                     string extension = System.IO.Path.GetExtension(Imagefilename).Replace(".", "").ToLower();
  32.                     if (extension == "bmp")
  33.                     {
  34.                         iformat = System.Drawing.Imaging.ImageFormat.Bmp;
  35.                     }
  36.                     else if (extension == "emf")
  37.                     {
  38.                         iformat = System.Drawing.Imaging.ImageFormat.Emf;
  39.                     }
  40.                     else if (extension == "exif")
  41.                     {
  42.                         iformat = System.Drawing.Imaging.ImageFormat.Exif;
  43.                     }
  44.                     else if (extension == "gif")
  45.                     {
  46.                         iformat = System.Drawing.Imaging.ImageFormat.Gif;
  47.                     }
  48.                     else if (extension == "icon")
  49.                     {
  50.                         iformat = System.Drawing.Imaging.ImageFormat.Icon;
  51.                     }
  52.                     else if (extension == "png")
  53.                     {
  54.                         iformat = System.Drawing.Imaging.ImageFormat.Png;
  55.                     }
  56.                     else if (extension == "tiff")
  57.                     {
  58.                         iformat = System.Drawing.Imaging.ImageFormat.Tiff;
  59.                     }
  60.                     else if (extension == "wmf")
  61.                     {
  62.                         iformat = System.Drawing.Imaging.ImageFormat.Wmf;
  63.                     }
  64.                     bmp.Save(ms, iformat);
  65.                     byte[] arr = new byte[ms.Length];
  66.                     ms.Position = 0;
  67.                     ms.Read(arr, 0, (int)ms.Length);
  68.                     ms.Close();
  69.                     bmp.Dispose();
  70.                     string rv=Convert.ToBase64String(arr);
  71.                     if (outFullString == true)
  72.                     {
  73.                         rv = "data:image/" + extension + ";base64," + rv;
  74.                     }
  75.                     return rv;
  76.                 }
  77.                 catch (Exception ex)
  78.                 {
  79.                     return null;
  80.                 }
  81.             }
复制代码
 
生成小程序二维码

getMpBuffer(wxmp_accesstoken, paras, width, linecolor_R, linecolor_G, linecolor_B)方法返回byte[]类型,参数必要传递通过小程序Appid和AppSecret生成的合法令牌值;动态参数值;图像宽度;R/G/B的色系值。
方法代码如下:
  
  1. public byte[] getMpBuffer(string access_token, string scene, int width, int linecolor_R, int linecolor_G, int linecolor_B)
  2.         {
  3.             var url = string.Format("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={0}", access_token);
  4.             var postData = "{"scene":"" + scene + "","width":" + width.ToString() + ","line_color":{"r":" + linecolor_R.ToString() + ","g":" + linecolor_G.ToString() + ","b":" + linecolor_B.ToString() + "}}";
  5.             
  6.             System.Net.HttpWebRequest request;
  7.             request = (System.Net.HttpWebRequest)WebRequest.Create(url);
  8.             request.Method = "POST";
  9.             request.ContentType = "application/json;charset=UTF-8";
  10.             byte[] payload;
  11.             payload = System.Text.Encoding.UTF8.GetBytes(postData);
  12.             request.ContentLength = payload.Length;
  13.             Stream writer = request.GetRequestStream();
  14.             writer.Write(payload, 0, payload.Length);
  15.             writer.Close();
  16.             System.Net.HttpWebResponse response;
  17.             response = (System.Net.HttpWebResponse)request.GetResponse();
  18.             System.IO.Stream stream;
  19.             stream = response.GetResponseStream();
  20.             List<byte> bytes = new List<byte>();
  21.             int temp = stream.ReadByte();
  22.             while (temp != -1)
  23.             {
  24.                 bytes.Add((byte)temp);
  25.                 temp = stream.ReadByte();
  26.             }
  27.             byte[] result = bytes.ToArray();
  28.             return result;
  29.         }
复制代码


小结

最初我们设计的目标是用小程序实现一对一视频面试的功能,对于查询出来的记录,为考生和考官生成不同带参数的小程序二维码,并进入不同的功能。厥后由于集成了一些相关的功能应用,通过动态参数以决定不同的入口,以避免申请过多的小程序应用,到达低沉费用成本、维护成本的目的。

以上就是自己的一些分享,时间匆匆,不妥之处还请大家批评指正!









免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表