123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- namespace App\Http\Controllers;
- use App\Http\Controllers\Controller;
- use App\Http\Requests;
- use Illuminate\Http\Request;
- use App\Libs\Classes\BLogger;
- use App\Libs\Classes\WxSign;
- use EasyWeChat\Foundation\Application;
- use WechatOP;
- use Illuminate\Support\Facades\Redis;
- use App\Http\Models\WechatGroupGzh;
- use App\Http\Controllers\Wechat\Api\WechatInnerApisController;
- use Doctrine\Common\Cache\PredisCache;
- // use Doctrine\Common\Cache\RedisCache;
- class WechatController extends Controller
- {
-
- public $wx_log_path;
- public $options;
- public $host;
- public $auth_host;
- public $third_host;
- public $WxSign;
- public $token;
- public $gzh_name;
- public $gzh_app_id;
- public $Redis;// redis的连接对象
- public $WechatApi;
- public $param;
- public $official_account;
- // public $wechat_group_gzh;
- public function __construct($gzh_app_id='') {
- // 方便扩展
- $this->param = array();
- $this->gzh_app_id = $gzh_app_id;
- $this->param['gzh_app_id'] = $this->gzh_app_id;
- $this->param['openid'] = '';
- // check公众号,不等于微信测试号
- if(!empty($this->gzh_app_id) && $this->gzh_app_id != 'wx570bc396a51b8ff8'){
- $this->wechat_group_gzh = WechatGroupGzh::get_wechat_group_gzh($this->gzh_app_id);
- if(!empty($this->wechat_group_gzh)) {
- $this->param['group_api'] = $this->wechat_group_gzh['group_api'];
- $this->param['group'] = $this->wechat_group_gzh['group'];
- }else{
- v('invalid gzh_app_id:'.$gzh_app_id);
- // json_echo('invalid gzh_app_id');
- }
- }
-
- $this->wx_log_path = '/var/www/ydy_wechat/storage/logs/easywechat.log';
- $this->domain = env('DOMAIN');//'aizhuishu.com';
- $this->auth_host = $this->host = env('ONLINE_AUTH_HOST');
- if(env('DEVELOP_MODE') == 'online'){
- $this->Redis = Redis::connection();// 默认的正式库的redis
- }elseif(env('DEVELOP_MODE') == 'online_test'){
- $this->Redis = Redis::connection();// 默认env的redis
- }elseif(env('DEVELOP_MODE') == 'test'){
- $this->Redis = Redis::connection('test_redis');// 测试库的redis
- }elseif(env('DEVELOP_MODE') == 'local'){
- $this->wx_log_path = '/Applications/MAMP/htdocs/ydy_wechat/storage/logs/easywechat.log';
- $this->Redis = Redis::connection('test_redis');// 测试库的redis
- }
- // v('$this->Redis');v($this->Redis);
- // v('develop:'.env('DEVELOP_MODE').' domain:'.$this->domain);
- $this->WxSign = new WxSign();
- $this->oauth_platform_callback_base_url = $this->auth_host.'oauth/';// 第三方授权微信回跳地址
-
- $this->token = env('WECHAT_OP_TOKEN');
-
- if(!empty($this->gzh_app_id)){
- // token部分的redis都用正式库的
- // 只在授权时刻提供,丢失后需要用户重新授权
- $redis_key = '[wechat_op.common.component_refresh_token.'.$this->gzh_app_id.']';
- $component_refresh_token = Redis::Get($redis_key);
- // v('redis_key:'.$redis_key.' component_refresh_token:'.$component_refresh_token);
-
- $this->options = [
- 'app_id' => $this->gzh_app_id,
- 'secret' => env('WECHAT_OP_SECRET'), // 仅适用于 单独配置公众号
- 'token' => env('WECHAT_OP_TOKEN'), // 仅适用于 单独配置公众号
- 'aes_key' => env('WECHAT_OP_AES_KEY'), // 仅适用于 单独配置公众号
- 'auth_type' => 'COMPONENT', // COMPONENT 开放平台授权公众号,MANUAL 单独配置公众号
- 'component_refresh_token' => $component_refresh_token, // 授权回调时获取的 authorizer_refresh_token,仅适用于 开放品台授权公众号
- 'oauth' => [
- 'scopes' => ['snsapi_base'], // 公众号授权用户方式 snsapi_base, snsapi_userinfo
- 'callback' => '/oauth_callback',
- ],
- 'cache' => [
- 'driver' => 'redis', // redis, filesystem, laravel
- 'dir' => storage_path('tmp') // 只有为filesystem时候这个目录才有效
- ],
- ];
- // EasyWechat\Foundation\Application 对象
- $this->app = WechatOP::app($this->options);
-
- $this->param['app'] = $this->app;
- $this->WechatApi = new WechatInnerApisController($this->param);
- $this->official_account = $this->WechatApi->get_official_account($this->gzh_app_id);
- $this->param['official_account'] = $this->official_account;
- $this->param['WechatApi'] = $this->WechatApi;
- }
- $this->set_init_param();
- v('post:');v($_POST);
- }
-
- // 初始化post,get变量,兼容两种
- public function set_init_param(){
- if(empty($_POST)) {
- $_POST = $_REQUEST;
- }
- if(empty($_REQUEST)) {
- $_REQUEST = $_POST;
- }
- if(isset($_POST['_url'])) {
- unset($_POST['_url']);
- }
- if(isset($_REQUEST['_url'])) {
- unset($_REQUEST['_url']);
- }
- }
-
- public function redirect_url($response_url){
- // v('redirect_url in:'.$response_url);
- header("Location:".$response_url);
- exit;
- }
-
- /**
- * 检查签名和时间戳
- * @param unknown_type $request
- */
- public function check_sign_params($request){
- $result = array('code'=>1,'msg'=>'','data'=>'');
- $timestamp = !empty($request->get('timestamp'))?$request->get('timestamp'):'';
- $sign = !empty($request->get('sign'))?$request->get('sign'):'';
- v('check_sign_params:$timestamp:'.$timestamp.' $sign:'.$sign);
- if(empty($timestamp) || empty($sign)){
- $result['code'] = 0;
- $result['msg'] = 'invalid param';
- return $result;
- }
-
- $timestamp = $request->get('timestamp');
- $sign = $request->get('sign');
- $now = microtime(true);
- $diff = $now - $timestamp;
- v('timestamp:'.$timestamp.' now:'.$now.' diff:'.$diff);
- // 时间戳8小时内
- if($diff > 28*3600){
- $result['code'] = 0;
- $result['msg'] = 'invalid time';
- return $result;
- }
- $my_sign = $this->WxSign->get_sign($request->all());
- v('check_sign_params sign:'.$sign.' my_sign:'.$my_sign.' info:'.json_encode($request->all()));
- if($sign != $my_sign){
- $result['code'] = 0;
- $result['msg'] = 'invalid sign';
- return $result;
- }
- return $result;
- }
-
- }
|