phpthinkphp接口验证(Thinkphp3.2.3接入公众号响应微信发送的Token验证总是失败)
本文目录
- Thinkphp3.2.3接入公众号响应微信发送的Token验证总是失败
- thinkphp3.2.1怎么验证验证码
- ThinkPHP自动验证的问题
- ThinkPHP 自动验证是怎么弄得
- thinkphp接口appid和appsecret怎么生成和检测
- thinkphp 验证码问题
- 为什么thinkphp自带的验证码功能,验证码输错一次后,再输对,也一直报
- thinkphp 验证码怎么调用
Thinkphp3.2.3接入公众号响应微信发送的Token验证总是失败
用得着判断那个TOKEN?是不是多此一举,用我这个,包你满意
《?phpnamespace Home\Controller;use Think\Controller;class IndexController extends WechatController { public function index(){ $v = $_GET; if(!isset($v)){//根据随机字符串判断是否之前已经验证过,避免重复验证$this-》receive();}else{$this-》checkSignature();} }//未验证执行验证public function checkSignature(){ $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;exit;//return true;}else{return false;}}//已经验证过执行这里public function receive(){$postStr = $GLOBALS;//获取用户发送的消息,格式为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》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《Content》《!》《/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》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《ArticleCount》1《/ArticleCount》《Articles》《item》《Title》《!》《/Title》 《Description》《!》《/Description》《PicUrl》《!》《/PicUrl》《Url》《!》《/Url》《/item》《/Articles》《/xml》";***隐藏网址***}echo $result;break;case "event":$result = $this-》receiveEvent($postObj);if(empty($result)){$xml = "《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《Content》《!》《/Content》《/xml》";$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","感谢您关注微信接口测试服务号,我是李先生!");}echo $result;break;default :$result = "你发送的数据类型暂时不做处理: " . $postObj-》MsgType;echo $result;break;}}}//logprivate function logger($content){$logSize=100000;$log = "./log.txt";if(file_exists($log) && filesize($log) 》 $logSize){unlink($log);}file_put_contents($log, date("Y-m-d H:i:s")." ".$content."\n",FILE_APPEND);}//关注自动回复信息private function receiveEvent($postObj){$xml = "《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《Content》《!》《/Content》《/xml》";if($postObj-》Event=="subscribe"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","感谢您关注微信接口测试服务号,我是李先生!");}else if($postObj-》Event=="CLICK"){if($postObj-》EventKey=="getSalary"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【查询-》工资】按钮");}else if($postObj-》EventKey=="getAttendance"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【查询-》考勤记录】按钮");}else if($postObj-》EventKey=="getBonus"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【查询-》奖金明细】按钮");}else if($postObj-》EventKey=="getAbout"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【关于我们-》联系】按钮");}else if($postObj-》EventKey=="getJoin"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【关于我们-》加入我们】按钮");}else if($postObj-》EventKey=="getCustomer"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【关于我们-》客服】按钮");}else if($postObj-》EventKey=="getInternational"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【新闻-》国际】按钮");}else if($postObj-》EventKey=="getIndustry"){$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您点击了【新闻-》行业】按钮");}}else if($postObj-》Event=="scancode_waitmsg"){//扫码带提示的事件$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"text","您使用了扫码带提示事件,事件KEY:{$postObj-》EventKey}");}else if($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;}//处理接收的文本信息并且回复给用户private function receiveText($postObj){$content = trim($postObj-》Content);//if(strstr($content,"你好")){if(preg_match("/^\d*$/",$content)){//回复多图文信息$result = $this-》receiveNews($postObj);return $result; }else if($content=="图片"){//回复图片信息$xml = "《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《Image》《MediaId》《!》《/MediaId》《/Image》《/xml》";$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),"image","t8ASWVXMl1vyPfFmDzNEzLq2Z2B6WiM4JI4pBc23quMuc91t9NM1GWFGajCDuMv-");return $result;}else{//回复文本信息$xml = "《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《Content》《!》《/Content》《/xml》";$result = sprintf($xml,$postObj-》FromUserName,$postObj-》ToUserName,time(),$postObj-》MsgType,$content);return $result;}}//处理接收的文本信息并且回复给用户为单图文信息private function receiveImage($postObj){$xml ="《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《ArticleCount》1《/ArticleCount》《Articles》《item》《Title》《!》《/Title》 《Description》《!》《/Description》《PicUrl》《!》《/PicUrl》《Url》《!》《/Url》《/item》《/Articles》《/xml》";***隐藏网址***return $result;}//处理接收的文本信息并且回复给用户为多图文信息private function receiveNews($postObj){$con = array(***隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址***);$bodys="《item》《Title》《!》《/Title》《Description》《!》《/Description》《PicUrl》《!》《/PicUrl》《Url》《!》《/Url》《/item》";$tpl2 ="";foreach($con as $key=》$newArray) {$tpl2 .= sprintf($bodys,$newArray);}$fromUsername = $postObj-》FromUserName;$toUsername = $postObj-》ToUserName;$tpl1="《xml》《ToUserName》《!》《/ToUserName》《FromUserName》《!》《/FromUserName》《CreateTime》%s《/CreateTime》《MsgType》《!》《/MsgType》《ArticleCount》%s《/ArticleCount》《Articles》";$tpl3="《/Articles》《/xml》";$tpl1=sprintf($tpl1,$fromUsername,$toUsername,time(),"news",count($con));$result = $tpl1.$tpl2.$tpl3;return $result;}}
thinkphp3.2.1怎么验证验证码
随便从项目中复制了过来,你自己研究研究吧: /* * 验证登录 */ public function checkLogin(){ $verify = new \Think\Verify(); if($verify-》check(I(’post.code’))){ if(I(’post.user’)==C(’adminUser’) && I(’post.pwd’) == C(’adminPws’)){ session(’admin’,’com.vix.test’); $this-》success(’登陆成功’,U(’Home/Admin/index’),2); }else{ $this-》error(’用户名或密码错误’,U(’Home/Index/login’),3); } }else{ $this-》error(’验证码错误’,U(’Home/Index/login’),3); } } /* * 生成验证码 */ public function verify() { $config = array( ’fontSize’ =》 16, // 验证码字体大小 ’length’ =》 4, // 验证码位数 ’imageH’ =》 40, ’imageW’ =》 210, ); $Verify = new \Think\Verify($config); $Verify-》entry(); }
ThinkPHP自动验证的问题
1、‘self::EXISTS_VALIDATE 或者0 存在字段就验证’ 和 ‘self::VALUE_VALIDATE或者2 值不为空的时候验证’假设数据库有用户名、密码、地址、邮件4个字段,但是更新个人信息时,网页上只提供了地址、邮件、密码三个字段的修改,而当你修改的时候,你也许只写了密码和邮件,地址是空着的,这样区别就出来了啊2、通过表单提交的数据,字段不是一定会存在的吗?是的,字段一定存在,但是字段的值可能为空啊3、array(’title’,’require’,’标题必须,self::EXISTS_VALIDATE )如果前段提交的数据中含有title字段,那么要求title的值不能为空
ThinkPHP 自动验证是怎么弄得
模型类:
《?phpnamespace Home\Model;use Think\Model;class CarsModel extends Model { protected $tableName = ’area’; protected $_validate = array( array(’name’,’require’,’Name必须!’,1), array(’level’,’require’,’Level必须!’,1), array(’name’, ’1,4’, ’评论长度不符!’, 1, ’length’), // 验证长度1,4 array(’level’,array(0,1,2),’Level值的范围不正确!’,2,’in’), // 验证值域 );}
控制器:
《?phpnamespace Home\Controller;use Think\Controller;class IndexController extends Controller{ public function index() { $data = array(); $data = ’’; $data = 12; $cars = D(’Cars’); if (! $cars-》create($data)) { echo $cars-》getError(); } else { echo ’插入成功!’; } }}
说明:
Think\Model::create(mixed $data, string $type)
方法是支持参数输入的,如果没有传参,函数内部会取客户端POST过来的数据,
如果既没有传对象(或者数组)类型的$data,也没有POST数据 ,就会报错,非法的数据对象.
public function create($data=’’,$type=’’) { // 如果没有传值默认取POST数据 if(empty($data)) { $data = I(’post.’); }elseif(is_object($data)){ $data = get_object_vars($data); } // 验证数据 if(empty($data) || !is_array($data)) { $this-》error = L(’_DATA_TYPE_INVALID_’);// 语言包对应的含义:非法的数据对象 return false; } }
综上所述:需要保证你客户端POST数据过来了,或者显式传入需要验证的$data到create方法.
thinkphp接口appid和appsecret怎么生成和检测
路大概就是这样,下面我提供了完整的参考代码,如果有更好的方法,也请指教
《?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public $appid = ’dmm888’;
public $appsecret = ’
public function index(){
$this-》show(’《style type="text/css"》*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }《/style》《div style="padding: 24px 48px;"》 《h1》:)《/h1》《p》欢迎使用 《b》ThinkPHP《/b》!《/p》《br/》《/div》《script type="text/javascript" src=" charset="UTF-8"》《/script》’,’utf-8’);
}
public function test(){
if(!isset($_GET)){
$this-》apiReturn(4001,’invalid token’);
}else if(!S($_GET)){
$this-》apiReturn(4001,’invalid token’);
}
$data = array(
’id’=》2,
’username’=》’明之暗夜’,
’info’=》array(’age’=》24,’address’=》’学府路’,’url’=》’
);
if($data){
$this-》apiReturn(200,’读取用户信息成功’,$data,xml);
}
}
public function getToken(){
$ori_str = S($this-》appid.’_’.$this-》appsecret); //这里appid和appsecret我写固定了,实际是通过客户端获取 所以这里我们可以做很多 比如判断appid和appsecret有效性等
if($ori_str){ //重新获取就把以前的token删除
S($ori_str,null);
}
//这里是token产生的机制 您也可以自己定义
$nonce = $this-》createNoncestr(32);
$tmpArr = array($nonce,$this-》appid,$this-》appsecret);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
// echo $tmpStr;
//这里做了缓存 ’a’=》b 和’b’=》a格式的缓存
S($this-》appid.’_’.$this-》appsecret,$tmpStr,7200);
S($tmpStr,$this-》appid.’_’.$this-》appsecret,7200);
}
/**
* 作用:产生随机字符串,不长于32位
*/
function createNoncestr( $length = 32 )
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i 《 $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
}
具体怎么验证我就不用写了吧,这样我们只需把appid和appsecret给app前端开发者 并告诉他怎么用就可以了 token就是唯一令牌 只有token有效才可以向下执行 从而安全性可以得到一定保证
thinkphp 验证码问题
tp的验证码是这样验证的:if($_SESSION)) { $this-》error(’验证码错误!’);}生成验证码是这样的:Public function verify(){ import(’ORG.Util.Image’); Image::buildImageVerify();}
为什么thinkphp自带的验证码功能,验证码输错一次后,再输对,也一直报
亲,你那个check_verify 写的有问题啊,你始终返回的是一个json数据,$this-》ajaxReturn($res,’json’);这个是相应ajax 请求的返回方式,所以你调用时if(!check_verify($verify)) 这里应该始终会成立,所以总是走$this-》error你把$this-》ajaxReturn($res,’json’) 改成 return $res; 试一下!~~
thinkphp 验证码怎么调用
一、首先需要在控制器中加入验证码方法admin/Lib/Action/LoginAction.class.php知识点:1、ob_clean函数用途2、import方法调用think默认类库3、Image类buildImageVerify方法使用代码如下:. 代码如下:Public function verify(){ ob_clean(); //ob_clean函数 清空先前输出 import(’ORG.Util.Image’); //import调用的是message/ThinkPHP框架目录下的扩展包Extend/Library/ORG/Util/中的Image.class.php类文件 Image::buildImageVerify(); //调用buildImageVerify方法生成验证码,默认参数为($length=4, $mode=1, $type=’png’, $width=48, $height=22, $verifyName=’verify’),有兴趣的朋友可以研究下Image类}二、在模板文件中加入验证码模块admin/Tpl/Login/index.html知识点:1、验证码图片调用2、js相关运行流程了解3、__PUBLIC__常量在密码输入框后加入如下代码:. 代码如下:***隐藏网址***《html》《head》***隐藏网址***《script type="text/javascript" src="__PUBLIC__/Js/jquery-1.7.2.min.js"》《/script》//__PUBLIC__常量可以在页面加载后,“查看页面源文件”中找到定义的__PUBLIC__目录,默认为项目根目录message下的Public目录,下面会讲解如何自定义__PUBLIC__系统常量//jquery文件,只有加载了这个文件才可以调用jquery的方法《script type="text/javascript" src="__PUBLIC__/Js/login.js"》《/script》//这里的具体代码会在下面贴出,其实只是定义了一个change_code函数,也就是更换验证码的异步操作(可以在不刷新页面的情况下更换)《title》Message Board BackGround《/title》《/head》《body》 《form action="{:U(’admin.php/Login/login’)}" method="post" name="back_login" 》 《h3》简易后台登录系统《/h3》 用户名:《input type=’username’ name=’username’ id=’username’ /》 《br /》 密码:《input type=’password’ name=’password’ id=’password’ /》 《br /》 验证码:《input type="code" name="code"/》 //这里需要注意将type设置为code,name命名为code 《img src="{:U(’Admin/Login/verify’,’’,’’)}" id="code"/》 //img标签下的src就是调用Login控制器中的veryfy方法 //后面的两个参数留空是必须的,其中第2个没实际意义,主要是为了第3个参数留空,这样设置可以取消伪静态后缀名,否则默认的伪静态后缀名为html,将会导致无法正常加载图片 《a href="javascript:void(change_code(this));"》看不清《/a》 //这里调用了个 《br /》 《input type="submit" value="登录"/》 《/form》《/body》《/html》login.js文件在message/Public/目录下文件内容如下:. 代码如下:***隐藏网址***//定义验证码路径function change_code(obj){ $("#code").attr("src",verifyURL+’/’+Math.random()); //动态生成验证码方法,有兴趣的朋友可以深入研究下jq方法 return false;}另:__PUBLIC__文件定义在message/admin/Conf/config.php在配置中,加入如下内容,即可改变__PUBLIC__路径配置如下:. 代码如下://常量相关配置’TMPL_PARSE_STRING’ =》 array( ’__PUBLIC__’ =》 __ROOT__ . ’/’ . APP_NAME . ’/Public’, //路径改变为message/admin/Public,刷新页面,验证码依然可以刷新,则表明js生效,也可“查看页面源文件”),
更多文章:
全球新冠确诊病例累计超633263617(全球有多少人感染了新冠)
2024年7月22日 06:21
二建报名时间2022官网(2022河南省二建报名时间是什么)
2024年6月17日 05:11
整型常量和实型常量(在C语言中的整型变量与实型变量的区别,还有哪些变量)
2024年7月18日 03:49
javascript图片轮播左右按钮(JS如何实现左右滚动轮播代码详细点)
2024年4月21日 07:10
2021第四届进口博览会时间和地点-展区亮点?2019进博会地址+交通2019进博会停车场如何收费
2024年8月1日 06:45
documentary造句(rached造句 rachedの例文 “rached“是什麼意思)
2024年7月22日 19:30
richtextbox和textbox区别(VBA中“RefEdit”、“TextBox”、“RichTextBox”有什么区别)
2024年5月21日 02:50
linux查看日志常用命令(linux查看日志的命令是具体怎么用)
2024年6月28日 14:21
barometric(barometric pressure是什么意思)
2024年7月10日 01:24
onload和ready的区别($(document).ready()方法和window.onload有什么区别)
2024年7月23日 18:03
mysql存储数据过程(如何通过用MySQL怎么创建存储过程)
2024年7月17日 05:42
电脑suspend(vmware中的suspend和关机有什么区别,如果suspend会影响计算机速度吗)
2024年3月15日 17:35