上一篇讲了普通关注的各种情景,接下来准备详细讲解带参数的二维码的应用实例。在下一篇详解之前,这里先介绍一下如何下载二维码、生成二维码表,为后续的应用做好准备。

为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。使用接口过程中有任何问题,可以前往微信开放社区 #公众号 专区发帖交流。

一、带参数二维码类型

目前有2种类型的二维码:

1、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

2、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景。

二、获取二维码方法

用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。

创建二维码ticket

每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。

临时二维码请求说明

http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可以使用以下POST数据创建字符串形式的二维码参数:{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

永久二维码请求说明

http请求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST数据格式:json POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可以使用以下POST数据创建字符串形式的二维码参数: {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

 三、代码实现

1、首先在网站根目录下创建QrCodeTg目录,用于存放获取的带参数二维码图片。

2、数据库中创建带参数二维码清单,创建语句如下

--带参数二维码配置表
CREATE TABLE weixin_qrcode_ticket
(scene_id int,                      --带参数二维码id,用于查找二维码图片create_time datetime,              --从微信服务器获取二维码时间qrcode_image_url nvarchar(100),    --从微信服务器获取的二维码保存位置,生成自己的urldistribute_time datetime,          --二维码分配给推广人、合伙人的时间open_id nvarchar(40),              --推广人、合伙人的openidscan_image_url nvarchar(100),      --扫码返回图文的logo图片链接scan_title nvarchar(100),          --扫码返回图文的文字标题scan_title_sub nvarchar(100),      --扫码返回图文的子标题scan_redirect_url nvarchar(100),   --扫码后如果直接跳转链接,导向新链接的网址red_packet_flag nvarchar(4),       --是否给扫码的微信用户发红包red_packet_min float,              --给扫码的微信用户发红包的随机值最小值red_packet_max float,              --给扫码的微信用户发红包的随机值最大值r_red_packet_flag nvarchar(4),     -是否给推广人发红包r_red_packet_min float,            --给推广人发红包的随机值最小值r_red_packet_max float,            --给推广人发红包的随机值最小值logo_image_name nvarchar(100),     --二维码对应商铺的LOGOshop_name nvarchar(100),           --二维码对应商铺的名称shop_id nvarchar(12),              --二维码对应商铺的iduser_id nvarchar(20),              --推广人的编码,一般用手机号user_name nvarchar(200),           --推广人的姓名scan_type nvarchar(20),            --推广活动名称scan_text nvarchar(200)            --推广活动简介
) 

3、使用微信服务器提供的api接口,批量下载二维码图片到QrCodeTg目录,并把记录添加到weixin_qrcode_ticket表中。

前端页面:QrCode.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="QrCode.aspx.cs" Inherits="Jjlm.QrCode" %><!DOCTYPE html><html>
<head id="Head1" runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link href="Css/SqltIndex.css" rel="stylesheet" type="text/css" /><title>获取指定范围二维码</title><style></style>
</head><body style="text-align:center;width:100%;margin:0 auto;background-color: #ffffff;"><center><form id="form1" runat="server"><div></div><asp:Label runat="server" id="lbResult"/></br></br><asp:Label runat="server" id="lbopenid" Visible="false"/></br></form></center>
</body></html>

后端页面:QrCode.aspx.cs

using System;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Text.RegularExpressions;
using LitJson;
using System.Net;
using System.IO;
using QinMing.Config;
using QinMing.WeixinContainer;
using QinMing.Tools;namespace Jjlm
{public partial class QrCode : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){if(QinMing.Tools.QinMingTools.IsHasSQLInject(Request.QueryString["snum"])){Response.Write("请勿非法尝试!");Response.End();}if(QinMing.Tools.QinMingTools.IsHasSQLInject(Request.QueryString["enum"])){Response.Write("请勿非法尝试!");Response.End();}SqlConnection conn = new SqlConnection(QinMingConfig.DatabaseConnStr);conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;SqlConnection conn1 = new SqlConnection(QinMingConfig.DatabaseConnStr);conn1.Open();SqlCommand cmd1 = new SqlCommand();cmd1.Connection = conn1;SqlDataReader dr1;string start_num = Request.QueryString["snum"];string end_num = Request.QueryString["enum"];for(int i = Convert.ToInt32(start_num); i <= Convert.ToInt32(end_num); i = i + 1){cmd1.CommandText = "select * from weixin_qrcode_ticket where scene_id=" + i.ToString() + " ";dr1 = cmd1.ExecuteReader();if (dr1.Read()){//库内已存在该scene_id的带参数二维码,不再重复生成}else{string tmpurl = GetewmPic(i.ToString());cmd.CommandText = "insert into weixin_qrcode_ticket (scene_id,create_time,qrcode_image_url) values(" + i.ToString() + ",getdate(),'" + tmpurl + "')";cmd.ExecuteScalar();                     }dr1.Close();}cmd1.CommandText = "select max(scene_id) max_scene_id from weixin_qrcode_ticket ";dr1 = cmd1.ExecuteReader();if (dr1.Read()){lbResult.Text = "目前带参数二维码已生成总数为:" + dr1["max_scene_id"].ToString();}dr1.Close();if (conn.State == ConnectionState.Open){conn.Close();conn.Dispose();}if (conn1.State == ConnectionState.Open){conn1.Close();conn1.Dispose();}}}public string GetewmPic(string scene_id)  {  QinMingWeixinContainer gt=new QinMingWeixinContainer();string access_token = gt.GetAccessToken();string tocket = "";  string pic="";  string poster = "{\"action_name\": \"QR_LIMIT_SCENE\",\"action_info\": {\"scene\": { \"scene_id\": " + scene_id + " } } }";//二维码永久请求格式  string tockes = GetPage("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + access_token, poster);  //return tockes;if(tockes.IndexOf("ticket") > -1)  {  JsonData bejson = JsonMapper.ToObject(tockes);  tocket = (String)bejson["ticket"];  tocket = Uri.EscapeDataString(tocket);  //TICKET必需UrlEncode  }  //return tocket;string Picurl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + tocket;  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Picurl);  System.Drawing.Image img = System.Drawing.Image.FromStream(req.GetResponse().GetResponseStream());  string newfilename = "qrcode_tg_" + scene_id + ".jpg";//二维码图片路径  string address = HttpContext.Current.Server.MapPath("/QrCodeTg/" + newfilename);  img.Save(address);  pic = "QrCodeTg/" + newfilename;  return pic;  }public static string GetPage(string posturl, string postData)  {  Stream outstream = null;  Stream instream = null;  StreamReader sr = null;  HttpWebResponse response = null;  HttpWebRequest request = null;  Encoding encoding = Encoding.UTF8;  byte[] data = encoding.GetBytes(postData);  // 准备请求...  try  {  // 设置参数  request = WebRequest.Create(posturl) as HttpWebRequest;  CookieContainer cookieContainer = new CookieContainer();  request.CookieContainer = cookieContainer;  request.AllowAutoRedirect = true;  request.Method = "POST";  request.ContentType = "application/x-www-form-urlencoded";  request.ContentLength = data.Length;  outstream = request.GetRequestStream();  outstream.Write(data, 0, data.Length);  outstream.Close();  //发送请求并获取相应回应数据  response = request.GetResponse() as HttpWebResponse;  //直到request.GetResponse()程序才开始向目标网页发送Post请求  instream = response.GetResponseStream();  sr = new StreamReader(instream, encoding);  //返回结果网页(html)代码  string content = sr.ReadToEnd();  string err = string.Empty;  return content;  }  catch (Exception ex)  {  string err = ex.Message;  return string.Empty;  }  }  }}

四、结果演示

在浏览器地址栏输入http://www.yourweb.com/weixin/QrCode.aspx?snum=1&enum=1000

QrCodeTg目录将会下载scene_id编号为1-1000的二维码图片。

实例:用C#.NET手把手教你做微信公众号开发(11)--生成带参数二维码相关推荐

  1. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下jsapi支付,场景就是在微信内打开某个页面,完成在线支付,同样一个网页,使用微信打开就是js ...

  2. 实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式

    在做线上.线下销售时,可以使用微信便捷支付,通过微信公众号收款有很多种收款方式,如下图: 今天我们来讲一下H5场景支付,使用手机浏览器打开就是H5方式,最常见的推广是短信内置链接,这种场景需要调用微信 ...

  3. 实例:用C#.NET手把手教你做微信公众号开发(12)--带参数二维码裂变推广

    为什么能裂变推广是营销学和心理学的范畴了,这里举个简单的例子来介绍.公众号有足以吸引粉丝的地方,要么是知识.要么是优惠.要么是服务,反正不同于其他人,能够吸引人关注:有了这个前提,怎么让更多的人知道这 ...

  4. 实例:用C#.NET手把手教你做微信公众号开发(10)--事件消息处理之关注公众号(普通关注)

    一.事件消息种类 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后 ...

  5. 实例:用C#.NET手把手教你做微信公众号开发(22)--网页里通过OAuth获取用户openid

    第一篇:理论 如果一个用户并未关注某个公众号,只是在微信内打开了公众号web服务器上的某个网页,要如何获取用户的openid以及用户的微信信息,以便实现业务逻辑呢?本篇讲述网页授权OAuth获取微信用 ...

  6. 实例:用C#.NET手把手教你做微信公众号开发(3)--普通消息处理之图片

    本着简短.便于理解应用的原则,本系列文章每次只讲一个公众号知识点,给出一个应用实例,通过一个知识点帮助你掌握公众号一类应用的开发方法. 上一篇我们掌握了微信客户端.微信服务器.你的服务器之间的信息互动 ...

  7. 实例:用C#.NET手把手教你做微信公众号开发(19)--使用微信支付转账到微信粉丝零钱账户

    公众号给微信用户支付费用的方式有很多种,最常用的是发红包和转账到零钱账户,上一篇文章详细讲解了使用发红包的过程,从公众号内的配置,到微信支付的配置,再到具体的类实现. 本篇主要讲解转账到零钱,具体的类 ...

  8. 实例:用C#.NET手把手教你做微信公众号开发(13)--事件消息处理之取消关注

    一.取消关注事件 用户在取消关注公众号时,微信会把这个事件推送到开发者填写的URL,方便开发者做帐号的解绑等处理. <xml><ToUserName><![CDATA[t ...

  9. 实例:用C#.NET手把手教你做微信公众号开发(6)--普通消息处理之视频、小视频

    本篇讲解微信客户端向公众号发送视频和小视频的处理方式. 视频消息常见应用: 在线教学: 基于公众号的定向类型小视频应用,类似于抖音.快手,但不用再安装app: 视频剪辑.特效添加,比如美颜: 其它视频 ...

最新文章

  1. 微服务架构实战项目Serverless的持续交付与架构案例
  2. 新晋小白怎样才能做好seo优化
  3. 【git】Git 提示fatal: remote origin already exists 错误解决办法
  4. Python的序列Ⅰ
  5. 凉山州计算机等级考试时间,2020年四川凉山中考考试时间及科目安排(已公布)...
  6. php抽奖概率怎么设计,php编写抽奖后台实现抽奖概率计算
  7. USB转串口 TTL RS-232 RS-485 COM口 UART区别
  8. eXtremeComponents(简称ec)是一系列提供高级显示的开源JSP定制标签
  9. Ubuntu各类软件推荐
  10. 附录A 计算机的0和1
  11. 华美天气(数据来源:和风天气 API)
  12. 一键自动完成 2021 京东/淘宝双 11 活动
  13. js两种滚动事件写法
  14. 英雄联盟无法开始第二局(已解决,亲测有效)
  15. Memcached的安装及配置
  16. 思考题:一条信息可通过如图所示的网络线由上(A点)往下向各站点传送,例如信息到达b2点可由经a1的站点送达,也可以由经a2的站点送达,共有两条途径传送,那么信息由A点到达d3的不同途径共有多少条
  17. 根据分割符分割字符串成数组
  18. 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|考试知识点
  19. VM15 虚拟机下载及安装CentOS7.6
  20. git自动部署代码到服务器windows,Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS)...

热门文章

  1. 共聚焦显微镜各部分名称和功能
  2. 面试官:手写一个call、apply、bind?
  3. iOS 性能优化 - Allocations分析内存分配
  4. ElasticSearch工作原理解读及一些思考
  5. CentOS7下的网络设定方法
  6. Oracle 数据库利用回收站恢复删除的表实例演示
  7. 电子设计教程50:16*16LED点阵屏驱动-LED点阵屏工作原理
  8. My programs (我写的软件)
  9. Delphi IDEFixPack 修复Delphi和windows的兼容性
  10. vb调用本地html,在VB中调用浏览器访问网页