laravel-微信公众号消息模板实现

一、前文提要

        本文基于上一篇文章的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 效果

        

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值