网页授权——扫二维码获取openid

最近做微信公众平台开发项目时遇到这样一个功能需求:生成一个特定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#

原文地址:https://www.cnblogs.com/wujuntian/p/4520828.html