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


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 相关文章推荐
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
简体中文转换繁体中文(实现代码)
Dec 25 Javascript
在Firefox下js select标签点击无法弹出
Mar 06 Javascript
js获取视频时长代码
Apr 10 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
Jun 20 Javascript
完美JQuery图片切换效果的简单实现
Jul 21 Javascript
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
js图片加载效果实例代码(延迟加载+瀑布流加载)
May 12 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
Mar 13 Javascript
Vuex入门到上手教程
Jun 20 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
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python开发之list操作实例分析
2016/02/22 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript