easyweacht laravel 公众号开发 网页授权
开始前,需要配置公众号网页授权
进入公众号开发-》接口权限-》网页服务-》网页授权-》网页授权域名-》www.bychem.com m.bychem.com
一、config wechat 配置文件
<?php
/*
* This file is part of the overtrue/laravel-wechat.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
return [
/*
* 默认配置,将会合并到各模块中
*/
'defaults' => [
/*
* 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
*/
'response_type' => 'array',
/*
* 使用 Laravel 的缓存系统
*/
'use_laravel_cache' => true,
/*
* 日志配置
*
* level: 日志级别,可选为:
* debug/info/notice/warning/error/critical/alert/emergency
* file:日志文件位置(绝对路径!!!),要求可写权限
*/
'log' => [
'level' => env('WECHAT_LOG_LEVEL', 'debug'),
'file' => env('WECHAT_LOG_FILE', storage_path('logs/wechat.log')),
],
],
/*
* 路由配置
*/
'route' => [
/*
* 开放平台第三方平台路由配置
*/
// 'open_platform' => [
// 'uri' => 'serve',
// 'action' => Overtrue\LaravelWeChat\Controllers\OpenPlatformController::class,
// 'attributes' => [
// 'prefix' => 'open-platform',
// 'middleware' => null,
// ],
// ],
],
/*
* 公众号
*/
'official_account' => [
'default' => [
'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'wxfab5781c50794b96'), // AppID
'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'e627eb355d2ca4483d590402292bccfd'), // AppSecret
'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'aschem2020'), // Token
'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', 'V9DLLG5Z8VebIKCmpVXPHOoWhC84YTQFhOuROtzgo21'), // EncodingAESKey
/*
* OAuth 配置
*
* scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
* callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。)
*/
'oauth' => [
'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))),
'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/wechat/callback'),
],
],
],
/*
* 开放平台第三方平台
*/
// 'open_platform' => [
// 'default' => [
// 'app_id' => env('WECHAT_OPEN_PLATFORM_APPID', ''),
// 'secret' => env('WECHAT_OPEN_PLATFORM_SECRET', ''),
// 'token' => env('WECHAT_OPEN_PLATFORM_TOKEN', ''),
// 'aes_key' => env('WECHAT_OPEN_PLATFORM_AES_KEY', ''),
// ],
// ],
/*
* 小程序
*/
// 'mini_program' => [
// 'default' => [
// 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', ''),
// 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', ''),
// 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', ''),
// 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', ''),
// ],
// ],
/*
* 微信支付
*/
// 'payment' => [
// 'default' => [
// 'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false),
// 'app_id' => env('WECHAT_PAYMENT_APPID', ''),
// 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'),
// 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'),
// 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!!
// 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!!
// 'notify_url' => 'http://example.com/payments/wechat-notify', // 默认支付结果通知地址
// ],
// // ...
// ],
/*
* 企业微信
*/
// 'work' => [
// 'default' => [
// 'corp_id' => 'xxxxxxxxxxxxxxxxx',
// 'agent_id' => 100020,
// 'secret' => env('WECHAT_WORK_AGENT_CONTACTS_SECRET', ''),
// //...
// ],
// ],
];
二、wechatController
<?php
namespace App\Http\Controllers\M;
use App\Library\Common;
use App\Models\Member\MemberConnect;
use App\Services\Wechat\MenuService;
use App\Services\Wechat\MessageService;
use App\Services\Wechat\UserService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class WeChatController extends Controller
{
//
/**
* 处理微信的请求消息
*
* @return string
*/
/* public function serve()
{
Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
$app = app('wechat.official_account');
$app->server->push(function($message){
return "欢迎关注 一览商城!";
});
return $app->server->serve();
}*/
public function serve(MessageService $messageService)
{
Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
$app = app('wechat.official_account');
$app->server->push(function($message) use($messageService){
return $messageService->index($message);
});
return $app->server->serve();
}
/**
* 发起授权
* @return mixed
*/
public function oauth(){
Log::info('start', ['oauth']);
$app = app('wechat.official_account');
return $app->oauth->scopes(['snsapi_userinfo'])->redirect();
}
/**
* 授权回调
* @return mixed
*/
public function callback(){
Log::info('start', ['oauth_callback']);
$app = app('wechat.official_account');
// 获取 OAuth 授权结果用户信息
$user = $app->oauth->user();
if(!$user){
Log::info('oauth_callback_user_error', ['none user']);
}
//Log::info('oauth_callback_user', [$user]);
$openid = $user->getId();
$UserService = new UserService();
$user_info =$UserService->getUserInfo($openid);
//Log::info('user_info', $user_info);
//查询openid 有没有绑定 member
$memberConnect = MemberConnect::where('openid', '=', $openid)->first();
$member_id = 0;
if(!$memberConnect){
//没保存先保存memberConnect
Common::createMemberConnect($user_info, 3);
}else{
$member_id = $memberConnect->member_id;
}
if($member_id > 0){
//openid 已经跟会员member绑定,则默认登录
Auth::guard('member')->loginUsingId($member_id);
Log::info('wechat login email', [auth('member')->user()->email]);
return redirect(route('m.member.index'));
}
if($member_id ==0 ){
//openid还没跟会员member绑定,提醒用户去设置绑定
return redirect(route('m.bind_account', array('openid'=>$openid)));
}
}
/**
* 获取openid
* @param Request $request
* @return array
*/
public function getOpenid(Request $request){
/* $member_id = Cache::get($request->get('access_token'));
if($member_id && Cache::has('wx_openid_'.$member_id)){
$wx_Info = Cache::get('wx_openid_'.$member_id);
return Y::success('yes',$wx_Info);
}elseif($member_id && !Cache::has('wx_openid_'.$member_id)){
return Y::error('no');
}else{
return ['code'=>3,'msg'=>'非法操作'];
}*/
return 'open_id';
}
public function wxMenu(Request $request,MenuService $menuService){
$buttons = [
[
"name" => "我要采购",
"sub_button" => [
[
"type" => "view",
"name" => "发布采购",
"url" => "http://m.bychem.com/inquiry/add"
],
[
"type" => "view",
"name" => "采购管理",
"url" => "http://m.bychem.com/inquiry/lists?type=quote"
],
[
"type" => "view",
"name" => "采购订单",
"url" => "http://m.bychem.com/order/lists?type=pay"
],
],
],
[
"name" => "我要销售",
"sub_button" => [
[
"type" => "view",
"name" => "发布产品",
"url" => "http://m.bychem.com/sale/goods_add"
],
[
"type" => "view",
"name" => "产品管理",
"url" => "http://m.bychem.com/sale/goods_list"
],
[
"type" => "view",
"name" => "询盘管理",
"url" => "http://m.bychem.com/sale/lists"
],
[
"type" => "view",
"name" => "销售订单",
"url" => "http://m.bychem.com/sale/order"
],
],
],
[
"name" => "会员中心",
"sub_button" => [
[
"type" => "view",
"name" => "注册/登录",
"url" => "http://m.bychem.com/users/sign_in"
],
[
"type" => "view",
"name" => "会员中心",
"url" => "http://m.bychem.com/member/index"
],
[
"type" => "click",
"name" => "联系客服",
"key" => "CONTACT_KEFU"
],
],
],
];
return $menuService->index($request,$buttons);
}
}
三、MessageService
<?php
/**
* Created by PhpStorm.
* User: Lenovo
* Date: 26/4/2020
* Time: 上午10:50
*/
namespace App\Services\Wechat;
use App\Models\Member\MemberConnect;
use EasyWeChat\Kernel\Messages\Text;
use Illuminate\Support\Facades\Log;
class MessageService
{
protected $UserService;
public function __construct(UserService $UserService)
{
$this->UserService = $UserService;
}
public function index($message){
$MsgType = $message['MsgType'];
try{
if(method_exists($this,$MsgType)){
return $this->$MsgType($message);
exit();
}
return $this->otherType($message);
}catch (\Exception $e){
return 'Sorry,系统异常!';
}
}
/**
* 公众号事件
* @param $message
* @return string
*/
public function event($message){
//关注公众号
if($message['Event']=='subscribe'){
$userInfo = $this->UserService->getUserInfo($message['FromUserName']);
$app = app('wechat.official_account');
Log::info("=======subscribe userinfo=====");
Log::info($userInfo);
//保存用户信息
if($userInfo['openid']){
$memberConnect = MemberConnect::where('type','=',3)->where('openid','=',$userInfo['openid'])->first();
if(!$memberConnect){
MemberConnect::insert([
'member_id'=>0,
'type'=>3,
'openid'=>$userInfo['openid'],
'nickname'=>$userInfo['nickname'],
'headimgurl'=>$userInfo['headimgurl'],
'sex'=>$userInfo['sex'],
'country'=>$userInfo['country'],
'province'=>$userInfo['province'],
'city'=>$userInfo['city'],
'created_at'=>date('Y-m-d H:i:s', time()),
]);
}
}
$msg1= $userInfo['nickname'].",欢迎您关注**商城!".PHP_EOL.PHP_EOL
.'点开底部三个按钮可操作更多!'.PHP_EOL
.'→<a href="http://m.bychem.com/inquiry/index">采购中心</a>:在线询单、采购管理、订单管理等,您都可以在这里进行,无比方便快捷!'.PHP_EOL
.'→<a href="http://m.bychem.com/sale/index">销售中心</a>:发布产品、产品管理、询盘管理、销售订单等,更多订单不容错过!'.PHP_EOL
.'→<a href="http://m.bychem.com/member/index">会员中心</a>:注册、登录、联系客服,贴心维护,让您毫无后顾之忧!'.PHP_EOL.PHP_EOL
.'更多详情请您登陆官网:'.PHP_EOL
.'www.bychem.com' ;
$text1=new Text($msg1);
$app->customer_service->message($text1)->to($userInfo['openid'])->send();
return 'success';
}
//点击联系客服
elseif($message['Event']=='CLICK'){
if($message['EventKey']=='CONTACT_KEFU'){
return '欢迎联系**商城客服!您可以在文字输入框内直接向客服发起询问,也可任选以下任一联系方式联系客服!祝您在一览商城获得满意的体验!'.PHP_EOL
.'客服电话:17068835637'.PHP_EOL
.'客服QQ:4850381607';
}
}
}
}
四、MemberConnect表结构
/* Navicat Premium Data Transfer Source Server : buysellchem Source Server Type : MySQL Source Server Version : 50729 Source Host : 106.15.38.61:3308 Source Schema : whmall Target Server Type : MySQL Target Server Version : 50729 File Encoding : 65001 Date: 26/04/2020 15:36:01 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for c_member_connects -- ---------------------------- DROP TABLE IF EXISTS `c_member_connects`; CREATE TABLE `c_member_connects` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `member_id` int(10) UNSIGNED NOT NULL DEFAULT 0, `type` tinyint(2) NOT NULL DEFAULT 1 COMMENT '1.qq登录,2.微信登录,3公众号', `openid` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '第三方登录id', `nickname` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '第三方昵称', `sex` tinyint(4) NULL DEFAULT 0 COMMENT '性别 1男', `headimgurl` varchar(250) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '头像', `country` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '国家', `province` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '省份', `city` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '城市', `created_at` timestamp(0) NULL DEFAULT NULL, `updated_at` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0), PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `unq_openid`(`openid`) USING BTREE ) ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '用户公众号,微信,qq 关联信息表' ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;