yii2学习笔记——yii2引入微信API

1.首先需要构建公众号,没有公众号的话可以使用个人微信号去微信公众平台申请,网址如下

http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

其中URL为你需要测试的服务器接口,Token自己随便填一个,只是在服务器端验证的时候设置得一样就行

这里写图片描述

2.提交以上信息之后,微信服务器端将以get形式向你所填写的url处发送如下信息,包括signature/timestamp/nonce/echostr
这里写图片描述

在服务器端需要对get的信息进行验证,微信官方给出了如下sample,笔者亲证有效,贴出代码如下

<?php

define("TOKEN", "weixin"); //需要定义自己的token,与填写的信息一致
public class WeixinController extends controller
    public function init()
    {
        parent::init();
        $this->valid();
    }
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = 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 actionRespond()
    {
    //我的代码
    }
}

?>

在init()中调用valid可在类实例化时被自动调用加载,起到验证的作用。

3.确认提交,页面提示配置成功,之后就可以扫二维码进入测试号。
这里写图片描述
但当我发消息时,收到了这样的回复“该公众号暂时无法提供服务,请稍后再试”。经过百度之后发现了这样的问题,微信对于PHP大于5.6的版本不再支持”HTTP_RAW_POST_DATA”,php官方建议使用使用 php://input代替,因此我们将GLOBALS[“HTTP_RAW_POST_DATA”]改成file_get_contents(‘php://input’),然而这时依然是该公众号暂时无法提供服务的回应。

4.经过一番查找与思索,发现yii2无法接收到post数据的真正原因,因为其为了防止CSRF攻击,对POST的数据会进行验证,而微信的数据被拦截了,因此可设置$enableCsrfValidation=false,另外也可以在app/config/web.php的config中的request里面添加

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'M6P-95oYhvzBmTI8vbeJrLMJwfvdBZY0',
            'enableCsrfValidation' => false,
        ],

5.然后发现还是没有变化……于是打开微信公众平台接口调试工具

http://mp.weixin.qq.com/debug/

填写信息,除了URL外都可以随便乱填

这里写图片描述

然后选择检查问题之后,先是请求失败,经过修改验证方法(只要验证成功后,可以删除掉之前的验证代码),得到了第二种回应
这里写图片描述

此时测试公众号返回依然不成功。

6.在调试了一天之后,终于找到了问题,就是微信似乎太能支持Yii2的controller/action这样的路由方式,当我把需要访问的action放入到init()中之后,在实例化类时自动调用该方法,访问的路由变为 ?r=wechat 而不是 ?r=wechat/respond 之后,终于得到了正确的返回。这意味着之上所有的URL都将改成新的形式。

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值