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。
获取openid后推送消息,代码如下
public function send_wechat() {//模版中的参数,以模版为准$openid = $_REQUEST["openid"];$name=$_REQUEST["name"];$area=$_REQUEST["area"];$code=$_REQUEST["code"];$lockid=$_REQUEST["lockid"];$time=$current_time = date('Y-m-d H:i:s');$appid = "微信appid";$secret = "微信secret";$template_id='模版id';$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";$dx = $this->get_http($url);$data = json_decode($dx,TRUE);$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$data['access_token'];$furl='';$res['touser'] = $openid;$res['template_id'] = $template_id;$res['url'] = $furl;//下面是模版中所用到的变量,以模版为准$res['data']['thing13']['value'] = $name;$res['data']['thing3']['value'] = $area;$res['data']['number1']['value'] = $code;$res['data']['character_string14']['value'] = $lockid;$res['data']['time11']['value'] = $time;$ch = curl_init();//初始化curlcurl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页curl_setopt($ch, CURLOPT_HEADER, 0);//设置headercurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_POST, 1);//post提交方式curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($res));$re = curl_exec($ch);//运行curlcurl_close($ch);return $re;}
下面配上我的模版的截图