“让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等。新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优惠劵!本文介绍微信公众平台下二维码海报的开发过程。

一、微信二维码海报介绍

微信二维码海报是指在海报中嵌入和微信用户关联的参数二维码的海报,用户分享推广之后,新用户可以被统计为被推广人员数,从而达到增加粉丝的传播效果。其使用场景如下:

二、开发流程

在微信二维码海报生成中,需要用到以下信息

1. 自定义菜单中设置一个菜单项,点击后返回二维码海报给用户

2. 接口接收到菜单点击之后,获取用户的头像、ID(可以使用OpenID)

3. 生成和用户关联的参数二维码,

4. 将参数二维码进行缩放

5. 将头像和参数二维码合并成新的参数二维码图片

6. 将新参数二维码图片做为水印合成到背景海报中

7. 将用户昵称,以及二维码时间戳(类型为临时二维码时)等文字合成到背景海报中

8. 将海报上传成临时图片素材

9. 将图片素材使用客服接口发送给用户。

上述便是生成这张海报所需的资源及知识点,咱一步一步来哈

1、首先,模板图片,找公司PS高手,做一个就行

2、微信带参数二维码的生成

  1. #region 获取用于换取二维码的Ticket
  2. /// <summary>
  3. /// 获取用于换取二维码(临时二维码和长久二维码)的Ticket
  4. /// </summary>
  5. /// <param name="senceId">场景值ID</param>
  6. /// <param name="type">值为:long 时:代表长久性二维码 值为short时:代表临时二维码</param>
  7. /// <returns></returns>
  8. public static string GeterweimaTicket(int senceId, string type = "short")
  9. {
  10. string Ticket = "";
  11. CreateQrCodeResult re = new CreateQrCodeResult();
  12. try
  13. {
  14. if (type == "short")//临时二维码
  15. {
  16.  
  17. re = QrCodeApi.Create(IsExistAccess_Token2(), , senceId);
  18. }
  19. else
  20. {
  21. re = QrCodeApi.Create(IsExistAccess_Token2(), , senceId);
  22. }
  23. Ticket = re.ticket;
  24. }
  25. catch
  26. {
  27. if (type == "short")//临时二维码
  28. {
  29.  
  30. Ticket = CreateTicket(IsExistAccess_Token2());
  31. }
  32. else
  33. {
  34. Ticket = CreateLongTicket(IsExistAccess_Token2());
  35. }
  36. }
  37.  
  38. return Ticket;
  39. }
  40.  
  41. #region 原方法
  42.  
  43. /// <summary>
  44. /// 创建二维码ticket 临时二维码
  45. /// </summary>
  46. /// <returns></returns>
  47. public static string CreateTicket(string TOKEN)
  48. {
  49.  
  50. string result = "";
  51. string strJson = @"{""expire_seconds"": 604800, ""action_name"": ""QR_SCENE"", ""action_info"": {""scene"": {""scene_id"": 321}}}";
  52. string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN + "";
  53. result = GetPage(wxurl, strJson);
  54. result = GetJsonValue(result, "ticket");//获取票据
  55. ////LogHelper.WriteLog(result);
  56. return result;
  57. }
  58.  
  59. /// <summary>
  60. /// 获取永久二维码Ticket
  61. /// </summary>
  62. /// <param name="TOKEN"></param>
  63. /// <returns></returns>
  64. public static string CreateLongTicket(string TOKEN)
  65. {
  66.  
  67. string result = "";
  68. string strJson = @"{""action_name"": ""QR_LIMIT_SCENE"", ""action_info"": {""scene"": {""scene_id"": 123}}}";
  69. string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN + "";
  70. result = GetPage(wxurl, strJson);
  71. result = GetJsonValue(result, "ticket");//获取票据
  72. ////LogHelper.WriteLog(result);
  73. return result;
  74. }
  75.  
  76. //{"ticket":"gQFw8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL3pFZ3lETjdsMVNDcy1DRW9PMmE3AAIEP1TcVAMECAcAAA==","expire_seconds":1800,"url":"http:\/\/weixin.qq.com\/q\/zEgyDN7l1SCs-CEoO2a7"}
  77. /// <summary>
  78. /// 通过ticket换取二维码
  79. /// </summary>
  80. /// <param name="TICKET">票据</param>
  81. /// <param name="openId">二维码依照openId 命名</param>
  82. /// <param name="Pth">相对路径 @"\weixin\HuLu\erweima2"</param>
  83. /// <returns>下载二维码成功后的物理路径:D:\XXXXXX.com\kkk\erweima2\201503031044566511190.jpg</returns>
  84. public static string GetTicketImage(string TICKET, string openId, string Pth)
  85. {
  86. string content = string.Empty;
  87. string strpath = string.Empty;//生成的URL 也就是 关注的URL
  88. string savepath = string.Empty;//图片保存的路径
  89.  
  90. string stUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + HttpContext.Current.Server.UrlEncode(TICKET);
  91.  
  92. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl);
  93.  
  94. req.Method = "GET";
  95.  
  96. using (WebResponse wr = req.GetResponse())
  97. {
  98. HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
  99. strpath = myResponse.ResponseUri.ToString();
  100.  
  101. WebClient mywebclient = new WebClient();
  102. // @"
  103. savepath = HttpContext.Current.Server.MapPath(Pth) + "\\" + openId + "." + myResponse.ContentType.Split('/')[].ToString();
  104. // //LogHelper.WriteLog(savepath);
  105.  
  106. try
  107. {
  108. mywebclient.DownloadFile(strpath, savepath);//下载生成的二维码图片
  109. }
  110. catch (Exception ex)
  111. {
  112. savepath = ex.ToString();
  113. LogHelper.WriteLog("错误了" + savepath);
  114. }
  115.  
  116. }
  117.  
  118. //LogHelper.WriteLog(savepath.ToString() + "都给我滚!");
  119. return savepath.ToString();
  120.  
  121. }
  122. #endregion
  123.  
  124. #endregion

