技术选型
- 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
就是数据库里,aid
为 1
的公众号接入,其他的功能大家可以自行测试
总结
1.创建公众号参数表
2.创建微信控制器
3.创建辅助函数
4.配置路由
5.设置路由忽略
发表评论 取消回复