知识点
相关文章
更多最近更新
更多微信公共服务平台开发(.Net 的实现)9-------处理二维码
2019-03-02 00:59|来源: 网路
今天我们来共同学习一下微信公共服务平台中一个重要内容---二维码扫描。众所周知二维码目前应用范围很广,在这里不再叙述背景了,但是值得一提的是目前大家手机上面应用的二维码扫描工具是支持的都是QR码和PDF417码标准,这就是为什么你用各种扫码工具扫出来的都一样的原因,因为大家都使用了同样的标准。
在微信中的“扫一扫”功能也支持了这种标准,但是我们如果在微信公共服务平台中开发,使用的就不是这种标准了,而是微信自己的标准。也就是说如果你用通用软件生成的二维码“微信”,“我查查”等都可以扫描出来,但是你用微信公共服务平台中生成的二维码,就“只能用微信的扫一扫进行扫描”,别的软件扫描出来的结果均是微信自己加密的连接。这一点真的可以看出腾讯的野心了,不过话说回来了,你用人家的微信平台,肯定必须用人家的微信的扫一扫了。
只是有一点,如果我们把生成好的二维码贴出来,让用户扫的时候必须都要加上一句“请使用微信的扫一扫进行扫描”,也就是说用户要想扫你的二维码就必须用微信软件,自己就必须用微信号!好阴险啊!!
下面说一说我理解的微信二维码使用的过程,首先我们可以把自己想放在二维码里面的信息,使用自己的微信公共号生成这个二维码,通过web或者什么以图片的形式输出出来,然后我们对这这个二维码用微信的“扫一扫”扫描,如果你还未关注这个微信公共号,微信会提醒你关注,并反馈相应的信息,如果你关注了这个号,那么会自动反馈给你二维码里面的内容。
下面开始代码的内容:
首先我们参考微信的教程,使用自己的微信公共号生成一个二维码,并通过web显示出来。利用我们之前讲过的Access_Token创建一个含有自己信息的Ticket,自己的信息在这里叫做“scene_id”。微信平台使用了这样Json对象来描述Ticket:
临时二维码:
{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
第一个参数代表有效时间,第二个参数就是临时二维码的标识,是一个常量,第三个参数就是我们要放进去的“scene_id”
永久二维码:
{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
只是缺少了有效时间,其他不再解释了
看看下面创建Ticket的代码,函数返回值是包含了我们自定义信息的Ticket:
/// <summary>
/// 创建二维码ticket
/// </summary>
/// <returns></returns>
public static string CreateTicket(string TOKEN)
{
string result = "";
//string strJson = @"{""expire_seconds"":1800, ""action_name"": ""QR_SCENE"", ""action_info"": {""scene"": {""scene_id"":100000023}}}";
string strJson = @"{""action_name"": ""QR_LIMIT_SCENE"", ""action_info"": {""scene"": {""scene_id"":100000024}}}";
string wxurl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + TOKEN;
WebClient myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;
try
{
result = myWebClient.UploadString(wxurl, "POST", strJson);
//WriteLog("上传result:" + result);
Ticket _mode = JsonHelper.ParseFromJson<Ticket>(result);
//UploadMM _mode = JsonHelper.ParseFromJson<UploadMM>(result);
//result = _mode.ticket;
result = _mode.ticket + "_" + _mode.expire_seconds;
}
catch (Exception ex)
{
result = "Error:" + ex.Message;
}
//WriteLog("上传MediaId:" + result);
return result;
}
创建了Ticket以后,我们再根据这个Ticket创建一个图片,并保存在服务器上,函数返回的是图片在服务器上的路径(便于我们使用image控件显示出来):
public string GetTicketImage(string TICKET)
{
string content = string.Empty;
string strpath = string.Empty;
string savepath = string.Empty;
string stUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + 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 = Server.MapPath("image") + "\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next().ToString().Substring(0, 4) + "." + myResponse.ContentType.Split('/')[1].ToString();
try
{
mywebclient.DownloadFile(strpath, savepath);
}
catch (Exception ex)
{
savepath = ex.ToString();
}
}
return strpath.ToString();
}
然后我们把这个图片显示出来就可以了:
protected void Page_Load(object sender, EventArgs e)
{
string _access_token = string.Empty;
_access_token = IsExistAccess_Token();
string str = CreateTicket(_access_token);
Response.Write(str + "<br/>");
str = str.Split('_')[0].ToString();
str = GetTicketImage(str);
Image1.ImageUrl = str;
Response.Write(str);
}
上面用到了一个Ticket类,我把代码也粘贴出来:
/// <summary>
///Ticket 的摘要说明
/// </summary>
public class Ticket
{
public Ticket()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
string _ticket;
string _expire_seconds;
/// <summary>
/// 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
/// </summary>
public string ticket
{
get { return _ticket; }
set { _ticket = value; }
}
/// <summary>
/// 凭证有效时间,单位:秒
/// </summary>
public string expire_seconds
{
get { return _expire_seconds; }
set { _expire_seconds = value; }
}
}
第一部的工作我们做完了,按照微信自己的标准生成了一个包含我们自定义信息的二维码了,下面就是扫码过程了,这里您可以使用其他标准的扫码工具扫一下试试,我们包含的“scene_id”信息是扫不出来的,刚才说过了,这不是一个标准的二维码标准,是微信自己的!下面我们来写一下微信扫码的事件响应就OK了,这里有两个事件:第一是我们没有关注这个微信号时直接扫(扫完会提醒您关注),第二是我们已经关注后扫,我们把之前的代码加上这两个事件,不再解释了:
protected void Page_Load(object sender, EventArgs e)
{
wxmessage wx = GetWxMessage();
string res = "";
if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
{
string content = "";
if (!wx.EventKey.Contains("qrscene_"))
{
content = "/:rose欢迎北京永杰友信科技有限公司/:rose\n直接回复“你好”";
res = sendTextMessage(wx, content);
}
else
{
content = "二维码参数:\n" + wx.EventKey.Replace("qrscene_", "");
res = sendTextMessage(wx, content);
}
}
else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.ToLower() == "scan")
{
string str = "二维码参数:\n" + wx.EventKey;
res = sendTextMessage(wx, str);
}
else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")
{
if(wx.EventKey=="HELLO")
res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
}
else
{
if (wx.MsgType == "text" && wx.Content == "你好")
{
res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
}
else if (wx.MsgType == "voice")
{
res = sendTextMessage(wx, wx.Recognition);
}
else
{
res = sendTextMessage(wx, "你好,未能识别消息!");
}
}
Response.Write(res);
}
OK,这样我们就完成了上面所设想的功能,扫码后先判断了是否关注,没有关注的提示关注,然后反馈我们自定义的参数“scene_id”,如果关注了同样直接反馈“scene_id”信息。
这种应用很广的,我现在能想象到的有以下几个场景:
1、餐馆/商店
我们把每道菜都用一个二维码进行标注,客人在点餐的时候使用微信的扫一扫功能进行点餐,第一次扫就提示客人请关注我们餐馆的微信号,并点了第一个菜,然后第二道。。这样我们就能很轻松的做到两件事情,第一,他关注了我们的微信号(为了留住回头客),第二,我们知道他喜欢吃什么口味,如喜欢川菜还是粤菜(为了给回头客更好的推荐)
2、调查表
虽然大家都关注的是同一个微信号,但是不同的二维码有不同的意义,大家在扫码的过程中会有不同的需求,比如说我们准备3个二维码分别对应不同的表格给老中青三种客户,用户在扫码的同时就可以进入表格进行填写,如果在二维码中加入调查员的信息,我们还能对调查员进行绩效考核。
3、产品溯源
同样的道理,没种产品或者不同的批次不同的地区都可以用不同的二维码进行编码,返回不同的信息,同时用户在扫码的同时又关注了我们的微信号。
4、扫码支付
利用临时的二维码,每一笔交易,不同的帐户,不同的金额,生成不同的码,用户拍完以后进入不同的“微支付”。
用途很多很多,不过还是那个前提-----“只能用微信扫!”
先就说这么多吧,等我把这些最基础的技术开发写完,我们在来共同探讨和开发几个成品案例。
转自:http://www.cnblogs.com/lyl6796910/p/3661145
相关问答
更多-
java开发微信扫码支付,如何生成时效二维码和永久二维码?[2023-11-08]
不清楚,但是我看融贝支付 的安卓app就可以实现你说的这些功能 -
制作一个扫描二维码的安卓手机软件需要什么软件?具体是怎么实现?[2022-03-01]
ZXing开源项目,支持多种语言的一维、二维码开源项目,网上有些文章讲过简化,不过都太浅,可以下一个android的源码看看,项目本身功能实现就很好、很强大。开发平台的话:JDK、eclipse、android sdk就可以了。 -
微信怎么用二维码扫描激活[2024-03-06]
第一种扫一扫添加好友方式: 1.登陆微信,点击朋友们,进入“朋友们”界面 2.点击“添加朋友”,然后手机界面会出现一个“扫一扫” 3.点击“扫一扫”,在手机上面就会出现一个扫描取景框。 4.将自己的摄像头对准需要好友的二维码,让好友二维码出现在手机的取景框当中 5.扫描成功后,会在手机上面出现该账号信息,然后点击“关注”即可快速添加好友。 第二中扫一扫添加好友方式: 1.登陆手机微信,回到微信消息界面。然后点击右上角的“魔术棒” 2.点击魔术棒后,在弹出的菜单选项中选择"扫一扫".即可快速进入二维码扫一扫快 ... -
至于微信怎么扫描二维码 :其实是很简单的。 微信--朋友们--添加朋友--扫一扫 其实就这么简单了、不是很难。
-
java(jsp) 微信扫描二维码登陆网页[2022-04-26]
使用OAuth2.0引导用户跳转到redirect_uri的地址,跳转的时候会带上一个参数code,拿这个code调用 接口/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF -
微信带参二维码PHP保存本地问题[2022-05-14]
这个是不是ticket不对造成的~ 目前js也可以生成二维码了,我用过,挺好用的! git地址:github.com/jeromeetienne/jquery-qrcode -
现在的微信公众平台修改密码需要扫描二维码,之后怎么操作啊?[2022-07-10]
1、登陆微信公众平台,点设置里边的安全中心。 2、点修改密码右边的修改。 3、用管理微信号扫描二维码,并点击确认。 4、输入密码,再输入新密码,第二次输入新密码确认,输入验证码,点确认。就ok啦 -
错误信息翻译过来,是“该token下生成的二维码数量已经超出范围了。” 但实际上,有可能该token已经失效了。(吐槽一下微信API接口写得稀烂…)
-
微信公众平台怎么设置有参数的二维码?[2022-01-05]
按照微信API的开发者文档,扫描带参数的二维码后,服务端回收到两种类型的事件消息。不管是未关注还是已关注,在EventKey里面都带有二维码的场景参数。请自行度娘“微信 开发者文档”。 -
绝大部分情况下不需要调用微信开放平台的接口,只用到了微信公众账号的开发者模式就完成了; 如果想进一步改善用户体验,需要使用服务号调用微信 网页授权获取用户基本信息 接口。 基本认证流程: 用户设备(手机、Pad、笔电)连接到Wi-Fi热点 提供热点的终端节点(路由器/AP)上的WiFiDog拦截用户网络,将用户HTTP请求转向到云端AC服务器 (可跳过)云端AC服务器返回网页提醒用户进行认证 (可跳过)用户在网页或APP里完成认证(开放认证、粉丝认证、自主或定制认证) 云端AC服务器通知终端节点放行 抛开更 ...