C#开发微信公众平台开发-微信海报介绍和开发流程
“让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等。新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优惠劵!本文介绍微信公众平台下二维码海报的开发过程。
一、微信二维码海报介绍
微信二维码海报是指在海报中嵌入和微信用户关联的参数二维码的海报,用户分享推广之后,新用户可以被统计为被推广人员数,从而达到增加粉丝的传播效果。其使用场景如下:
二、开发流程
在微信二维码海报生成中,需要用到以下信息
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#开发微信公众平台开发-微信海报介绍和开发流程的更多相关文章
- 微信公众平台推出"微信保护"提升微信账号安全 附微信保护开启教程
前两天小美女的微信公众平台要群发消息时提示需要绑定手机才能操作,当时还以为是动态ip的问题,今天微信公众平台安全中心就说升级了,原来那时已经在公测了.微信公众平台推出"微信保护", ...
- 微信公众平台—— 获取微信服务器IP地址
微信公众平台—— 获取微信服务器IP地址 const ServerIpUrl = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?&acces ...
- [c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单
前7篇把最基础的消息接收和回复全做完了, 也把高级接口的入口和分拆处理写好了空方法, 此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...
- [c#]asp.net开发微信公众平台(5)微信图文消息
上篇已经成功响应了关注事件,也实现了文本消息的发送,这篇开始图文消息处理, 微信中最常用的消息类型就是图文消息了,因为它图文并茂,最能表达信息. 图文消息在微信中的接口定义如下: <xml> ...
- 微信公众平台:微信JS-SDK Demo
ylbtech-微信公众平台:微信JS-SDK Demo 1. HTML返回顶部 1.demo.html <!DOCTYPE html> <html> <head> ...
- [c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值
上一篇已经搭建好整体框架,实现了入口的验证, 验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理 ...
- 微信公众平台测试号 “微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003”
设置"网页授权获取用户基本信息" 点击"修改" 弹出"OAuth2.0网页授权",注意域名不加"https://"或&q ...
- 微信公众平台开放JS-SDK(微信内网页开发工具包)
微信公众平台开放JS-SDK(微信内网页开发工具包),这次开放接口是质的飞跃,是对开发者和广大用户一个利好的消息.未来的公众号图文消息会更丰富多彩,准备脑洞大开吧!(第三方平台正式支持接入微信公众平台 ...
- 微信公众平台入门开发教程.Net(C#)框架
一.序言 一直在想第一次写博客,应该写点什么好?正好最近在研究微信公众平台开发,索性就记录下,分享下自己的心得,也分享下本人简单模仿asp.net运行机制所写的通用的微信公众平台开发.Net(c#)框 ...
- 微信公众平台开发(84) 小i机器人
很多朋友询问如何开发小黄鸡之类的智能聊天机器人,但遗憾的是小黄鸡接口申请页面在最近几个月里都无法访问,且使用时限制太大,我们找了另一个接口:小i机器人.本文介绍如何在微信公众平台中使用小i接口开发智能 ...
随机推荐
- 【JavaScript】时间戳转日期格式
时间戳: 1480570979000 $.ajax({ url : "getOrderMsg?shiplabel="+ shiplabel, type : "get&qu ...
- 【Mybatis】Mybatis的sql模糊查询
这个网站中有很多方法.https://code.google.com/p/mybatis/issues/detail?id=85 自己试验了如下的方法. 1. 参数中直接加入%% param.set ...
- 洛谷 P2146 [NOI2015]软件包管理器
真没有想到,这竟然会是一道NOI的原题,听RQY说,这套题是北大出的,北大脑抽认为树剖很难... 只恨没有早学几年OI,只A这一道题也可以出去吹自己一A了NOI原题啊 好了,梦该醒了,我们来看题 以后 ...
- 【BZOJ3566】概率充电器(动态规划)
[BZOJ3566]概率充电器(动态规划) 题面 BZOJ Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: "采用全新纳米级加工 ...
- python基础(4)
条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if ag ...
- Notes of fwt
昨天考试由于不会fwt而爆炸,所以今天搞了一下fwt……话说这玩意的普及程度已经很高了.fwt,快速沃尔什变换,可以用于位运算卷积的优化,是一种线性变换,所以就会有许多好的性质(eg:可以直接模,可以 ...
- 框架----Django框架(进阶篇)
一.Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层 ...
- SAS数据步与过程步,数据步语句
SAS数据步与过程步,数据步语句http://www.biostatistic.net/thread-2045-1-1.html ---转载---原文作者:biostar(出处: 生物统计家园) 数 ...
- STL源码分析-iterator
http://note.youdao.com/noteshare?id=4efcb6441063dae956c226f91c161897
- 调整的R方_如何选择回归模型
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...