安装easywechat
因为thinkphp6要求 php版本>=php7.1
所以使用下面的版本
注:安装之前先要把vendor备份好,有可能会把原先的vendor其它应用弄丢
时间:2021年05月27日
因为要给UniAdmin开发微信公众号应用,本想使用原生方式开发,但觉得有点扯,为了便捷,于是乎就使用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