yii2接入微信公众号,报错该公众号暂时无法提供服务 [ 2.0 版本 ]
直接贴代码
namespace frontend\controllers;
use Yii;
use core\Tkx;
use yii\web\BadRequestHttpException;
use \core\frontend\FrontendController;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use \frontend\models\DcAccountCar;
use \frontend\models\DcCouponRec;
use \frontend\models\DcCouponKind;
use \frontend\models\DcPark;
use yii\web\ForbiddenHttpException;
class ValidationController extends \core\frontend\FrontendController
{
public $postObj;
public $fromUsername;
public $toUsername;
public $keyword;
public $time;
public $token;
public function actions()
{
$weixin = $this->getWeixin();
$this->token = $weixin['token'];
}
public function actionIndex()
{
$echoStr = Yii::$app->request->get('echostr');
if($this->checkSignature() && Yii::$app->request->get('echostr') ){
echo $echoStr;
exit;
}else{
$this->responseMsg();
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
libxml_disable_entity_loader(true);
$this->postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$this->fromUsername = $this->postObj->FromUserName;
$this->toUsername = $this->postObj->ToUserName;
$this->keyword = trim($this->postObj->Content);
$this->time = time();
if( strtolower($this->postObj->MsgType)=='event'){
if( strtolower($this->postObj->Event)=='subscribe'){
//关注事件处理
$this->msg_text('您已经关注了哦');
}elseif(strtolower($this->postObj->Event)=='unsubscribe'){
//取消关注事件处理
}
}else{
if (!empty($postStr)){
if(!empty( $this->keyword ))
{
switch ($this->keyword) {
case '文字':
$this->msg_text('文字回复成功');
break;
case '图文':
$this->msg_picture('单图文回复成功','http://img2.md.veimg.cn/info/luojing/201105/20110518004.jpg','停开心图文回复测试成功','http://www.baidu.com');
break;
default:
$this->msg_text('默认回复成功');
break;
}
}else{
echo "";
}
}else {
echo "";
exit;
}
}
}
private function checkSignature()
{
$signature = Yii::$app->request->get('signature');
$timestamp = Yii::$app->request->get('timestamp');
$nonce = Yii::$app->request->get('nonce');
$token = $this->token;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
//文本回复
public function msg_text($text){
$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>";
$msgType = "text";
$contentStr = $text;
$resultStr = sprintf($textTpl, $this->fromUsername, $this->toUsername, $this->time, $msgType, $contentStr);
echo $resultStr;
}
//单图文回复
public function msg_picture($title,$pic,$desc,$url){
$pictureTpl = "<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> ";
$msgType = 'news';
$resultStr = sprintf($pictureTpl, $this->fromUsername, $this->toUsername, $this->time, $msgType , $title, $desc, $pic, $url);
echo $resultStr;
}
}
token验证已经通过,但就是报错,求找错误!
注:之前写过纯PHP下的,这是yii2移植版本
共 8 个回答
-
看日志文件吧.应该是程序出错了.
共 14 条回复jhomephper 回复于 2015-11-20 17:52 回复只能这样了
jhomephper 回复于 2015-11-23 13:35 回复@jhomephper 问题已经解决了,不知为什么关键字的时候它并不走index方法【验证token的时候走】,所有,只能在actions里面写index方法的内容了,另外,echo $resulu_str后,需要exit一下
@jhomephper 微信所有的请求只会通过你开始设置的网址来访问,即一开始要通过签名验证的方法.通过签名验证以后所有微信返回数据都是要在这里接收,要怎么处理就看你的需求了.
jhomephper 回复于 2015-12-12 12:30 回复@王飞龙 参考上面的回答直接复制修改就行
@王飞龙 直接echo就可以了...可以不用渲染视图.
拿上面的代码为例public function actionIndex() { $echoStr = Yii::$app->request->get('echostr'); if($this->checkSignature() && Yii::$app->request->get('echostr') ){ echo $echoStr; //这里就是服务器配置Url时验证Token,通过了就算是接入成功. exit; }else{ $this->responseMsg(); } } //接入成功之后,上面的代码可以修改一下. public function actionIndex() { if($this->checkSignature() ){ //分发处理的code //为了安全,建议接收信息的时候验证一下signature }else{ //signature不通过的提示信息 } }
-
wintercoder 回答于 2015-11-22 01:43 举报
建议先在微信的接口那边调试通过,然后再在yii里测试。
-
是啊Yii2 接入微信公共号不走actionIndex
我的办法是:public function init() { $this->actionIndex(); parent::init(); }
共 4 条回复codekissyoung 回复于 2016-03-29 16:34 回复嗯,赞一个!你的方法帮到了我!
codekissyoung 回复于 2016-03-29 16:35 回复@codekissyoung 具体到原理有么?我想了解下!
-
huaixiaoya 回答于 2016-03-29 16:00 举报
我的问题是 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 这个报错了
这里是日志
Undefined index: HTTP_RAW_POST_DATA in /alidata/www/advanced/frontend/controllers/CheckController.php:61
无法获取到微信服务器发送给我的xml数据 怎么解决?共 1 条回复
jhomephper 帝都
注册时间:2015-05-05
最后登录:2021-04-20
在线时长:78小时1分
最后登录:2021-04-20
在线时长:78小时1分
- 粉丝32
- 金钱5330
- 威望10
- 积分6210