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

一、微信二维码海报介绍

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

二、开发流程

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

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

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

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

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

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

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

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

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

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

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

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

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

#region 获取用于换取二维码的Ticket
/// <summary>
/// 获取用于换取二维码(临时二维码和长久二维码)的Ticket
/// </summary>
/// <param name="senceId">场景值ID</param>
/// <param name="type">值为:long 时:代表长久性二维码 值为short时:代表临时二维码</param>
/// <returns></returns>
public static string GeterweimaTicket(int senceId, string type = "short")
{
string Ticket = "";
CreateQrCodeResult re = new CreateQrCodeResult();
try
{
if (type == "short")//临时二维码
{ re = QrCodeApi.Create(IsExistAccess_Token2(), , senceId);
}
else
{
re = QrCodeApi.Create(IsExistAccess_Token2(), , senceId);
}
Ticket = re.ticket;
}
catch
{
if (type == "short")//临时二维码
{ Ticket = CreateTicket(IsExistAccess_Token2());
}
else
{
Ticket = CreateLongTicket(IsExistAccess_Token2());
}
} return Ticket;
} #region 原方法 /// <summary>
/// 创建二维码ticket 临时二维码
/// </summary>
/// <returns></returns>
public static string CreateTicket(string TOKEN)
{ string result = "";
string strJson = @"{""expire_seconds"": 604800, ""action_name"": ""QR_SCENE"", ""action_info"": {""scene"": {""scene_id"": 321}}}";
string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN + "";
result = GetPage(wxurl, strJson);
result = GetJsonValue(result, "ticket");//获取票据
////LogHelper.WriteLog(result);
return result;
} /// <summary>
/// 获取永久二维码Ticket
/// </summary>
/// <param name="TOKEN"></param>
/// <returns></returns>
public static string CreateLongTicket(string TOKEN)
{ string result = "";
string strJson = @"{""action_name"": ""QR_LIMIT_SCENE"", ""action_info"": {""scene"": {""scene_id"": 123}}}";
string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN + "";
result = GetPage(wxurl, strJson);
result = GetJsonValue(result, "ticket");//获取票据
////LogHelper.WriteLog(result);
return result;
} //{"ticket":"gQFw8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL3pFZ3lETjdsMVNDcy1DRW9PMmE3AAIEP1TcVAMECAcAAA==","expire_seconds":1800,"url":"http:\/\/weixin.qq.com\/q\/zEgyDN7l1SCs-CEoO2a7"}
/// <summary>
/// 通过ticket换取二维码
/// </summary>
/// <param name="TICKET">票据</param>
/// <param name="openId">二维码依照openId 命名</param>
/// <param name="Pth">相对路径 @"\weixin\HuLu\erweima2"</param>
/// <returns>下载二维码成功后的物理路径:D:\XXXXXX.com\kkk\erweima2\201503031044566511190.jpg</returns>
public static string GetTicketImage(string TICKET, string openId, string Pth)
{
string content = string.Empty;
string strpath = string.Empty;//生成的URL 也就是 关注的URL
string savepath = string.Empty;//图片保存的路径 string stUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + HttpContext.Current.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 = HttpContext.Current.Server.MapPath(Pth) + "\\" + openId + "." + myResponse.ContentType.Split('/')[].ToString();
// //LogHelper.WriteLog(savepath); try
{
mywebclient.DownloadFile(strpath, savepath);//下载生成的二维码图片
}
catch (Exception ex)
{
savepath = ex.ToString();
LogHelper.WriteLog("错误了" + savepath);
} } //LogHelper.WriteLog(savepath.ToString() + "都给我滚!");
return savepath.ToString(); }
#endregion #endregion

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

