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


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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
js函数名与form表单元素同名冲突的问题
Mar 07 Javascript
jquery easyui 结合jsp简单展现table数据示例
Apr 18 Javascript
node.js中的fs.writeFileSync方法使用说明
Dec 14 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
Nov 20 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
详解Next.js页面渲染的优化方案
Jan 27 Javascript
vue element-ui实现动态面包屑导航
Dec 23 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 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&amp;&amp;mysql)三
2006/10/09 PHP
PHPMailer 中文使用说明小结
2010/01/22 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
Add Formatted Text to a Word Document
2007/06/15 Javascript
javascript 打印内容方法小结
2009/11/04 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
python+django快速实现文件上传
2016/10/24 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python实现一个简单的ping工具方法
2019/01/31 Python
python程序控制NAO机器人行走
2019/04/29 Python
python字典改变value值方法总结
2019/06/21 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
解析Python3中的Import
2019/10/13 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
python Canny边缘检测算法的实现
2020/04/24 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
Python如何给函数库增加日志功能
2020/08/04 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
巴西网上药房:onofre
2016/11/21 全球购物
市政工程技术专业自荐书
2014/07/06 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
诚信考试承诺书范文
2015/04/29 职场文书