3、获取用户头像并下载:

  1. #region 获取用户的详细信息
  2. /// <summary>
  3. /// 获取用户的详细信息
  4. /// </summary>
  5. /// <param name="REFRESH_TOKEN">Token</param>
  6. /// <param name="OPENID">用户的OpenId</param>
  7. /// <returns>str</returns>
  8. public static Dictionary<string, object> Get_UserInfo(string REFRESH_TOKEN, string OPENID)
  9. {
  10. // Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);
  11. string UserInfo = GetJson("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);
  12. Dictionary<string, Object> obj2 = JsonConvert.DeserializeObject<Dictionary<string, Object>>(UserInfo);
  13. return obj2;
  14. }
  15.  
  16. protected static string GetJson(string url)
  17. {
  18. WebClient wc = new WebClient();
  19. wc.Credentials = CredentialCache.DefaultCredentials;
  20. wc.Encoding = Encoding.UTF8;
  21. string returnText = wc.DownloadString(url);
  22.  
  23. if (returnText.Contains("errcode"))
  24. {
  25. //可能发生错误
  26. }
  27. //Response.Write(returnText);
  28. return returnText;
  29. }
  30. #endregion

用户信息用有个HeardImage 就是粉丝的头像路径,然后根据这个路径,我们把它下载下来!

  1. public class HttpDownLoad
  2. {
  3. private long fileLength;
  4. private long downLength;//已经下载文件大小,外面想用就改成公共属性
  5. private static bool stopDown;
  6. public HttpDownLoad()
  7. {
  8. fileLength = ;
  9. downLength = ;
  10. stopDown = false;
  11. //
  12. // TODO: 在此处添加构造函数逻辑
  13. //
  14. }
  15.  
  16. /// <summary>
  17. /// 文件下载
  18. /// </summary>
  19. /// <param name="url">连接</param>
  20. /// <param name="fileName">本地保存文件名</param>
  21. public void httpDownFile(string url, string fileName)
  22. {
  23. stopDown = false;
  24. Stream str = null, fs = null;
  25. try
  26. {
  27. //获取下载文件长度
  28. fileLength = getDownLength(url);
  29. downLength = ;
  30. if (fileLength > )
  31. {
  32. WebClient DownFile = new WebClient();
  33. str = DownFile.OpenRead(url);
  34. //判断并建立文件
  35. if (createFile(fileName))
  36. {
  37. byte[] mbyte = new byte[];
  38. int readL = str.Read(mbyte, , );
  39. fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
  40. //读取流
  41. while (readL != )
  42. {
  43. if (stopDown)
  44. break;
  45. downLength += readL;//已经下载大小
  46. fs.Write(mbyte, , readL);//写文件
  47. readL = str.Read(mbyte, , );//读流
  48. //progressBar.Value = (int)(downLength * 100 / fileLength);
  49. //label.Text = progressBar.Value.ToString() + "%";
  50. //System.Windows.Forms.Application.DoEvents();
  51. }
  52. str.Close();
  53. fs.Close();
  54. }
  55. }
  56. }
  57. catch (Exception ex)
  58. {
  59. if (str != null)
  60. str.Close();
  61. if (fs != null)
  62. fs.Close();
  63.  
  64. }
  65. }
  66. /// <summary>
  67. /// 文件下载
  68. /// </summary>
  69. /// <param name="url">连接</param>
  70. /// <param name="fileName">本地保存文件名</param>
  71. public void httpDownFile2(string url, string fileName)
  72. {
  73. try
  74. {
  75. WebClient DownFile = new WebClient();
  76. DownFile.DownloadFile(url, fileName);
  77. }
  78. catch (Exception ex)
  79. {
  80. throw ex;
  81. }
  82. }
  83. /// <summary>
  84. /// 获取下载文件大小
  85. /// </summary>
  86. /// <param name="url">连接</param>
  87. /// <returns>文件长度</returns>
  88. private long getDownLength(string url)
  89. {
  90. try
  91. {
  92. WebRequest wrq = WebRequest.Create(url);
  93. WebResponse wrp = (WebResponse)wrq.GetResponse();
  94. wrp.Close();
  95. return wrp.ContentLength;
  96. }
  97. catch (Exception ex)
  98. {
  99. return ;
  100. throw ex;
  101.  
  102. }
  103. }
  104. /// <summary>
  105. /// 建立文件(文件如已经存在,删除重建)
  106. /// </summary>
  107. /// <param name="fileName">文件全名(包括保存目录)</param>
  108. /// <returns></returns>
  109. private bool createFile(string fileName)
  110. {
  111. try
  112. {
  113. if (File.Exists(fileName))
  114. {
  115. File.Delete(fileName);
  116. }
  117. Stream s = File.Create(fileName);
  118. s.Close();
  119. return true;
  120. }
  121. catch (Exception ex)
  122. {
  123. return false;
  124. throw ex;
  125.  
  126. }
  127. }
  128. public void downClose()
  129. {
  130. stopDown = true;
  131. }
  132.  
  133. }

此时:二维码和头像都生成了,我们就可以调用图片合成的方法了<注意:此处需要二次图片合成,第一次是模板和二维码合成,第二次是把得到的新图片和头像再做一次合成

  1. #region C#图片处理 合并图片
  2. /// <summary>
  3. /// 调用此函数后使此两种图片合并,类似相册,有个
  4. /// 背景图,中间贴自己的目标图片
  5. /// </summary>
  6. /// <param name="sourceImg">粘贴的源图片</param>
  7. /// <param name="destImg">粘贴的目标图片</param>
  8. /// 使用说明: string pic1Path = Server.MapPath(@"\testImg\wf.png");
  9. /// 使用说明: string pic2Path = Server.MapPath(@"\testImg\yj.png");
  10. /// 使用说明: System.Drawing.Image img = CombinImage(pic1Path, pic2Path);
  11. /// 使用说明:img.Save(Server.MapPath(@"\testImg\Newwf.png"));
  12. public static System.Drawing.Image CombinImage(string sourceImg, string destImg)
  13. {
  14. System.Drawing.Image imgBack = System.Drawing.Image.FromFile(sourceImg); //相框图片
  15. System.Drawing.Image img = System.Drawing.Image.FromFile(destImg); //照片图片
  16.  
  17. //从指定的System.Drawing.Image创建新的System.Drawing.Graphics
  18. Graphics g = Graphics.FromImage(imgBack);
  19.  
  20. g.DrawImage(imgBack, , , , ); // g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
  21. g.FillRectangle(System.Drawing.Brushes.Black, , , (int) + , ((int) + ));//相片四周刷一层黑色边框
  22.  
  23. //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
  24. g.DrawImage(img, , , , );
  25. GC.Collect();
  26. return imgBack;
  27. }
  28. #endregion

最后就是上传至服务器并获取MediaId和发送给粉丝了,这一块相信大家都比较熟悉,不作多的解释!

不懂的加我微信:18217688158 或者QQ:1936048197

C#开发微信公众平台开发-微信海报介绍和开发流程的更多相关文章

  1. 微信公众平台推出"微信保护"提升微信账号安全 附微信保护开启教程

    前两天小美女的微信公众平台要群发消息时提示需要绑定手机才能操作,当时还以为是动态ip的问题,今天微信公众平台安全中心就说升级了,原来那时已经在公测了.微信公众平台推出"微信保护", ...

  2. 微信公众平台—— 获取微信服务器IP地址

    微信公众平台—— 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...

  3. [c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单

    前7篇把最基础的消息接收和回复全做完了,  也把高级接口的入口和分拆处理写好了空方法,  此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...

  4. [c#]asp.net开发微信公众平台(5)微信图文消息

    上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml> ...

  5. 微信公众平台:微信JS-SDK Demo

    ylbtech-微信公众平台:微信JS-SDK Demo 1. HTML返回顶部 1.demo.html <!DOCTYPE html> <html> <head> ...

  6. [c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值

    上一篇已经搭建好整体框架,实现了入口的验证,   验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理 ...

  7. 微信公众平台测试号 “微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003”

    设置"网页授权获取用户基本信息" 点击"修改" 弹出"OAuth2.0网页授权",注意域名不加"https://"或&q ...

  8. 微信公众平台开放JS-SDK(微信内网页开发工具包)

    微信公众平台开放JS-SDK(微信内网页开发工具包),这次开放接口是质的飞跃,是对开发者和广大用户一个利好的消息.未来的公众号图文消息会更丰富多彩,准备脑洞大开吧!(第三方平台正式支持接入微信公众平台 ...

  9. 微信公众平台入门开发教程.Net(C#)框架

    一.序言 一直在想第一次写博客,应该写点什么好?正好最近在研究微信公众平台开发,索性就记录下,分享下自己的心得,也分享下本人简单模仿asp.net运行机制所写的通用的微信公众平台开发.Net(c#)框 ...

  10. 微信公众平台开发(84) 小i机器人

    很多朋友询问如何开发小黄鸡之类的智能聊天机器人,但遗憾的是小黄鸡接口申请页面在最近几个月里都无法访问,且使用时限制太大,我们找了另一个接口:小i机器人.本文介绍如何在微信公众平台中使用小i接口开发智能 ...

随机推荐

  1. AFNetworking你最最最起码要知道的基本使用~

    AFNetworking是一个在iOS开发中,使用非常多的一个开源库 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperatio ...

  2. list+map

    通常读取数据库表中的一条记录后,可以存储于Hashmap变量中:若要读取多条记录,则依次读取每个记录时,先用Hashmap变量存取,然后将Hashmap加到ArrayList变量中. 注意: 每次读取 ...

  3. Remember the Word UVALive - 3942(dp+trie)

    题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好 ...

  4. [51nod1847]奇怪的数学题

    description 51nod 求\[\sum_{i=1}^{n}\sum_{j=1}^{n}sgcd(i,j)^k\]其中\(sgcd(i,j)\)表示\(i,j\)的次大公约数,如果\(gcd ...

  5. java规范(三)-----判空----方法内的为空判断

    一般我们判空或者有判断条件时 都是使用 if(条件成立){ 执行代码 } 这样的逻辑. 但是如果对象的字段很深层次时或者条件很多时就容易形成很多个{}的情况,这样就容易分不出哪个花括号属于哪部分.如下 ...

  6. 64位win10系统无法安装.Net framework3.5的两种解决方法【转】

    近日有网友反映在windows10_64位系统电脑上安装Net framework3.5,操作时总失败,怎么办呢?小编下面就介绍win10 64位系统无法安装Net framework3.5的两种解决 ...

  7. 【agc008F】Black Radius

    Portal --> agc008F Solution  这题好神仙啊qwq疯狂orz看懂日文题解的sjk太强啦qwq ​   ​  首先我们要统计的东西,是一个涂黑的连通块,然后我们考虑找一个 ...

  8. 图像处理之中值滤波介绍及C实现

    1 中值滤波概述 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号平滑处理技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波的基本原理是把数字图像或数字序 ...

  9. Window启动Zookeeper报错java.lang.NumberFormatException: For input string:

    用zkServer start命令报如题的错误,改为直接用zkServer启动则ok 还有在window下,myid文件不能是myid.txt,不能带文件格式 dataDir=D:/zookeeper ...

  10. 2.aop中几个注解的含义

    参考地址:http://elim.iteye.com/blog/2395255