#region 获取用户的详细信息
/// <summary>
/// 获取用户的详细信息
/// </summary>
/// <param name="REFRESH_TOKEN">Token</param>
/// <param name="OPENID">用户的OpenId</param>
/// <returns>str</returns>
public static Dictionary<string, object> Get_UserInfo(string REFRESH_TOKEN, string OPENID)
{
// Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);
string UserInfo = GetJson("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);
Dictionary<string, Object> obj2 = JsonConvert.DeserializeObject<Dictionary<string, Object>>(UserInfo);
return obj2;
} protected static string GetJson(string url)
{
WebClient wc = new WebClient();
wc.Credentials = CredentialCache.DefaultCredentials;
wc.Encoding = Encoding.UTF8;
string returnText = wc.DownloadString(url); if (returnText.Contains("errcode"))
{
//可能发生错误
}
//Response.Write(returnText);
return returnText;
}
#endregion

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

public class HttpDownLoad
{
private long fileLength;
private long downLength;//已经下载文件大小,外面想用就改成公共属性
private static bool stopDown;
public HttpDownLoad()
{
fileLength = ;
downLength = ;
stopDown = false;
//
// TODO: 在此处添加构造函数逻辑
//
} /// <summary>
/// 文件下载
/// </summary>
/// <param name="url">连接</param>
/// <param name="fileName">本地保存文件名</param>
public void httpDownFile(string url, string fileName)
{
stopDown = false;
Stream str = null, fs = null;
try
{
//获取下载文件长度
fileLength = getDownLength(url);
downLength = ;
if (fileLength > )
{
WebClient DownFile = new WebClient();
str = DownFile.OpenRead(url);
//判断并建立文件
if (createFile(fileName))
{
byte[] mbyte = new byte[];
int readL = str.Read(mbyte, , );
fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
//读取流
while (readL != )
{
if (stopDown)
break;
downLength += readL;//已经下载大小
fs.Write(mbyte, , readL);//写文件
readL = str.Read(mbyte, , );//读流
//progressBar.Value = (int)(downLength * 100 / fileLength);
//label.Text = progressBar.Value.ToString() + "%";
//System.Windows.Forms.Application.DoEvents();
}
str.Close();
fs.Close();
}
}
}
catch (Exception ex)
{
if (str != null)
str.Close();
if (fs != null)
fs.Close(); }
}
/// <summary>
/// 文件下载
/// </summary>
/// <param name="url">连接</param>
/// <param name="fileName">本地保存文件名</param>
public void httpDownFile2(string url, string fileName)
{
try
{
WebClient DownFile = new WebClient();
DownFile.DownloadFile(url, fileName);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 获取下载文件大小
/// </summary>
/// <param name="url">连接</param>
/// <returns>文件长度</returns>
private long getDownLength(string url)
{
try
{
WebRequest wrq = WebRequest.Create(url);
WebResponse wrp = (WebResponse)wrq.GetResponse();
wrp.Close();
return wrp.ContentLength;
}
catch (Exception ex)
{
return ;
throw ex; }
}
/// <summary>
/// 建立文件(文件如已经存在,删除重建)
/// </summary>
/// <param name="fileName">文件全名(包括保存目录)</param>
/// <returns></returns>
private bool createFile(string fileName)
{
try
{
if (File.Exists(fileName))
{
File.Delete(fileName);
}
Stream s = File.Create(fileName);
s.Close();
return true;
}
catch (Exception ex)
{
return false;
throw ex; }
}
public void downClose()
{
stopDown = true;
} }

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

#region C#图片处理 合并图片
/// <summary>
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
/// </summary>
/// <param name="sourceImg">粘贴的源图片</param>
/// <param name="destImg">粘贴的目标图片</param>
/// 使用说明: string pic1Path = Server.MapPath(@"\testImg\wf.png");
/// 使用说明: string pic2Path = Server.MapPath(@"\testImg\yj.png");
/// 使用说明: System.Drawing.Image img = CombinImage(pic1Path, pic2Path);
/// 使用说明:img.Save(Server.MapPath(@"\testImg\Newwf.png"));
public static System.Drawing.Image CombinImage(string sourceImg, string destImg)
{
System.Drawing.Image imgBack = System.Drawing.Image.FromFile(sourceImg); //相框图片
System.Drawing.Image img = System.Drawing.Image.FromFile(destImg); //照片图片 //从指定的System.Drawing.Image创建新的System.Drawing.Graphics
Graphics g = Graphics.FromImage(imgBack); g.DrawImage(imgBack, , , , ); // g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
g.FillRectangle(System.Drawing.Brushes.Black, , , (int) + , ((int) + ));//相片四周刷一层黑色边框 //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(img, , , , );
GC.Collect();
return imgBack;
}
#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. UVA11736_Debugging RAM

    题目绝对够水,我就不详细说明了. 直接上代码吧.只是提示一下要用 unsigned long long. (不知道我不用字典树为什么会超时,肿么搞的) #include <iostream> ...

  2. android面试(4)---文件存储

    1.sharePreference? SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. SharedPreferences保存数据,其背后是用xml文件存放 ...

  3. git commad

    repo forall -c 'echo $REPO_PATH;ssh trd.git.htc.com -p29419 -lowen_wen gerrit create-project --submi ...

  4. 关于在springmvc下使用@RequestBody报http status 415的错误解决办法

    网上有很多原因,进行整理后主要有以下几类 springmvc添加配置.注解: pom.xml添加jackson包引用: Ajax请求时没有设置Content-Type为application/json ...

  5. 洛谷 P2574 XOR的艺术

    刚刚学了,线段树,一道线段树入门题试试水 下面是题面 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个 ...

  6. 【BZOJ3714】Kuglarz(最小生成树)

    [BZOJ3714]Kuglarz(最小生成树) 题面 BZOJ Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯 ...

  7. BZOJ3451 Tyvj1953 Normal 【期望 + 点分治 + NTT】

    题目链接 BZOJ3451 题解 考虑每个点产生的贡献,即为该点在点分树中的深度期望值 由于期望的线性,最后的答案就是每个点贡献之和 对于点对\((i,j)\),考虑\(j\)成为\(i\)祖先的概率 ...

  8. 最长上升子序列nlogn算法

    LIS问题是经典的动态规划问题,它的状态转移相信大家都很熟悉: f[i] = f[k] + 1  (k < i 且 A[k] < A[i]) 显然这样做复杂度是O(n^2) 有没有更快的算 ...

  9. 日志分割工具——cronolog

    使用cronolog可以格式化日志文件的格式,比如按时间分割,易于管理和分析. 1.下载软件 http://cronolog.org/download/index.html 用法见 lighttpd配 ...

  10. 【CF123E】Maze

    Portal --> cf123E Solution 首先步数的话可以转化成每条边经过了几次这样来算 假设现在确定了起点\(S\)和终点\(T\),我们将\(T\)看成树根,那么考虑边\((u, ...