使用laravel开发微信公众的一个大坑,适合新手学习的laravel接入微信接口
最近使用laravel做微信公众号二次开发,发现网上能够参考的资料基本上很少,很多地方都讲的不够详细,致使许多新手采坑无数,所以这篇文章讲一下如何使用laravel接入微信接口,实现微信公众号二次开发,顺便也会穿插一些laravel基础知识的讲解。
首先学习之前我们得有一个已经认证过的微信公众号,当然如果你只是学习一下不想花钱的话,点击这里微信公众平台,即可获得一个测试微信号,已经开通了接口,直接用即可。
其它的还需要一台web服务器,已经备案的域名,这些我就不做赘述。
首先我强调一下,能有兴趣看我这篇文章的,一定是有一定的php基础的,并且对国产thinkphp框架也是有一定了解的。那么laravel相对于thinkphp,有一个明显的区别就是,在域名中访问某个域名,需要定义其所对应的控制器,这个需要在routes里面添加
Route::get('weixin/token', 'WeixinController@token');
Route::post('weixin/token', 'WeixinController@token');
重要的一点一定要定义发请求的方式是POST还是GET,要不然是无法正确响应请求的,这个地方坑过很多使用laravel开发微信的朋友们,而这些在thinkphp中是不用定义的。那么在这里有个坑就是微信验证默认token的请求是GET方式,但是真正接入微信服务器用以开发时采用的确实POST方式,所以我们在微信后台配置验证接口时,要使用GET方式,在验证成功配置完成后再改回POST方式。
另外laravel最主要的是引进了一个中间件的概念,所有通过URL发过来的请求都需要经过中间件一系列验证才能分发给相应的控制器。然后最重要的我们在所有post请求中必须包含一个crsfToken的字段用以防止跨域攻击。但是如果我们是用在微信开发接口中,显然微信服务器是不会发送包含这个字段的,那么就需要我们手动的关闭,关闭的方法后面会讲到。
下面开始,教你一步一步实现微信自动回复。
将laravel安装部署到服务器上面(composer或者从官网下载离线安装包都行),笔者这里用的是最新版的laravel5.4.
打开routes/web.php,在里面增加一行:
Route::any('weixin/api', 'WeixinController@api');
打开app\Http\Middleware\VerifyCsrfToken.php,将第14行
protected $except = [
//
];
双斜杠替换为
'weixin/api',
在app\Http\目录下面新建WeixinCntroller.php,替换内容为:
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Requests;
use Illuminate\Http\Request;
class weixinController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
//验证消息
public function api()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
//检查签名
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = "weixin";
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
//响应消息
}
在微信公众号后台配置接口如下
注意:token令牌应该与WeixinController.php中配置的令牌一致。点击提交,如果提示“提交成功”,那么第一步就大功告成。错了?很正常,仔细检查一下配置信息是否正确,代码是否复制完全?
接下来一步:将之前的api操作方法
public function api(){
.......
}
替换为:
public function api()
{
//get post data, May be due to the different environments
$postStr = file_get_contents("php://input", 'r');//php:input
//写入日志 在同级目录下建立php_log.txt
//chmod 777php_log.txt(赋权) chown wwwphp_log.txt(修改主)
error_log(var_export($postStr,1),3,'php_log.txt');
//日志图片
//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
//订阅事件
if($postObj->Event=="subscribe")
{
$msgType = "text";
$contentStr = "欢迎关注安子尘,微信babyanzichen";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
//语音识别
if($postObj->MsgType=="voice"){
$msgType = "text";
$contentStr = trim($postObj->Recognition,"。");
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
//自动回复
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "小朋友你好!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
此时,打开微信公众号,即可开始愉快的开撩了
使用laravel开发微信公众的一个大坑,适合新手学习的laravel接入微信接口的更多相关文章
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- h5开发微信公众号重定向到关注页面没有关注按钮 (微信你个坑)
搜索微信公众号是这样的 微信公众号重定向到关注页面没有关注按钮 如何微信公众号重定向到关注页面没有关注按钮,请看上篇笔记 无解,微信一直在封这种通过链接跳转到公众号关注页面的方法.只有放个二维码提示长 ...
- [c#]asp.net开发微信公众平台(6)阶段总结、服务搭建、接入
经过前5篇,跟着一步步来的话,任何人都能搭建好一个能处理各种微信消息的框架了,总结一下最容易忽略的问题: 1.文本消息中可以使用换行符\n : 2.微信发来的消息中带的那个长整型的时间,我们完全 ...
- 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务
目的:用PHP在SAE上搭建一个微信公众号的服务器. 1.申请一个SAE云账号 SAE申请地址:http://sae.sina.com.cn/ 可以使用微博账号登陆,SAE是新浪的云服务,时间也比较 ...
- 微信公众号Markdown编辑器, 适合代码排版
随着大家都转战微信公众平台,如何快速的编写文章就摆在了首要位置.不可否认,使用微信自带的编辑器可以做出好看的排版,甚至用第三方编辑器有更多的模板.但是,这些全部都需要手动的调整.本来公众平台就算是自媒 ...
- 【原创】微信公众号与HTML 5混合模式揭秘4——jssdk调用微信扫一扫
微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片 微信公众号与HTML 5混合模式揭秘3——JSSDK获取地理位置 在JS ...
- 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...
- 【整站源码分享】分享一个JFinal3.4开发的整站源码,适合新手学习
分享这个源码是14年开发上线的<威海创业者>站点的全套整站源码,前后端都在一个包里.当时开发使用的是JFinal1.4,最近改成了JFinal3.4.使用的JSP做的页面.有一定的参考价值 ...
- 微信公众号实现zaabix报警2017脚本(升级企业微信后)
#!/bin/bash CropID='xxxxxxxxxxxxxxxxx' Secret='xxxxxxxxxxxxxxxx' GURL="https://qyapi.weixin.qq. ...
- php简单实现通讯录采集,我的第一个php,适合新手
起源于要整理通讯录,原先用的是文件调查,现在学了php,就自己试一下.程序短小精悍,适于学习.有两个文件,bj.html用于显示和采集表单信息.bj.php用于处理数据和反馈结果.突出之处在于可以上传 ...
随机推荐
- C语言初级阶段8——预处理
C语言初级阶段8--预处理 预定义符号 1.概念:预处理是编译之前做的一些事. 2.常用的预定义符号: 注意:: (1)-(4)的格式占位符都用%是,如:printf("%s",D ...
- wait_event_interruptible() 等待队列
在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒. 1.定义"等待队列头部" wait_queue_head_t my_queue; wait_ ...
- 数据库自动备份,crontab定时任务
查看crontab运行状态service crond status 查看当前用户的crontab,输入 crontab -l: 编辑crontab,输入 crontab -e: 删除crontab,输 ...
- ping 的七种用法【搬运】
原作者:Pheenet菲尼特 原地址:https://www.toutiao.com/a6783191796659782148/?tt_from=weixin&utm_campaign=cli ...
- UDP与TCP ---FundeBug
UDP 面向无连接 首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了.并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作. 具体来说就是: ...
- django_静态文件
**************************************************************************************************** ...
- Qt回车键提交文本代码
QTextEdit 文本框中 回车键提交文本,Ctrl+回车键实现换行的代码: void QTextEdit::keyPressEvent(QKeyEvent * e) { e->ignore( ...
- flowable初体验踩坑及概述
遵守bpmn2.0协议(前提)(还在找比较好用的绘图工具) 可以使用idea插件进行绘图保存成xml进行改造编写 Flowable BPMN visualizer和JBoss jBPM , 暂时使用的 ...
- java比较器:Comparable和Comparator
java比较器 Comparable 一.java中对象可以通过==或!=比较地址值是否相同,在开发场景中还需要对对象做出大小比较以排序 需要利用接口Comparable或Comparator Com ...
- Java's absolute and relative path
在java中文件目录中带"/"的是绝对路径,不带"/"的是相对路径. 请求页面的写法,在web中,页面路径主要写的有以下几种 1.重定向 2.转发 3.超链接 ...