PHP开发微信公众号(一)二维码的获取
要开发微信公众号,首先进行需要注册一个,然后认证。这就不用多说了。
当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
申请成功后,你会得到一个appID 和 appsecret,这个就相当于你的开发者账号和密码。
开发模式如下图:
1、Access_Token的获取
对于这个access_token就是一个访问标识,其实不用想得太高深,它就好比是你进图书馆需要的图书卡;
如何获得它?依赖于appid和appsecret,这就像你办图书卡,需要身份证号或者学号,还需要输入密码。
api接口如下:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret
这个是以get方式请求,会返回一个json数据,包括access_token和expires_in(有效期,一般为7200);
php如何发送get请求,这里就需要封装一个函数了,使用curl,请先确保自己php的curl模块开启且能正常使用:
private function _request($method='get',$url,$data=array(),$ssl=true){
//curl完成,先开启curl模块
//初始化一个curl资源
$curl = curl_init();
//设置curl选项
curl_setopt($curl,CURLOPT_URL,$url);//url
//请求的代理信息
$user_agent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4';
curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);
//referer头,请求来源
curl_setopt($curl,CURLOPT_AUTOREFERER,true);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间
//SSL相关
if($ssl){
//禁用后,curl将终止从服务端进行验证;
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
//检查服务器SSL证书是否存在一个公用名
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
}
//判断请求方式post还是get
if(strtolower($method)=='post') {
/**************处理post相关选项******************/
//是否为post请求 ,处理请求数据
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
}
//是否处理响应头
curl_setopt($curl,CURLOPT_HEADER,false);
//是否返回响应结果
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); //发出请求
$response = curl_exec($curl);
if (false === $response) {
echo '<br>', curl_error($curl), '<br>';
return false;
}
//关闭curl
curl_close($curl);
return $response;
}
因为后面还会用到post请求,所有这里就需要一个参数判断是否何种请求。通过这个函数,我们就可以或得到微信公众号返回的json数据
//获取access_token,并保存到文件里
public function getAccessToken($token_file = './access_token'){
//考虑这个access_token是否过期
$life_time = 7200;
//文件存在,并且左后修改时间与当前时间的差小于access_token的有效期,则有效
if(file_exists($token_file) && time()-filemtime($token_file)<$life_time){
//得到内容
return file_get_contents($token_file);
} $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}";
//向该地址发送get请求
$result = $this->_request('get',$url);
//处理响应结果
if(!$result){
return false;
}
//存在返回响应结果,返回对象
$result_obj = json_decode($result);
//写入文件
file_put_contents($token_file, $result_obj->access_token);
return $result_obj->access_token;
}
因为这是写在一个类里面的,appid和appsecret都已经初始化好,所以直接用了它的属性。
2、获取到了access_token后,想要生成二维码,还需要获取ticket
ticket又是撒?这就像你网上买票,网站发给你的一个取票码,然后你拿这个取票码再去取票。同理,我们这里要获取也要先得到ticket,然后再去获取二维码图片。
protected $_appid;
protected $_appsecret;
protected $_token;//公众平台请求开发者时需要标记
protected $_appkey;//图灵机器人appkey
//标识qrcodeticket的类型,是永久还是临时
const QRCODE_TYPE_TEMP = 1;
const QRCODE_TYPE_LIMIT = 2;
const QRCODE_TYPE_LIMIT_STR = 3;
//根据access_token获取ticket
//@param $content 内容
//@param $type qr码类型
//@param $expire 有效期,如果是临时类型需指定
//@return string ticket
public function getQRCodeTicket($content,$type=2,$expire=604800){
$access_token = $this->getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token;
$type_list = array(
self::QRCODE_TYPE_TEMP => 'QR_SCENE',
self::QRCODE_TYPE_LIMIT=>'QR_LIMIT_SCENE',
self::QRCODE_TYPE_LIMIT_STR=>'QR_LIMIT_STR_SCENE'
);
$action_name = $type_list[$type];
//post发送的数据
switch ($type){
case self::QRCODE_TYPE_TEMP:
$data_arr['expire_seconds']=$expire;
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_id']=$content;
break;
case self::QRCODE_TYPE_LIMIT:
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_id'] = $content;
break;
case self::QRCODE_TYPE_LIMIT_STR:
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_str'] = $content;
break;
}
$data = json_encode($data_arr);
$result = $this->_request('post',$url,$data);
if(!$result){
return false;
}
$result_obj = json_decode($result);
return $result_obj->ticket;
}
ticket又分为临时、永久、永久字符串三种,其中临时又需要传递有效期。永久和永久字符串区别只在于$content传递的是带引号还是不带引号。
这里通过post提交数据后,就可以获得ticket。
3、获得二维码qrcode
接下来就可以获取二维码了
//根据ticket获取二维码
/**
* @param int|string $content qrcode内容标识
* @param [type] $file 存储为文件的地址,如果null直接输出
* @param integer $type 类型
* @param integer $expire 如果是临时,标识有效期
* @return [type]
*/ public function getQRCode($content,$file=NULL,$type=2,$expire=604800){
//获取ticket
$ticket = $this->getQRCodeTicket($content,$type=2,$expire=604800);
$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
//发送,取得图片数据
$result = $this->_request('get',$url);
if($file){
file_put_contents($file,$result);
}else{
header('Content-Type:image/jpeg');
echo $result;
}
}
最后我们只需要实例化定义的类,传入appid和appsecret,然后调用getQRCode就可以获取到二维码了。
源码下载:https://github.com/Ivanlovening/wechat
PHP开发微信公众号(一)二维码的获取的更多相关文章
- NodeJs 开发微信公众号(二)测试环境部署
由于卤煮本人是做前端开发的,所以在做公众号过程中基本上没有遇到前端问题,在这方面花的时间是最少的.加上用了mui框架(纯css界面)和自己积累的代码,很快地开发出了界面来.接着是后台开发.卤煮选的是n ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- PHP开发微信公众号(二)消息接受与推送
上一篇文章我们知道怎么获取二维码,这样别人就可以扫描二维码来关注我们,但是别人关注后,发送消息,我们怎么进行相关处理? 这里我们就来学习下怎么处理处理这些消息,以及推送消息. 学习之前首先你需要有一个 ...
- .NET开发微信小程序-生成二维码
1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...
- .NET开发微信小程序-生成二维码 - 转
1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...
- 通过微信公众号ID生成公众号的二维码
username为公众号id http://open.weixin.qq.com/qr/code/?username=wyjiaolian
- Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token
获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...
- Java开发微信公众号(一)---初识微信公众号以及环境搭建
ps:1.开发语言使用Java springMvc+Mybaits+spring maven实现 2.使用微信接口测试账号进行本地测试 https://mp.weixin.qq.com/debug/c ...
随机推荐
- Codeforces 667C DP
题意:给你一个字符串,这个字符串的构造方法如下:先选择一个长度大于4的前缀,然后每次向字符串尾部添加一个长度为2或者长度为3的后缀,不能添加连续的相同的后缀,问可能的后缀有哪些?并按字典序输出去. 思 ...
- c++ 备忘录模式(memento)
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态[DP].举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的 ...
- SpringData JPA整理
一 首先熟悉几种jpa中的接口Repository,CrudRepository,PagingAndSortingRepository,JpaRepository,JpaSpecificationEx ...
- redis 面试题2
使用过Redis分布式锁么,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放. 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行 ...
- Fix: The account is not authorized to log in from this station
If you have more the one computers running Windows, then its possible to connect them using HomeGrou ...
- Appium Windows安装
安装环境 1 安装Nodejs 下载nodejs安装包(http://nodejs.org/download/)安装 测试安装是否成功:运行cmd,输入node -v 2 安装android的SDK ...
- [SoapUI] 在Test Step 下加Script Assertion,用 messageExchange 获取当前步骤的response content
//Get response content of the current request def response = messageExchange.getResponseContent() // ...
- Selenium运用-漫画批量下载
今天我们要爬去的网站是http://comic.sfacg.com/.漫画网站一般都是通过JavaScript和AJAX来动态加载漫画的,这也就意味着想通过原来爬取静态网站的方式去下载漫画是不可能的, ...
- Primer 三四五章
序言 看了看表,再看了看书,2个小时就没啦(又到了吃中饭的时间,O(∩_∩)O哈哈~).一个上午感觉啥也没干呢,不过还是从书上看到了一些东西,对于这些基础的知识,还是有些东西没有记得很深,所以还是花了 ...
- ettercap 命令
本地主机:192.168.0.149 目标主机:192.168.0.138 /etc/ettercap/etter.dns,将dns欺骗到本机 ettercap -T -q -i wlan0 -P d ...