❶ 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中的token怎么用
token一般理解为通行证,经过各种算法处理的唯一加密的字符串
比如用户登录,你只需cookie记录用户uid 和 token
token没有超时的话,不用验证密码直接登录
这样也能保证用户信息、密码不被cookie窃取
❸ php token 是什么东西,有什么作用,具体要怎么实现 希望配合代码解释
token可以用来作登陆验证的。比如做微信公众号开发,一般他们会在用户使用微信登陆的时候,生成一个唯一的token,来标记这个用户登陆的状态。这个token是生成的唯一标识,所以里面不携带用户的信息。这样就降低用户用户名密码的被窃取的风险性。实现你可以根据用户的id以及固定的字符串加上时间戳来生成,像存用户名密码一样存起来,你也可以给这个token设置一个过期时间,到期重新生成一个token。
❹ php 获取微信获取openid需要token吗
如果是公众号自动回复的功能,是不需要token就能获取用户openid,如果是网页授权获取,那么就需要token了。微信默认token有效期2小时,所以你获取到token后可以自行服务器缓存2小时(稍微小于2小时最好),没刷新一次就会重新获取token,每天token的用量有限制。文档有介绍
❺ php接口怎样安全接收并验证token
<?php
/*
*PHP简单利用token防止表单重复提交
*此处理方法纯粹是为了给初学者参考
*/
session_start();
functionset_token(){
$_SESSION[‘token’]=md5(microtime(true));
}
functionvalid_token(){
$return=$_REQUEST[‘token’]===$_SESSION[‘token’]?true:false;
set_token();
return$return;
}
//如果token为空则生成一个token
if(!isset($_SESSION[‘token’])||$_SESSION[‘token’]==”){
set_token();
}
if(isset($_POST[‘test’])){
if(!valid_token()){
echo"tokenerror";
}else{
echo‘成功提交,Value:’.$_POST[‘test’];
}
}
?>
<formmethod="post"action="">
<inputtype="hidden"name="token"value="<?phpecho$_SESSION[‘token’]?>">
<inputtype="text"name="test"value="Default">
<inputtype="submit"value="提交"/>
</form>
❻ php给app开发接口的token机制
破解确实是个问题,不过一般情况下,破解是需要时间的,你可以给token加一个过期时间,比如两个小时,一般情况下,两个小时是不足以破解一个密码的。加密算法的话,可以根据自己的习惯选择。
❼ PHP加了Token验证表单防止CSRF后还有必要做其它的防范吗
有必要,在安全防护方便不要心存侥幸,能想到的尽量一个也不要少,防患于未然!!
❽ 微信平台 php 示例 token验证失败
下载官方哪个开发包来试试,我用哪个包的Function都可以
❾ PHP写一个api接口,为什么需要生成一个token值
token的作用在于过滤请求来源,提高安全性.其他人拿不到token的产生规则,就无法访问接口.
校验参数
❿ PHP在控制器中怎么添加token验证,具体代码 谢谢
//获得token
privatefunctiongetToken(){
$tokenName=C('TOKEN_NAME',null,'__hash__');
$tokenType=C('TOKEN_TYPE',null,'md5');
if(!isset($_SESSION[$tokenName])){
$_SESSION[$tokenName]=array();
}
//标识当前页面唯一性
$tokenKey=md5($_SERVER['REQUEST_URI']);
if(isset($_SESSION[$tokenName][$tokenKey])){//相同页面不重复生成session
$tokenValue=$_SESSION[$tokenName][$tokenKey];
}else{
$tokenValue=is_callable($tokenType)?$tokenType(microtime(true)):md5(microtime(true));
$_SESSION[$tokenName][$tokenKey]=$tokenValue;
if(IS_AJAX&&C('TOKEN_RESET',null,true))
header($tokenName.':'.$tokenKey.'_'.$tokenValue);//ajax需要获得这个header并替换页面中meta中的token值
}
returnarray($tokenName,$tokenKey,$tokenValue);
}