‘壹’ php获取微信token的是什么格式的
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的
access_token失效。
access_token的获取:
<?php
define("APPID", "您的appid");
define("APPSECRET", "您的appsecret ");
$token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET;
$res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
//echo $res;
$result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
$access_token = $result['access_token'];
echo $access_token;
php>
‘贰’ PHP获取 微信access token 连接被重置
可能你的代码涉及到了php5.3的新增特性~
比如5.3以上版本才支持 命名空间namespace,但5.3以下版本是不支持的,建议安装相同的服务器环境
‘叁’ PHP和微信平台Token问题,求解 很简单。
如果程序没问题,一般情况是编码问题!
‘肆’ PHP如何实现微信网页授权
具体而言,网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持unionid机制)
‘伍’ 微信 在php中 如何获取access_token
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的
access_token失效。
access_token的获取:
<?php
define("APPID","您的appid");
define("APPSECRET","您的appsecret");
$token_access_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
$res=file_get_contents($token_access_url);//获取文件内容或获取网络请求的内容
//echo$res;
$result=json_decode($res,true);//接受一个JSON格式的字符串并且把它转换为PHP变量
$access_token=$result['access_token'];
echo$access_token;
php>
‘陆’ PHP的TP框架,使用curl函数无法通过微信获取access_token的那个https的链接,设置curl参数也不行
先看下直接用curl命令是否能正常访问,然后打开curl的调试,看看具体输出。
‘柒’ PHP 微信模拟登录获取不到token
已经认证的服务号被检测到模拟登录,强制手机(phone=+86158******71 后面的就是被掩码的手机号)开启短信验证。只有当真正浏览器时就会通过JS触发短信通知,模拟登陆则不会。
在页面输入收到的短信验证码后,才能获得 登录token。
这是微信官方的技术手段,此问题暂时无解。
‘捌’ Thinkphp3.2.3接入公众号响应微信发送的Token验证总是失败
用得着判断那个TOKEN?是不是多此一举,用我这个,包你满意
<?php
namespaceHomeController;
useThinkController;
{
publicfunctionindex(){
$v=$_GET["echostr"];
if(!isset($v)){//根据随机字符串判断是否之前已经验证过,避免重复验证
$this->receive();
}else{
$this->checkSignature();
}
}
//未验证执行验证
publicfunctioncheckSignature(){
$signature=I("signature");//加密签名
$timestamp=I("timestamp");//时间戳
$nonce=I("nonce");//随机数
$token=TOKEN;//token
$tmpArr=array($token,$timestamp,$nonce);//组成新数组
sort($tmpArr,SORT_STRING);//重新排序
$tmpStr=implode($tmpArr);//转换成字符串
$tmpStr=sha1($tmpStr);//再将字符串进行加密
if($tmpStr==$signature)
{
echo$_GET["echostr"];
exit;
//returntrue;
}else{
returnfalse;
}
}
//已经验证过执行这里
publicfunctionreceive(){
$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];//获取用户发送的消息,格式为xml
//$postStr=file_get_contents("php://input");
libxml_disable_entity_loader(true);
$postObj=simplexml_load_string($postStr,"SimpleXMLElement",LIBXML_NOCDATA);
$this->logger($postStr);
//并且回复信息给用户
if(!empty($postObj)){
switch($postObj->MsgType){
case"text":
$result=$this->receiveText($postObj);
//避免错误信息报出
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),$postObj->MsgType,"多图文信息没有获取到");
}
echo$result;
break;
case"image":
$result=$this->receiveImage($postObj);
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"news","跟老李一起来做微信开发","微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,用户通过简单的设置,就能生成微信3G网站。通过微信公众平台将企业品牌展示给微信用户,减少宣传成本,建立企业与消费者、客户的一对一互动和沟通,将消费者接入企业CRM系统,进行促销、推广、宣传、售后等。形成了一种主流的线上线下微信互动营销方式。","https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/ke/w%3D268%3Bg%3D0/sign=/.jpg","http://www..com");
}
echo$result;
break;
case"event":
$result=$this->receiveEvent($postObj);
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","感谢您关注微信接口测试服务号,我是李先生!");
}
echo$result;
break;
default:
$result="你发送的数据类型暂时不做处理:".$postObj->MsgType;
echo$result;
break;
}
}
}
//log
privatefunctionlogger($content){
$logSize=100000;
$log="./log.txt";
if(file_exists($log)&&filesize($log)>$logSize){
unlink($log);
}
file_put_contents($log,date("Y-m-dH:i:s")."".$content." ",FILE_APPEND);
}
//关注自动回复信息
privatefunctionreceiveEvent($postObj){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
if($postObj->Event=="subscribe"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","感谢您关注微信接口测试服务号,我是李先生!");
}elseif($postObj->Event=="CLICK"){
if($postObj->EventKey=="getSalary"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【查询->工资】按钮");
}elseif($postObj->EventKey=="getAttendance"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【查询->考勤记录】按钮");
}elseif($postObj->EventKey=="getBonus"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【查询->奖金明细】按钮");
}elseif($postObj->EventKey=="getAbout"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【关于我们->联系】按钮");
}elseif($postObj->EventKey=="getJoin"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【关于我们->加入我们】按钮");
}elseif($postObj->EventKey=="getCustomer"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【关于我们->客服】按钮");
}elseif($postObj->EventKey=="getInternational"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【新闻->国际】按钮");
}elseif($postObj->EventKey=="getInstry"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您点击了【新闻->行业】按钮");
}
}elseif($postObj->Event=="scancode_waitmsg"){
//扫码带提示的事件
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您使用了扫码带提示事件,事件KEY:{$postObj->EventKey}");
}elseif($postObj->Event=="scancode_push"){
//扫码推事件
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您使用了扫码推事件,事件KEY:{$postObj->EventKey}");
}else{
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您的操作有点奇葩");
}
return$result;
}
//处理接收的文本信息并且回复给用户
privatefunctionreceiveText($postObj){
$content=trim($postObj->Content);
//if(strstr($content,"你好")){
if(preg_match("/^d*$/",$content)){
//回复多图文信息
$result=$this->receiveNews($postObj);
return$result;
}elseif($content=="图片"){
//回复图片信息
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"image","-");
return$result;
}else{
//回复文本信息
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),$postObj->MsgType,$content);
return$result;
}
}
//处理接收的文本信息并且回复给用户为单图文信息
privatefunctionreceiveImage($postObj){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"news","跟老李一起来做微信开发","微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,用户通过简单的设置,就能生成微信3G网站。通过微信公众平台将企业品牌展示给微信用户,减少宣传成本,建立企业与消费者、客户的一对一互动和沟通,将消费者接入企业CRM系统,进行促销、推广、宣传、售后等。形成了一种主流的线上线下微信互动营销方式。","https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/ke/w%3D268%3Bg%3D0/sign=/.jpg","http://www..com");
return$result;
}
//处理接收的文本信息并且回复给用户为多图文信息
privatefunctionreceiveNews($postObj){
$con=array(
array("Title"=>"观前街","Description"=>"hjhhj","PicUrl"=>"https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/pic/item/.jpg","Url"=>"https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/pic/item/.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://imgtu.5011.net/uploads/content/shehui/wanxiang/2015-08-26/.jpg","Url"=>"http://imgtu.5011.net/uploads/content/shehui/wanxiang/2015-08-26/.jpg"),
array("Title"=>"观前街","Description"=>"hjhhj","PicUrl"=>"http://img2.a0bi.com/upload/ttq/20160729/1469781927056.jpeg","Url"=>"http://img2.a0bi.com/upload/ttq/20160729/1469781927056.jpeg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://gaoxiao.zhutou.com/html/UploadPic/2010-3/201033173945493.jpg","Url"=>"http://gaoxiao.zhutou.com/html/UploadPic/2010-3/201033173945493.jpg"),
array("Title"=>"观前街","Description"=>"hjhhj","PicUrl"=>"http://www.haha365.com/uploadfile/2013/0508/20130508102432191.jpg","Url"=>"http://www.haha365.com/uploadfile/2013/0508/20130508102432191.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://img1.imgtn.bdimg.com/it/u=995757682,3656700920&fm=214&gp=0.jpg","Url"=>"http://img1.imgtn.bdimg.com/it/u=995757682,3656700920&fm=214&gp=0.jpg"),
array("Title"=>"观前街","Description"=>"hjhhj","PicUrl"=>"http://down.laifu.com/tupian/201261510566.jpg","Url"=>"http://down.laifu.com/tupian/201261510566.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://img.tupianzj.com/uploads/allimg/160528/9-16052Q54439-50.jpg","Url"=>"http://img.tupianzj.com/uploads/allimg/160528/9-16052Q54439-50.jpg")
);
$bodys="<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$tpl2="";
foreach($conas$key=>$newArray){
$tpl2.=sprintf($bodys,$newArray["Title"],$newArray["Description"],$newArray["PicUrl"],$newArray["Url"]);
}
$fromUsername=$postObj->FromUserName;
$toUsername=$postObj->ToUserName;
$tpl1="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>";
$tpl3="</Articles>
</xml>";
$tpl1=sprintf($tpl1,$fromUsername,$toUsername,time(),"news",count($con));
$result=$tpl1.$tpl2.$tpl3;
return$result;
}
}
‘玖’ php 获取微信获取openid需要token吗
如果是公众号自动回复的功能,是不需要token就能获取用户openid,如果是网页授权获取,那么就需要token了。微信默认token有效期2小时,所以你获取到token后可以自行服务器缓存2小时(稍微小于2小时最好),没刷新一次就会重新获取token,每天token的用量有限制。文档有介绍
‘拾’ 自己用thinkphp做微信接口类文件,遇一个问题,GET获取到的token,如何将这个变量传递到实例化的类里面
classIndexActionextendsAction{
publicfunctionindex(){
$token=D("wx_token")->field("add_ip",true)->select();
foreach($tokenas$key=>$v){
if($v['expire_time']-300<time()){
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$v['appid']}&secret={$v['secret']}";
$res=file_get_contents($url,false);
$this->getAccessToken($v['id'],$res);
}else{
$date=date("Y-m-dH:i:s");
echo"{$date}_____noexpire ";
}
}
}
privatefunctiongetAccessToken($token,$res){
$sign=false;
$json=json_decode($res);
$data['id']=$token;
$data['access_token']=$json->access_token;
$data['expire_time']=time()+7200;
$data['add_time']=time();
$data['add_ip']='127.0.0.1';
$db=D("wx_token");
$db->startTrans();
if($db->save($data)){
$db->commit();
$sign=true;
}else{
$db->rollback();
$sign=false;
}
return$sign;
}
}
再创建个数据表,保存就好了,整个定时任务,定时去获取比较好。