https://packagist.org/packages/overtrue/laravel-wechat
composer require "overtrue/laravel-wechat:~4.0"
php>=7.2
laravel <5.8
如果php版本不高,可以升级php,参考我的另一篇博客
升级php版本步骤
在 config/app.php 注册 ServiceProvider 和 Facade (Laravel 5.5 + 无需手动注册)
'providers' => [
// ...
Overtrue\LaravelWeChat\ServiceProvider::class,
],
'aliases' => [
// ...
'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class,
],
创建配置文件:
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider
1.修改应用根目录下的 config/wechat.php 中对应的参数即可。
WECHAT_LOG_LEVEL=info //日志级别 最好和laravel同级
WECHAT_LOG_FILE=/var/log/coupon/report.log //日志保存文件 最好和laravel 统一
WECHAT_OFFICIAL_ACCOUNT_APPID=申请的appid
WECHAT_OFFICIAL_ACCOUNT_SECRET=申请的appsecret
WECHAT_OFFICIAL_ACCOUNT_TOKEN=
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=
2.每个模块基本都支持多账号,默认为 default。
四.使用
在中间件 App\Http\Middleware\VerifyCsrfToken 排除微信相关的路由,如:
protected $except = [
// ...
'wechat',
];
下面以接收普通消息为例写一个例子:
假设您的域名为 overtrue.me 那么请登录微信公众平台 “开发者中心” 修改 “URL(服务器配置)” 为: http://overtrue.me/wechat。
路由:
Route::any('/wechat', 'WeChatController@serve');
注意:一定是 Route::any, 因为微信服务端认证的时候是 GET, 接收用户消息时是 POST !
然后创建控制器 WeChatController:
server->push(function($message){
return "欢迎关注 overtrue!";
});
return $app->server->serve();
}
}
上面例子里的 Log 是 Laravel 组件,所以它的日志不会写到 EasyWeChat 里的,建议把 wechat 的日志配置到 Laravel 同一个日志文件,便于调试。
1.使用外观
$officialAccount = \EasyWeChat::officialAccount();//公众号
1.定义路由
Route::get('/user','WeChatController@user');
2.在WeChatController控制器中添加user方法
public function user(){
$officialAccount = \EasyWeChat::officialAccount();
var_dump($officialAccount);
}
OAuth中间件
使用中间件的情况下 app/config/wechat.php中的auth.callback就随便填写吧(因为用不着了).
1.在app/Http/Kernel.php中添加路由中间件
protected $routeMiddleware = [
//...
'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
]
2.在路由中添加中间件
routes/web.php
Route::group(['middleware' => ['wechat.oauth']],function (){
Route::get('/user','WeChatController@user');
});
WeChatController.php
public function user(){
$user = session('wechat.oauth_user.default');
dd($user);
}
登录微信公众平台,进行如下配置
打开微信,输入你的路由地址 xxx.cn/home/user
1.判断用户是否在数据库中,如果不在写如数据库,并保存Session (一天)
2.用户在数据库中,判断用户是否在Session中,不在从数据库中取出来保存session (一天)
WeChatController.php
request = $request;
}
/**
* 处理微信的请求消息
* User: clj * Date: 2020/4/10
* Time: 上午9:06
* @return mixed
*/
public function serve(){
Log::info('request arrived');
$app = app('wechat.official_account');
$app->server->push(function($message){
return "success!";
});
return $app->server->serve();
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:53
* @return array
*/
public function user(){
$result = [];
$user = $this->request->session()->get('wechat.oauth_user.default')->original;
if( !isset($user['openid']) ){
$result['message'] = "未获取到openid,请稍后再试!";
return Response::returnFalse($result);
}
$userInfoData = [
'nickname' => $user['nickname'],
'avatar' => $user['headimgurl'],
'province' => $user['province'],
'city' => $user['city'],
];
$userData = [
'openid' => $user['openid'],
'invited_code' => $this->getRandom(6),
];
$userInfo = $this->getUserService()->findUserService($user['openid']);
if( true === empty($userInfo) ){
$register = $this->getUserService()->insertUserInfoService($userInfoData,$userData);
if( true === $register ){
$result['message'] = '授权成功';
return Response::returnSuccess($result);
}else{
$result['message'] = '授权失败';
return Response::returnFalse($result);
}
}else{
$userSession['user'] = $this->request->session()->get('user');
$userSession['userInfo'] = $this->request->session()->get('userInfo');
if( empty( $userSession['user'] ) && empty( $userSession['userInfo'] ) ){
$resUser = $this->getUserService()->findUserService($user['openid']);
$resUserInfo = $this->getUserService()->findUserIinfoService($user['nickname']);
$this->request->session()->put('userInfo',$resUserInfo);
$this->request->session()->put('user',$resUser);
}
$result['message'] = '授权成功';
return Response::returnSuccess($result);
}
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午10:06
* @param $length
* @return string|null
*/
public function getRandom($param){
$str="123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
$key = '';
for($i=0;$i<$param;$i++)
{
$key .= $str[mt_rand(0,32)];
}
return $key;
}
}
UserService.php
getUserRepo()->findUserTory($openid);
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午6:12
* @param array $userData
* @return mixed
*/
public function insertUserInfoService(array $userInfoData, array $userData){
return $this->getUserRepo()->insertUserInfoDataTory($userInfoData,$userData);
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:48
* @param $nickname
* @return mixed
*/
public function findUserIinfoService(string $nickname){
return $this->getUserRepo()->findUserInfoTory($nickname);
}
}
UserRepo.php
request = $request;
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午5:49
* @param $openid
* @return mixed
*/
public function findUserTory(string $openid){
if( !isset( $openid ) ){
return false;
}
return User::where('openid',$openid)->get()->toArray();
}
/**
* User: clj * Date: 2020/4/11
* Time: 上午11:46
* @param $nickname
*/
public function findUserInfoTory(string $nickname ){
if( !isset( $nickname ) ){
return false;
}
return UserInfo::where('nickname',$nickname)->get()->toArray();
}
/**
* User: clj * Date: 2020/4/10
* Time: 下午6:13
* @param array $userData
* @return mixed
*/
public function insertUserInfoDataTory(array $userInfoData, array $userData){
if( empty( $userInfoData) && empty( $userData ) ) {
return false;
}
DB::beginTransaction();
try {
//DB::connection()->enableQueryLog();
$insertUserInfoResult = UserInfo::create($userInfoData);
$insertUserResult = User::create($userData);
//dd(DB::getQueryLog());exit();
Log::info('用户注册详情信息--:'.json_encode($userInfoData,256));
Log::info('用户注册信息--:'.json_encode($userData,256));
DB::commit();
if( empty( $insertUserInfoResult->toArray() ) || empty( $insertUserResult->toArray() )){
return false;
}else{
$userInfo = UserInfo::where('nickname',$userInfoData['nickname'])->get()->toArray();
$userData = User::where('openid',$userData['openid'])->get()->toArray();
$this->request->session()->put('userInfo',$userInfo);
$this->request->session()->put('user',$userData);
return true;
}
} catch (\Exception $e){
DB::rollback();
Log::info('提示信息:'.$e->getMessage());
Log::info('状态码:'.$e->getCode());
}
}
}