使用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用于处理数据和反馈结果.突出之处在于可以上传 ...
随机推荐
- sql学习笔记 - 1 数据库简介
数据库简介 """ 本学习笔记来自哔哩哔哩--老男孩Python全栈开发29期全套 https://www.bilibili.com/video/BV1QE41147hU ...
- 08 分布式计算MapReduce--词频统计
def getText(): txt=open("D:\\test.txt","r").read() txt=txt.lower() punctuation = ...
- 了解JAVA基本知识以及一下常用的dos命令
9月5日学习 常用的Dos命令 #盘符切换盘符名称: =>回车#查看当前目录下的所有文件dir#切换目录 cd change directorycd .. =>返回上一级目录#清理屏 ...
- 【转】Thunderbird 设置转移
此文章可能已经过时. 此文章的原文版本已经做出了重大更动.在此页面更新前,您可能也会觉得这个有用:Profiles - Where Thunderbird stores your messages a ...
- raft算法,cap理论中的c是数据一致性,是通过raft算法,
raft算法中的两个重要概念,自旋时间,心跳时间, 领导,候选人,随从,通过日志同步.只要大多数随从同步成功,就算成功.
- mysql知识点二
1.mysql中的语言有哪些?分别代表什么意思1.DDL(Data Define Language) 数据定义语言2.DML(Data Manipulation Language) 数据操作语言3.D ...
- 重写org.springframework.beans.BeanUtils的copyProperties方法,能在实体映射的时候把纯数字格式的日期转格式
就是在拷贝的时候加个正则的校验,如果是纯数字的日期 就转成yyyy-MM-dd HH:mm:ss的格式原本想直接用注解在实体转格式,但是那样实体会变成日期格式,所以放弃了,直接重写拷贝的方法比较简单 ...
- rang()函数
# range(start,stop,step)a = range(10)print(a)print(list(a)) # 从0开始,默认步长为1.b = range(2,10) # 从2 开始,到s ...
- Python第一次作业(20220909)
实例01:根据身高.体重计算BMI指数 ①:分别定义两个变量"height"和"weight",用于储存身高(单位:米)和体重(单位:千克).使用内置的prin ...
- DataX Web可视化分布式调度数据同步系统
因项目需要,结合目前参与的项目,以及个人技术能力范围,组合研发一套web可视化数据同步系统,正式名称:DataXP. 项目背景:接触过阿里云这类大数据平台,对于中大型项目以及需要与外部系统对接数据的情 ...