微信公众平台开发教程(六)获取个性二维码的实例


Posted in Javascript onDecember 02, 2016

一、功能介绍

在进行推广时,我们可以告诉对方,我们的微信公众账号是什么,客户可以去搜索,然后关注。二维码给我们提供了极大的便捷,只要简单一扫描,即可关注。

如果已经关注过,立刻跳入对话画面。在我们进行推广时,不再是简陋的文字,可以是一个有个性的二维码,想必会很生动。

微信对二维码提供了很好的支持,而且还可以根据需要生成不同场景的二维码。下面我们将介绍如何获取和使用二维码。

注意:限服务号,且进行了微信认证,费用300

微信公众平台开发教程(六)获取个性二维码的实例

二、相关接口

为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。

目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--1000)。两种二维码分别适用于帐号绑定、用户来源统计等场景。

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

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

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

获取带参数的二维码的过程包括两步,首先创建二维码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": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

永久二维码请求说明

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}}}

参数说明

参数 说明
expire_seconds 该二维码有效时间,以秒为单位。 最大不超过1800。
action_name 二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久
action_info 二维码详细信息
scene_id 场景值ID,临时二维码时为32位整型,永久二维码时最大值为1000

返回说明

正确的Json返回结果:

{"ticket":"gQG28DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0FuWC1DNmZuVEhvMVp4NDNMRnNRAAIEesLvUQMECAcAAA==","expire_seconds":1800}

参数 说明
ticket 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
expire_seconds 二维码的有效时间,以秒为单位。最大不超过1800。

错误的Json返回示例:

{"errcode":40013,"errmsg":"invalid appid"}

全局返回码说明

使用网页调试工具调试该接口 

通过ticket换取二维码

获取二维码ticket后,开发者可用ticket换取二维码图片。请注意,本接口无须登录态即可调用。

请求说明
HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET

返回说明

ticket正确情况下,http 返回码是200,是一张图片,可以直接展示或者下载。
HTTP头(示例)如下:

Accept-Ranges:bytes
Cache-control:max-age=604800
Connection:keep-alive
Content-Length:28026
Content-Type:image/jpg
Date:Wed, 16 Oct 2013 06:37:10 GMT
Expires:Wed, 23 Oct 2013 14:37:10 +0800
Server:nginx/1.4.1

错误情况下(如ticket非法)返回HTTP错误码404。

三、具体实现

 依然基于之前的机器人案例进行功能添加,直接看代码。

/// <summary>
 /// 二维码管理者
 /// </summary>
 public class DimensionalCodeManager
 {
 /// <summary>
 /// 临时二维码地址
 /// </summary>
 /// 使用string.format时,报:字符串格式错误,因为其中有{
 //private const string TEMP_URL = "{\"expire_seconds\": 1800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": {0}}}}";
 /// <summary>
 /// 解决办法,将原有字符串中的一个{用两个{代替
 /// </summary>
 private const string TEMP_JSON_DATA = "{{\"expire_seconds\": 1800, \"action_name\": \"QR_SCENE\", \"action_info\": {{\"scene\": {{\"scene_id\": {0}}}}}}}";
 /// <summary>
 /// 永久二维码地址
 /// </summary>
 private const string PERMANENT_URL = "{{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\": {{\"scene\": {{\"scene_id\": {0}}}}}}}";
 /// <summary>
 /// 获取ticket的URL
 /// </summary>
 private const string GET_TICKET_URL = " https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";
 /// <summary>
 /// 获取二维码URL
 /// </summary>
 private const string GET_CODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={0}";
 /// <summary>
 /// 根据场景ID获取ticket
 /// </summary>
 /// <param name="sceneID">场景ID</param>
 /// <param name="isTemp">是否是临时二维码</param>
 /// <returns></returns>
 private static string GetTicket(int sceneID, bool isTemp)
 {
  string result = null;
  string data = string.Empty;
  if (isTemp)
  {
  data = string.Format(TEMP_JSON_DATA, sceneID.ToString());
  }
  else
  {
  if (sceneID > 0 && sceneID <= 1000)
  {
   data = string.Format(PERMANENT_URL, sceneID);
  }
  else
  {
   //scene_id不合法
   return null;
  }
  }

  string ticketJson = HttpUtility.GetData(string.Format(GET_TICKET_URL,Context.AccessToken));

  XDocument doc = XmlUtility.ParseJson(ticketJson, "root");
  XElement root = doc.Root;
  if (root != null)
  {
  XElement ticket = root.Element("ticket");
  if (ticket != null)
  {
   result = ticket.Value;
  }
  }

  return result;
 }
 /// <summary>
 /// 创建临时二维码
 /// </summary>
 /// <param name="sceneID">场景id,int类型</param>
 /// <returns></returns>
 public static string GenerateTemp(int sceneID)
 {
  string ticket = GetTicket(sceneID,true);
  if (ticket == null)
  {
  return null;
  }

  return HttpUtility.GetData(string.Format(GET_CODE_URL, ticket));
 }
 /// <summary>
 /// 创建临时二维码
 /// </summary>
 /// <param name="sceneID">场景id,int类型</param>
 /// <returns></returns>
 public static string GeneratePermanent(int sceneID)
 {
  string ticket = GetTicket(sceneID, false);
  if (ticket == null)
  {
  return null;
  }

  return HttpUtility.GetData(string.Format(GET_CODE_URL, ticket));
 }
 }

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
JS localStorage实现本地缓存的方法
Jun 22 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
Aug 12 Javascript
浅谈Jquery为元素绑定事件
Apr 27 Javascript
JS实现的自定义网页拖动类
Nov 06 Javascript
js 动态给元素添加、移除事件的实现方法
Jul 19 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
利用JS轻松实现获取表单数据
Dec 06 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
vue写一个组件
Apr 09 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
Dec 02 #Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 #Javascript
关于Function中的bind()示例详解
Dec 02 #Javascript
bootstrap模态框消失问题的解决方法
Dec 02 #Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 #Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 #Javascript
vue.js入门(3)——详解组件通信
Dec 02 #Javascript
You might like
PHP面向对象分析设计的经验原则
2008/09/20 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
php实现httpclient类示例
2014/04/08 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
PHP数组实例详解
2016/06/26 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python制作动态字符图的实例
2019/01/27 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
用python对excel进行操作(读,写,修改)
2020/12/25 Python
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
感动中国何玥观后感
2015/06/02 职场文书
python基础之while循环语句的使用
2021/04/20 Python
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
如何判断pytorch是否支持GPU加速
2021/06/01 Python
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers