一、前文提要
本文基于上一篇文章的easywechat依赖的基础上,是上一文的后续,上篇文章:https://blog.csdn.net/qq_57866091/article/details/135471603?spm=1001.2014.3001.5501。
二、需求
要求:用户进行扫码之后,跳转到对应的微信公众号,点击关注之后,给用户响应如下格式消息:
三、实现过程
3.1 微信公众号平台申请开通模板消息
如果是未申请开通的话,可以在微信公众号的新的功能中进行添加申请,如果已申请过了,可以在广告与服务中找到模板消息:
3.2 添加模板
添加模板之后,要注意以下这些关键信息,后续代码要用的:
3.3 代码实现
3.3.1 获取用户ip
在生成微信登录二维码接口中,从resquest中获取ip地址,并将其放入带参二维码中:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\BaseController;
use App\Http\Response\ApiResponse;
use App\Models\User;
use Dingo\Api\Http\Request;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
class WeChatController extends BaseController
{
/**
* 生成微信登录二维码
*/
public function qrcodeCreate(Request $request)
{
$type = $request->input('type') ?? 1;
$ip = $request->ip();
$device = $request->input('device') ?? '官网';//我这边多展示了一个,
$config = config('xxxx.xxxx');//配置文件,自己补上
$app = Factory::officialAccount($config);
$uuid = date('YmdHis') . rand(0000, 9999);
switch ($type) {
case 1://登录
$scene_value = 'login_' . $uuid . '_' . $ip . '_' . $device;
break;
case 2://绑定账号
$user = User::checkUserLogin('user');
$scene_value = 'bind_' . $uuid . '_' . $ip . '_' . $device . '_' . $user->nickname ?? '未命名';
break;
default:
throw new \Exception('场景方式异常');
}
Cache::put($uuid, 1, 5 * 60);
$result = $app->qrcode->temporary($scene_value, 5 * 60);
$url = $app->qrcode->url($result['ticket']);
$data = [
'qrcpde_url' => $url,
'uuid' => $uuid,
];
return ApiResponse::successData($data);
}
}
3.3.2 响应事件放在用户扫码点击关注之后微信公众号响应的接口中
关于响应接口,在上一文中有代码(含验证、解密),然后给事件补充参数:(本文比较多一些,多了device、nickname等参数)
//响应数据
event(new WeChatSubscribeEvent($open_id, $repo_type, $ip, $device, $nickname ?? '未命名'));
3.3.3 项目Events目录下的WeChatSubscribeEvent.php添加对应参数
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class WeChatSubscribeEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $openid;
public $type;
public $ip;
public $device;
public $nickname;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($openid, $type, $ip = null, $device = null, $nickname = null)
{
$this->openid = $openid;
$this->type = $type;
$this->ip = $ip;
$this->device = $device;
$this->nickname = $nickname;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
3.3.4 项目Listerners目录下:WeChatSubscribeListener.php
<?php
namespace App\Listeners;
use App\Events\WeChatSubscribeEvent;
use EasyWeChat\Factory;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
class WeChatSubscribeListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(WeChatSubscribeEvent $event)
{
// 在这里编写响应逻辑,例如发送“登录成功”的消息
$openid = $event->openid;
$config = config('xxxx.xxxx');//easywechat的配置信息,自己补充
$app = Factory::officialAccount($config);
switch ($event->type) {//我这边作了场景区分,可去掉
case 1://登录成功
// 模板消息的模板ID
$templateId = config('easywechat.templateId.login_success');
$data = [
'time3' => [
'value' => date('Y-m-d H:i:s', time())
],
'thing12' => [
'value' => $event->device
],
'character_string7' => [
'value' => $event->ip
],
'remark' => [
'value' => '点击查看详情',
'url' => 'xxxx', // 替换为实际的详情页面链接
],
];
break;
case 2://登录失败
// 模板消息的模板ID
$templateId = config('easywechat.templateId.login_fail');
$data = [
'time1' => [
'value' => date('Y-m-d H:i:s', time())
],
'const3' => [
'value' => '登录失败,该用户已被禁用!'
],
'character_string2' => [
'value' => $event->ip
],
];
break;
case 3://绑定成功
// 模板消息的模板ID
$templateId = config('easywechat.templateId.bind_success');
$data = [
'time2' => [
'value' => date('Y-m-d H:i:s', time())
],
'thing9' => [
'value' => $event->nickname
],
'character_string3' => [
'value' => $event->ip
],
];
break;
case 4://绑定失败
$message = '绑定失败,该用户已被禁用';
$app->customer_service->message($message)->to($openid)->send();
return;
case 5:
$message = '二维码已失效!';
$app->customer_service->message($message)->to($openid)->send();
return;
}
// 发送模板消息
$result = $app->template_message->send([
'touser' => $openid,
'url' => 'xxxx',//响应-点击详情跳转的网址,选填的
'template_id' => $templateId,
'data' => $data,
]);
Log::info('result', [$result]);
}
}
根据3.2的模板标红的参数,进行对应赋值即可,点击详情跳转,只需加入url即可。
关于模板消息说明,微信公众号也有文档说明:微信公众号开发文档说明
3.3.4 效果