最近做微信公眾平台開發項目時遇到這樣一個功能需求:生成一個特定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#