多公众号管理🚥

使用 EasyWechat 扩展包进行多公众号管理🚥

多公众号管理

使用 EasyWechat 扩展包进行多公众号管理,具体步骤分为以下几步:

  1. 新建公众号数据表
  2. 创建辅助函数
  3. 创建微信控制器
  4. 配置路由
  5. 设置路由忽略
  6. 开始使用

公众号数据表

php artisan make:model Models/WechatMp -m  //wechat_mps

在生成的 wechat_mpsmigration 文件里写入微信相关数据字段:

public function up()
{
  Schema::create('wechats', function (Blueprint $table) {
    $table->increments('id');   //微信公众号基本参数
    $table->string('user_id')->nullable();
    $table->string('name')->nullable();
    $table->string('type')->nullable();
    $table->string('status')->nullable();
    $table->string('logo')->nullable();
    $table->string('is_use')->nullable();
    $table->string('is_connect')->nullable();

    $table->string('wechat_app_id')->nullable(); //微信公众号设置参数
    $table->string('wechat_secret')->nullable();
    $table->string('wechat_token')->nullable();
    $table->string('wechat_aes_key')->nullable();

    $table->string('pay_mch_id')->nullable();  //微信支付设置参数
    $table->string('pay_api_key')->nullable();
    $table->string('pay_cert_path')->nullable();
    $table->string('pay_key_path')->nullable();

    $table->string('op_app_id')->nullable();  //微信开放平台设置参数
    $table->string('op_secret')->nullable();
    $table->string('op_token')->nullable();
    $table->string('op_aes_key')->nullable();

    $table->string('work_corp_id')->nullable();  //微信企业号设置参数
    $table->string('work_agent_id')->nullable();
    $table->string('work_secret')->nullable();
    $table->timestamps();
  });
}

创建辅助函数

接下来在 App\Handlers 创建一个辅助函数 WechatConfigHandler.php 文件,代码如下:

<?php

namespace App\Handlers;

use App\Models\WechatMp;
use EasyWeChat\Factory;

class WechatConfigHandler
{
    //[1-1]微信公众号设置
    public function app_config($account)
    {
        $wechat = WechatMp::where('id',$account)->first();
        if (!$wechat) {
            return $config = [];
        }
        $config = [
            'app_id'  => $wechat->wechat_app_id,      // AppID
            'secret'  => $wechat->wechat_secret,      // AppSecret
            'token'   => $wechat->wechat_token,       // Token
            'aes_key' => $wechat->wechat_aes_key,     // EncodingAESKey,兼容与安全模式下请一定要填写!!!
            'response_type' => 'array',
            'oauth'   => [
                //'scopes'   => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))),
                'scopes'   => 'snsapi_userinfo',
                //'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/oauth_callback'),
                'callback' => '/oauth_callback/'.$account,
                ],
            'log' => [
                'level' => 'debug',
                'file' => storage_path('logs/wechat.log'),  //这个必须要有,要不调试有问题,你都会找不到原因
            ],
        ];
        return $config;
    }

    //[1-2]生成微信公众号相关
    public function app($account)
    {
        $app = Factory::officialAccount($this->app_config($account));
        return $app;
    }

    //[2-1]微信支付设置
    public function pay_config($account)
    {
        $wechat = Wechat::where('aid',$account)->first();
        if (!$wechat) {
            return $config = [];
        }
        $config = [
            'app_id'      => $wechat->wechat_app_id,      // AppID
            'secret'      => $wechat->wechat_secret,      // AppSecret
            'mch_id'      => $wechat->pay_mch_id,
            'key'         => $wechat->pay_api_key,   // API 密钥
            // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'   => $wechat->pay_api_key, // XXX: 绝对路径!!!!
            'key_path'    => $wechat->pay_api_key,      // XXX: 绝对路径!!!!
            'notify_url'  => '默认的订单回调地址',     // 你也可以在下单时单独设置来想覆盖它
        ];
        return $config;
    }

    //[2-2]生成微信支付相关
    public function pay($account)
    {
        $pay = Factory::payment($this->pay_config($account));
        return $pay;
    }

    //[3-1]微信小程序设置
    public function mini_config($account)
    {
        $wechat = Wechat::where('aid',$account)->first();
        if (!$wechat) {
            return $config = [];
        }
        $config = [
            'app_id'  => $wechat->wechat_app_id,         // AppID
            'secret'  => $wechat->wechat_secret,     // AppSecret
            'response_type' => 'array',
        ];
        return $config;
    }

    //[3-2]微信小程序相关
    public function miniProgram($account)
    {
        $miniProgram = Factory::miniProgram($this->mini_config($account));
        return $miniProgram;
    }

