2015-11-20 12:26:05 9140次浏览 8条回答 4 悬赏 30 金钱

直接贴代码

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移植版本

  • 回答于 2015-11-20 16:39 举报

    看日志文件吧.应该是程序出错了.

    14 条回复
    回复于 2015-11-20 17:52 回复

    只能这样了

    回复于 2015-11-23 13:35 回复

    问题已经解决了,不知为什么关键字的时候它并不走index方法【验证token的时候走】,所有,只能在actions里面写index方法的内容了,另外,echo $resulu_str后,需要exit一下

    回复于 2015-11-23 21:08 回复

    微信所有的请求只会通过你开始设置的网址来访问,即一开始要通过签名验证的方法.通过签名验证以后所有微信返回数据都是要在这里接收,要怎么处理就看你的需求了.

    回复于 2015-12-12 10:51 回复

    我也遇到同样的问题了,微信接口无法对接。不知道怎么对接。

    回复于 2015-12-12 12:30 回复

    参考上面的回答直接复制修改就行

    回复于 2015-12-13 16:21 回复

    我现在遇到的问题是,无法与微信接口对接,值做了第一步,7200;但是还要返回给微信的这步不知道怎么处理了。

    回复于 2015-12-13 17:19 回复

    把接收到的'echostr'原样输出到页面就可以了.

    回复于 2015-12-13 17:28 回复

    只要是return 回去就好了是吗? 新人好迷茫。

    回复于 2015-12-13 23:16 回复

    直接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不通过的提示信息
            }
        }
    
    回复于 2015-12-14 14:51 回复

    写的很详细;我想打印一下微信接口的地方传过来的值【 error_log($_SERVER["QUERY_STRING"]."\n",3,file.'3.log'); 】,可是微信方访问我的这个方法好像什么也没有做,也没有日志文件信息。

    回复于 2015-12-15 11:13 回复

    接入成功之后,通过公众号接收到的信息都是通过这个接口.你有发信息到公众号了吗?

    回复于 2015-12-17 16:45 回复

    现在解决了,问题是这样的,不知道为什么新解析的域名(域名也是可以ping通的)微信没有返回我信息,这是我很纠结的事情。没办法,我就将代码放在我的另一台服务器上就可以了。

    回复于 2015-12-17 16:45 回复

    很感谢!

  • 回答于 2015-11-21 11:10 举报

    会不会是服务器部署问题?或者提交代码过程中出错了

  • 回答于 2015-11-22 01:43 举报

    建议先在微信的接口那边调试通过,然后再在yii里测试。

  • 回答于 2016-03-15 17:57 举报

    是啊Yii2 接入微信公共号不走actionIndex
    我的办法是:

        public function init() {
            $this->actionIndex();
              
            parent::init();
        }
    
    4 条回复
    回复于 2016-03-29 16:34 回复

    嗯,赞一个!你的方法帮到了我!

    回复于 2016-03-29 16:35 回复

    具体到原理有么?我想了解下!

    回复于 2017-11-17 14:27 回复

    是的,因为开启了CSRF验证

  • 回答于 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 条回复
  • 回答于 2016-05-26 10:04 举报

    正解在这里

    微信+yii2的那些坑

    2 条回复
    回复于 2017-08-09 16:48 回复

    牛逼 我些坑我也踩了一边

    , 觉得很赞
  • 回答于 2016-05-27 15:08 举报

    echo $_GET['echostr'];exit;
    光写个这也能验证通过。。。

  • 回答于 2016-07-14 22:56 举报

    上面那位 kaopur的回答是正解,不过建议直接给出答案

您需要登录后才可以回答。登录 | 立即注册
jhomephper
副总裁

jhomephper 帝都

注册时间:2015-05-05
最后登录:2021-04-20
在线时长:78小时1分
  • 粉丝32
  • 金钱5330
  • 威望10
  • 积分6210

热门问题