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


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 相关文章推荐
传智播客学习之java 反射
Nov 22 Javascript
jquery 操作日期、星期、元素的追加的实现代码
Feb 07 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
js 操作select与option(示例讲解)
Dec 20 Javascript
js对象转json数组的简单实现案例
Feb 28 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
Dec 23 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
微信小程序实现图片放大预览功能
Oct 22 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 Javascript
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
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递归创建和删除文件夹的代码小结
2012/04/13 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
Python中文件遍历的两种方法
2014/06/16 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
实习自我评价怎么写
2013/12/02 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
欢送退休感言
2014/02/08 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
建议书的格式
2014/05/12 职场文书
绿色环保标语
2014/06/12 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
初中生物教学反思
2016/02/20 职场文书