    //[4-1]微信开放平台设置参数
    public function opconfig($account)
    {
        $wechat = Wechat::where('aid',$account)->first();
        if (!$wechat) {
            return $config = [];
        }
        $config = [
            'app_id'   => $wechat->op_app_id,
            'secret'   => $wechat->op_secret,
            'token'    => $wechat->op_token,
            'aes_key'  => $wechat->op_aes_key
        ];
        return $config;
    }

    //[4-2]微信开放平台相关
    public function openPlatform($account)
    {
        $openPlatform = Factory::openPlatform($this->opconfig($account));
        return $openPlatform;
    }

    //[5-1]微信企业号设置参数
    public function workconfig($account)
    {
        $wechat = Wechat::where('aid',$account)->first();
        if (!$wechat) {
            return $config = [];
        }
        $config = [
            'corp_id'   => $wechat->work_corp_id,
            'agent_id'   => $wechat->work_agent_id,
            'secret'    => $wechat->work_secret,

            'response_type' => 'array',
        ];
        return $config;

    }

    //[5-2]微信企业号相关
    public function work($account)
    {
        $work = Factory::work($this->workconfig($account));
        return $work;
    }
}

创建微信控制器

创建一个微信控制器,进行微信公众平台对接:

php artisan make:controller Api/WechatController

并写入如下代码:

<?php

namespace App\Http\Controllers\Api;

use App\Handlers\WechatConfigHandler;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class WeChatController extends Controller
{
    protected $wechat;
    protected $app;

    public function __construct(WechatConfigHandler $wechat)
    {
        $this->wechat = $wechat;
    }

    /**
     * 处理微信的请求消息
     * @return string
     */
     public function serve($account)
    {
        //微信发来配置GET请求,可以在此处更改is_connect状态为已连接
        $this->app = $this->wechat->app($account);
        $this->app->server->push(function ($message) use ($account) {
            switch ($message['MsgType']) {
                case 'event':
                    return $this->event($message, $account);
                    break;
                case 'text':
                    return $this->text($message['Content'], $account, $message);
                    break;
                case 'image':
                    return '收到图片消息';
                    break;
                case 'voice':
                    return '收到语音消息';
                    break;
                case 'video':
                    return '收到视频消息';
                    break;
                case 'location':
                    return '收到坐标消息';
                    break;
                case 'link':
                    return '收到链接消息';
                    break;
                case 'file':
                    return '收到文件消息';
                // ... 其它消息
                default:
                    return '收到其它消息';
                    break;
            }
        });

        return $this->app->server->serve();
    }

    //微信登录
    public function oauth_callback($account)
    {
        $app = $this->wechat->app($account);
        $user = $app->oauth->user();
        session(['wechat.oauth_user' => $user->toArray()]);
        //不管在哪个页面检测用户登录状态,都要写入session值:target_url
        $targetUrl = session()->has('target_url') ? session('target_url') : '/' ;
        //header('location:'. $targetUrl);
        return redirect()->to($targetUrl);
    }

    // 获取jssdk配置
    public function getJSSDKConfig(Request $request)
    {
        $arr = explode(',', $request->get('apis'));
        $debug = $request->get('debug') === 'true' ? true : false;
        $json = $request->get('json') === 'true' ? true : false;
        $url = $request->get('url');

        if (!$url)
            return response()->json(['status' => false, 'msg' => 'params error', 'data' => '']);

        $app = app('wechat.official_account');
        $app->jssdk->setUrl($url);
        $config = $app->jssdk->buildConfig($arr, $debug, $json, $url);
        return response($config);
    }
}

配置路由:

//web.php 
Route::any('/wechat/{account}', 'Api\WeChatController@serve');
Route::any('/oauth_callback/{account}','WechatController@oauth_callback');
Route::get('/wechat/jssdkconfig', 'Api\WeChatController@getJSSDKConfig');

设置路由忽略

这一步千万不能忘记,中间键 Middleware 文件夹里 VerifyCsrfToken.php 修改路由忽略,因为微信发过来的请求方式不定,一下 GET ,一下 POSTPOST 就要排除 access_token 限制:

protected $except = [
        "/admin/wangeditor/upload","wechat/*"
    ];

开始使用

然后在使用的时候,可以这样写:

$app = $this->wechat->app($account);  //公众号
$app = $this->wechat->pay($account);  //微信支付
$app = $this->wechat->miniProgram($account);  //微信小程序
$app = $this->wechat->work($account);  //企业号应用

微信公众平台开发者选项里 URL 要设置为:

http://www.xxx.com/wechat/1     //其中的 1 就为传过来的公众号id $account参数

最后送给自己💪

时间,会带来惊喜。只要我们肯认真地,有希望地,走过每一天。

⬆️

写的不错,赞助一下主机费

扫一扫,用支付宝赞赏
扫一扫,用微信赞赏

暂无评论~~