最近做微信公众平台开发项目时遇到这样一个功能需求:生成一个特定url的二维码,用户扫描二维码后跳转到这个url指定的页面,并在这个页面获得用户的openid。这个功能主要涉及到两方面的技术:生成二维码,网页授权。

1. 生成二维码:

生成二维码比较简单的方法是直接使用phpqrcode程序包(可在网上下载得到)。

若想获得ThinkPHP支持,需将程序包放在ThinkPHP/Extend/Vendor目录下,让后在程序中引用,代码如下:

vendor("phpqrcode.phpqrcode");

//要生成二维码的数据

$text="扫码后要跳转的页面的url";

//纠错级别, 纠错级别越高,生成图片会越大
//L水平 7%的字码可被修正
//M水平 15%的字码可被修正
//Q水平 25%的字码可被修正
//H水平 30%的字码可被修正

$level = "L";

//图片每个黑点的像素。
$size = "10";
//生成图片 第二个参数:是否保存成文件 如需要保存文件,第二个参数改为文件名即可,如:'qrcode.png'
QRcode::png($text,false,$level,$size);

2. 网页授权:

要获取用户的openid,需要进行网页授权。

首先要到公众平台官网的开发者中心页配置授权回调域名。

将二维码url设置为:

$text="https://open.weixin.qq.com/connect/oauth2/authorize?

  appid=公众appid&

  redirect_uri=扫码后要跳转的页面url&
  response_type=code&
  scope=snsapi_base&
  state=1#wechat_redirect";

注意:有时候$text内部换行会导致一个错误,就是用户扫码的时候会出现“AppID参数错误”,还有一个问题就是安卓手机扫描页面跳转正常,但是用苹果手机扫描的时候还是会出现“AppID参数错误”,所以应该将$text表示如下:

$appid = 'wx65ab2a8f07b7621c';
$callback = 'http://a.ewm.net.cn/qiduoyun/jingxiaoshan/index.php/Admin/Signature/getsign';
$text="https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $appid . "&redirect_uri=" . urlencode($callback) . "&response_type=code&scope=snsapi_base&state=1#wechat_redirect";

这样就不会出错了,而且支持安卓手机和苹果手机正常扫码。

其中appid是公众号appid,redirect_uri是扫码后要跳转的页面url,response_type指定为code,用于换取access_token(获取用户基本信息的凭据),scope这里指定为snsapi_base,因为只需要获取用户的openid,state可用户传递其他开发者需要的参数,若无可随便填写,#wechat_redirect表示直接在微信中打开页面。

这样用户扫二维码后就会跳转到指定的url,并且传递了参数过来。然后就可以在跳转的页面中获取code,换取access_token,由于获取access_token的同时也获取到了openid,所以如果只需获取用户id,到这一步就已经实现了,代码如下:

$appid = "公众号appid";
$secret = "公众号appsecret";
$code = $_GET["code"];

$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';

$res=file_get_contents($get_token_url);
$json_obj = json_decode($res,true);

$openid = $json_obj['openid'];

$openid即为扫码用户的openid。

关于网页授权获取用户基本信息更详细的知识请参阅公众平台开发文档:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#

网页授权——扫二维码获取openid的更多相关文章

  1. 微信小程序通过二维码获取参数运行

    小程序开发过程中会遇到参数id会通过二维码获取,然后执行接口获取数据,但是难免会遇到带过来的参数出现乱码,这样就需要解码,多个参数时就需要进行处理取我们需要的字段值:小程序开发过程中会遇到参数id会通 ...

  2. MISC-吹着贝斯扫二维码

    题目 [安洵杯 2019]吹着贝斯扫二维码 解压附件,有36个文件和一个压缩包,压缩包带密码和备注 分析 文件类型 随便打开一个不明文件,是jpg图片啊(FF D8 FF) 改一个试试,有一个小块二维 ...

  3. 微信Netting-QRLJacking分析利用-扫我二维码获取你的账号权限

    首先我们来看一下QRLJacking的实际原理:.攻击者首先进行客户端QR会话,并将登录QR码复制到网络钓鱼网站.“现在,一个精心制作的网络钓鱼页面有一个有效和定期更新的QR码可以被发送给受害者.” ...

  4. 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo

    有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...

  5. 扫二维码下载apk并统计被扫描次数(及微信屏蔽下载解决方案)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5395715.html 需求:想让用户扫描一个二维码就能下载APP,并统计被扫描次数. 两种实现方法: 1.一 ...

  6. vue 实现 扫二维码 功能

    前段时间一直在研究,如何通过 vue 调用 相机 实现 扫一扫的功能,但是查看文档发现,需要获取 getUserMedia 的属性值,但存在兼容性问题. 退而求其次,通过 h5plus 来实现. 1. ...

  7. android DialogFragment 实现Dialog展示扫二维码图片展示

    近期开发项目,做个按钮点击弹出展示微信二维码关注微信公众号的展示框,于是想到DialogFragment,期间对Dialog的title的底框字体颜色做出相关设置,记录如下: 下面是 DialogFr ...

  8. 扫二维码登录实现原理,php版

    基础的逻辑图就是这样,但是实际情况还是有几种可能 比如QQ登录,微信登录,微博登录,基本设计都差不多,根据实际情况会有一些差异 问题是,如果设计合理的接口在保证数据的安全性和快速性 设计到的技术不复杂 ...

  9. .net在网页中生成二维码和条形码

    二维码: 1.下载ThoughtWorks.QRCode.dll文件 2.创建Web项目,添加引用刚才下载的文件 3.在项目中添加aspx窗体,编写代码如下 <%@ Page Language= ...

随机推荐

  1. 201621123067《JAVA程序设计》第一周学习总结

    第一周-JAVA基本概念 1.本周学习总结 本周初次接触Java这一工程语言,我也首次接触了类名和面向对象这两个关键术语,虽然有C的基础但还是觉得有点不同.同时也学习到了Java的安装,eclipse ...

  2. thymeleaf模板引擎调用java类中的方法(附源码)

    前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...

  3. Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】

    什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...

  4. 最近使用 .NET Core 遇到的一些坑

    最近.NET Core升级到2.0后开始慢慢捣鼓的多了起来,但遇到了不少坑,所以特来记录下. 第一个坑  条件编译符 我们在编写一些方法的时候通常会为Debug模式增加一些输出日志等以便我们检查,也会 ...

  5. Java学习笔记一---JVM、JRE、JDK

    jdk包含jre,jre包含jvm. 用java语言进行开发时,必须先装jdk: 只运行java程序,不进行开发时,可以只装jre. JVM 即Java Virtual machine,Java虚拟机 ...

  6. hdu1698线段树的区间更新区间查询

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  7. hdu1116有向图判断欧拉通路判断

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  8. thinkphp增删改查

    添加数据: (添加单行数据) // 添加成功返回1,失败返回0 (添加多行数据) // 返回添加数据的条数 删除数据: 修改数据: (修改单个字段) (修改多个字段) // 修改成功返回1,失败返回0 ...

  9. 关于Android路由的实现

    先说一下背景,目前有需求从外部包括其他应用和WEB跳转到我们自己的APP,就这么个简单的需求-- 要实现这种外部跳转的功能,我们可以理解为打算跳转的一方有多少方式通知到APP进行相对的响应行为.所以, ...

  10. DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

    写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...