ThinkPHP6接入easywechat详解

时间:2021年05月27日

因为要给UniAdmin开发微信公众号应用,本想使用原生方式开发,但觉得有点扯,为了便捷,于是乎就使用easywechat。但是后来发现先前想走捷径的想法是错的,因为捷径隐藏着许多的坑。。。


安装easywechat


因为thinkphp6要求 php版本>=php7.1

所以使用下面的版本

注:安装之前先要把vendor备份好,有可能会把原先的vendor其它应用弄丢


composer require overtrue/wechat:~4.0 -vvv


在UniAdmin系统中自带composer.phar文件(简单,不需要安装composer),所以也可以使用


php composer.phar require overtrue/wechat:~4.0 -vvv


创建公众号配置文件


在项目的根目录下的config文件夹创建wechat_config.php配置文件

配置如下内容(根据自己的需求配置),重点是app_id、secret、token、aes_key要配对,其它项默认就行。


return [\n    /**\n     * 账号基本信息,请从微信公众平台/开放平台获取\n     */\n    'app_id'  => 'wx77e6****',         // AppID\n    'secret'  => 'abac032d*******',     // AppSecret\n    'token'   => 'junlan365',          // Token\n    'aes_key' => 'h6gU2qdfpJBJ8HDgzl****',                    // EncodingAESKey,兼容与安全模式下请一定要填写!!!\n\n    /**\n     * 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名\n     * 使用自定义类名时,构造函数将会接收一个 `EasyWeChat\\Kernel\\Http\\Response` 实例\n     */\n    'response_type' => 'array',\n\n    /**\n     * 日志配置\n     *\n     * level: 日志级别, 可选为:\n     *         debug/info/notice/warning/error/critical/alert/emergency\n     * path:日志文件位置(绝对路径!!!),要求可写权限\n     */\n    'log' => [\n        'default' => 'dev', // 默认使用的 channel,生产环境可以改为下面的 prod\n        'channels' => [\n            // 测试环境\n            'dev' => [\n                'driver' => 'single',\n                'path' => '/tmp/easywechat.log',\n                'level' => 'debug',\n            ],\n            // 生产环境\n            'prod' => [\n                'driver' => 'daily',\n                'path' => '/tmp/easywechat.log',\n                'level' => 'info',\n            ],\n        ],\n    ],\n\n    /**\n     * 接口请求相关配置,超时时间等,具体可用参数请参考:\n     * http://docs.guzzlephp.org/en/stable/request-config.html\n     *\n     * - retries: 重试次数,默认 1,指定当 http 请求失败时重试的次数。\n     * - retry_delay: 重试延迟间隔(单位:ms),默认 500\n     * - log_template: 指定 HTTP 日志模板,请参考:https://github.com/guzzle/guzzle/blob/master/src/MessageFormatter.php\n     */\n    'http' => [\n        'max_retries' => 1,\n        'retry_delay' => 500,\n        'timeout' => 5.0,\n        // 'base_uri' => 'https://api.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri\n    ],\n\n    /**\n     * OAuth 配置\n     *\n     * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login\n     * callback:OAuth授权完成后的回调页地址\n     */\n    'oauth' => [\n        'scopes'   => ['snsapi_userinfo'],\n        'callback' => '/examples/oauth_callback.php',\n    ],\n];


创建控制器

创建一个控制器,Service.php,在这里要先确保这个控制器能正常访问,不然和后面遇到问题纠结一起会掉下深坑。

写上下面代码

/**\n * 君兰IT小程序\n * 官方网址:https://www.junlan365.com\n * 作者:秋水\n * 微信QQ:644828230\n */\nnamespace app\\wechat\\controller;\nuse EasyWeChat\\Factory;\nclass Service\n{\n    public function index(){\n        $app = Factory::officialAccount(config('wechat_config'));\n        $response = $app->server->serve();\n        ob_clean();\n//       将响应输出\n        $response->send();\n        exit;\n    }\n\n\n}



验证服务器token


由于路由的配置不一样,所以访问前面的控制器也会不一样,确保前面的控制器能正常访问这是验证token的第一步。

坑,一般都会在这一步出现。


经过多次的验证,总是提示token验证失败,我的检查:


1、在浏览器打开response返回的数据是success,但上面有一空行,觉得是header头出现问题,其实是没有影响


2、在微信公众号官方后台提交,使用日记获取反回的数据,echostr正常,但就是不断地提示token验证失败


3、网上说要多提交几次,我提交了n 次了,没通过。


4、使用原生方法验证


$token='请填写你的公众号token';\n\n$timestamp = $_GET['timestamp'];\n$nonce = $_GET['nonce'];\n$signature = $_GET['signature'];\n$array = array($timestamp,$nonce,$token);\nsort($array,SORT_STRING);\n\n//将排序后的三个参数拼接后用sha1加密\n$tmpstr = implode('',$array);\n$tmpstr = sha1($tmpstr);\n\n//将加密后的字符串与 signature 进行对比, 判断该请求是否来自微信\nif($tmpstr == $signature)\n{\necho $_GET['echostr'];\n}\nreturn false;

这一次提交验证通过了,由此可知道访问路径是没问题的,但不是我的最终目标。


5、苦恼中,突然想到了缓存,于是在前面(见创建控制器的代码)的控制器代码中加上ob_clean,果不其然,终于验证通过,隐藏得真深啊,天坑!

注:ob_clean清空(擦掉)输出缓冲区


如果这里没有你遇到的问题,或许还可以去参考一下EasyWeChat官方给出的一些问题。


来源:君兰IT(QQ/微信:644828230),转载请注明出处!


本文地址:https://www.junlan365.com/show/id/54.html


最新文章
热点文章