当前位置:   article > 正文

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

c#小程序码生成base64

 

应用场景

微信小程序管理后台,我们可以生成下载标准的小程序二维码,提供主程序入口功能。在实际应用开发中,小程序二维码是可以携带参数的,可以动态进行生成,如如下场景:

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. System.Net.HttpWebRequest request;
  6. request = (System.Net.HttpWebRequest)WebRequest.Create(url);
  7. request.Method = "POST";
  8. request.ContentType = "application/json;charset=UTF-8";
  9. byte[] payload;
  10. payload = System.Text.Encoding.UTF8.GetBytes(postData);
  11. request.ContentLength = payload.Length;
  12. Stream writer = request.GetRequestStream();
  13. writer.Write(payload, 0, payload.Length);
  14. writer.Close();
  15. System.Net.HttpWebResponse response;
  16. response = (System.Net.HttpWebResponse)request.GetResponse();
  17. System.IO.Stream stream;
  18. stream = response.GetResponseStream();
  19. List<byte> bytes = new List<byte>();
  20. int temp = stream.ReadByte();
  21. while (temp != -1)
  22. {
  23. bytes.Add((byte)temp);
  24. temp = stream.ReadByte();
  25. }
  26. byte[] result = bytes.ToArray();
  27. return result;
  28. }

小结

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/507771
推荐阅读
相关标签
  

闽ICP备14008679号