技术选型

  • Laravel
  • EasyWechat

实现

新建一个 Laravel 项目,配置好数据库参数,引入 Easywechat 扩展

创建数据表

php artisan make:model Wechat -m

初始化微信相关数据字段

public function up()
    {
        Schema::create('wechats', function (Blueprint $table) {
            $table->increments('id');
            $table->string('aid')->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\Wechat;
use EasyWeChat\Factory;

class WechatConfigHandler
{
    //[1-1]微信公众号设置
    public function app_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
            '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 WechatController
protected $wechat;

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

public function serve($account)
{
    $app = $this->wechat->app($account);
    $app->server->push(function($message){
        switch ($message['MsgType']) {
            case 'event':
                if ($message['Event'] == 'subscribe') {
                    return '欢迎关注 Elephdev!';
                }
                break;
            case 'text':
                return '收到文字消息';
                break;
            case 'image':
                return '收到图片消息';
                break;
            case 'voice':
                return '收到语音消息';
                break;
            case 'video':
                return '收到视频消息';
                break;
            case 'location':
                return '收到坐标消息';
                break;
            case 'link':
                return '收到链接消息';
                break;
            // ... 其它消息
            default:
                return '收到其它消息';
                break;
        }
    });
    $response = $app->server->serve();
    return $response;
}

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);
}

Middleware 文件夹里 VerifyCsrfToken.php 修改路由忽略

protected $except = [
    'wechat/*'
];

使用示例

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

微信公众平台开发者选项设置

http://www.xxx.com/wechat/1

路由配置

Route::any('wechat/{account}','WechatController@serve');
Route::any('/oauth_callback/{account}','WechatController@oauth_callback');

wechat/1 就是数据库里,aid1 的公众号接入,其他的功能大家可以自行测试

总结

1.创建公众号参数表
2.创建微信控制器
3.创建辅助函数
4.配置路由
5.设置路由忽略

点赞(0)

评论列表 共有 0 评论

暂无评论