PHP+fastadmin实现公众号订阅号随手记功能

3 篇文章 0 订阅
2 篇文章 0 订阅

第一步、订阅号随手记笔记功能演示效果 

 

 

 第二步安装fastadmin框架和创建随手记表

1、安装fastadmin框架

PHP之fastadmin框架安装运行自动生成后台操作

 2、创建数据表fa_note
CREATE TABLE `fa_note` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ToUserName` varchar(50) DEFAULT NULL COMMENT '微信用户标识',
  `FromUserName` varchar(50) DEFAULT NULL COMMENT '用户id',
  `title` varchar(20) DEFAULT NULL COMMENT '标题',
  `Content` text COMMENT '内容',
  `CreateTime` varchar(30) DEFAULT NULL COMMENT '添加时间',
  `UpdateTime` varchar(30) DEFAULT NULL COMMENT '修改时间',
  `MsgType` varchar(30) DEFAULT NULL COMMENT '文本类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COMMENT='笔记列表';

第三步、配置公众号和订阅号配置

fastadmin公众号服务器配置,安装微信管理点击参考下面

PHP之fastadmin公众号服务器配置 

安装好后打开权限显示微信管理

 第四步、公众号配置自动回复,修改index.php文件

 1、接受回复记录和处理返回 增加消息处理方法

   if ($message['MsgType'] == 'text'||$message['MsgType'] == 'image') {
                   $return= $this->note($message) ;
                   if($return){
                       return  $return;
                   }
                }

 message示例:

{"ToUserName":"gh_02c4fcb1e983","FromUserName":"o-iwh0oy9SJZ66Azl6F8eRMQlHec","CreateTime":"1690609936","MsgType":"text","Content":"第一个笔记","MsgId":"24203713717141674"}

 2、完整代码如下
<?php

namespace addons\wechat\controller;
use addons\wechat\library\Config;
use addons\wechat\model\WechatAutoreply;
use addons\wechat\model\WechatCaptcha;
use addons\wechat\model\WechatContext;
use addons\wechat\model\WechatResponse;
use addons\wechat\model\WechatConfig;
use EasyWeChat\Factory;
use addons\wechat\library\Wechat as WechatService;
use addons\wechat\library\Config as ConfigService;
use think\Log;
use think\Db;
/**
 * 微信接口
 */
class Index extends \think\addons\Controller
{

    public $app = null;

    public function _initialize()
    {
        parent::_initialize();

        $this->app = Factory::officialAccount(Config::load());
    }

    /**
     *
     */
    public function index()
    {
        $this->error("当前插件暂无前台页面");
    }

    /**
     * 微信API对接接口
     */
    public function api()
    {

        $this->app->server->push(function ($message) {
            $wechatService = new WechatService;

            $matches = null;
            $openid = $message['FromUserName'];
            $to_openid = $message['ToUserName'];

            $unknownMessage = WechatConfig::getValue('default.unknown.message');
            $unknownMessage = $unknownMessage ? $unknownMessage : "";
            switch ($message['MsgType']) {
                case 'event': //事件消息
                    $event = $message['Event'];
                    $eventkey = $message['EventKey'] ? $message['EventKey'] : $message['Event'];
                    //验证码消息
                    if (in_array($event, ['subscribe', 'SCAN']) && preg_match("/^captcha_([a-zA-Z0-9]+)_([0-9\.]+)/", $eventkey, $matches)) {
                        return WechatCaptcha::send($openid, $matches[1], $matches[2]);
                    }
                    switch ($event) {
                        case 'subscribe'://添加关注
                            $subscribeMessage = WechatConfig::getValue('default.subscribe.message');
                            $subscribeMessage = $subscribeMessage ?: "欢迎关注我们!";
                            return $subscribeMessage;
                        case 'unsubscribe'://取消关注
                            return '';
                        case 'LOCATION'://获取地理位置
                            return '';
                        case 'VIEW': //跳转链接,eventkey为链接
                            return '';
                        case 'SCAN': //扫码
                            return '';
                        default:
                            break;
                    }

                    $wechatResponse = WechatResponse::where(["eventkey" => $eventkey, 'status' => 'normal'])->find();
                    if ($wechatResponse) {
                        $responseContent = (array)json_decode($wechatResponse['content'], true);
                        $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
                        $data = ['eventkey' => $eventkey, 'command' => '', 'refreshtime' => time(), 'openid' => $openid];
                        if ($wechatContext) {
                            $wechatContext->save($data);
                        } else {
                            $wechatContext = WechatContext::create($data, true);
                        }
                        $result = $wechatService->response($this, $openid, '', $responseContent, $wechatContext);
                        if ($result) {
                            return $result;
                        }
                    }
                    return $unknownMessage;
                case 'text': //文字消息
                case 'image': //图片消息
                case 'voice': //语音消息
                case 'video': //视频消息
                case 'location': //坐标消息
                case 'link': //链接消息
                default: //其它消息

                    if ($message['MsgType'] == 'text'||$message['MsgType'] == 'image') {
                        $return= $this->note($message) ;
                        if($return){
                            return  $return;
                        }
                    }

                    //自动回复处理
                    if ($message['MsgType'] == 'text') {
                        $autoreply = null;
                        $autoreplyList = WechatAutoreply::where('status', 'normal')->cache(true)->order('weigh DESC,id DESC')->select();
                        foreach ($autoreplyList as $index => $item) {
                            //完全匹配和正则匹配
                            if ($item['text'] == $message['Content'] || (in_array(mb_substr($item['text'], 0, 1), ['#', '~', '/']) && preg_match($item['text'], $message['Content'], $matches))) {
                                $autoreply = $item;
                                break;
                            }
                        }

                        if ($autoreply) {
                            $wechatResponse = WechatResponse::where(["eventkey" => $autoreply['eventkey'], 'status' => 'normal'])->find();
                            if ($wechatResponse) {
                                $responseContent = (array)json_decode($wechatResponse['content'], true);
                                $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
                                $result = $wechatService->response($this, $openid, $message['Content'], $responseContent, $wechatContext, $matches);
                                if ($result) {
                                    return $result;
                                }
                            }
                        }
                    }
                    return $unknownMessage;
            }
            return ""; //SUCCESS
        });

        $response = $this->app->server->serve();
        // 将响应输出
        $response->send();
        return;
    }
    //小记功能
    private  function note($message){
        if ($message['MsgType'] == 'text') {
            $title="";
            $message['Content']=trim($message['Content']);
            if($message['Content']){

                if(in_array($message['Content'][0],array("!","@","#"))){
                    $firstpex=$message['Content'][0];
                    preg_match('/'.$firstpex.'(.*?)'.$firstpex.'/', $message['Content'], $matches);

                    if (isset($matches[1])) {
                        $title = $matches[1];
                        preg_match('/'.$firstpex.'.*?'.$firstpex.'(.*$)/', $message['Content'], $Content);

                        if (isset($Content[1])) {
                            $message['Content'] = $Content[1];
                        } else {
                            // 第二个#或者?或者!后面没有内容
                            $message['Content'] = mb_substr($message['Content'], 0, 9);
                        }
                    }

                }else{
                    $title=mb_substr($message['Content'], 0, 9);
                }
            }
        }
        if($message['MsgType'] == 'image'){
            $title="图".date("YmdHis");
            $message['Content']= $message['PicUrl'];
        }
        $data=[
            "title"=>$title,
            "ToUserName"=>$message['ToUserName'],
            "FromUserName"=>$message['FromUserName'],
            "CreateTime"=>$message['CreateTime'],
            "UpdateTime"=>$message['CreateTime'],
            "MsgType"=>$message['MsgType'],
            "Content"=>$message['Content'],
        ];
        $id= Db::table('fa_note')->insertGetId($data);
        if($id){
            return '已存笔记,点查看 <a href="'.request()->domain().'/index.php/index/wechat/index/?user='.$message['ToUserName'].'&id='.$id.'">链接</a>';
        }
        return false;
    }
    /**
     * 登录回调
     */
    public function callback(){
    }

    /**
     * 支付回调
     */
    public function notify()
    {
        Log::record(file_get_contents('php://input'), "notify");
        $response = $this->app->handlePaidNotify(function ($message, $fail) {
            // 你的逻辑
            return true;
            // 或者错误消息
            $fail('Order not exists.');
        });

        $response->send();
        return;
    }

}

第五步创建随手详情页面和列表页面

1、创建控制器Wechat.php

<?php

namespace app\index\controller;

use app\common\controller\Frontend;

use think\Db;
class Wechat extends Frontend
{

    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';
    protected $layout = '';

    public function index()
    {
   
         $user = $this->request->get("user");
         $id = $this->request->get("id");
        if(!$id||!$user) {
            die();
        }
        $note= Db::table("fa_note")->where('ToUserName',$user)->where('id',$id)->find();
        if(!$note){
              die();
        }
       $this->view->assign("row", $note);
        return $this->view->fetch();
    }
     public function lst()
    {
   
         $user = $this->request->get("user");
        if(!$user) {
            die();
        }
        $note= Db::table("fa_note")->where('ToUserName',$user)->order("id desc")->select();
        if(!$note){
              die();
        }
        foreach ($note as &$value) {
            // code...
            $value['time']=date("Y-m-d H:i:s",$value['CreateTime']);
        }
         $this->view->assign("user", $user);
        $this->view->assign("list", json_encode($note));
        return $this->view->fetch();
    }

}
2、创建随手记详情和列表html

 详情index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>笔记</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }
        header {
            background-color: #333;
            color: #fff;
            padding: 10px;
            text-align: center;
        }
        main {
            padding: 20px;
        }
        .button {
            display: inline-block;
            padding: 10px 20px;
            background-color: #555;
            color: #fff;
            text-decoration: none;
            border-radius: 5px;
        }
        @media only screen and (max-width: 600px) {
            header {
                font-size: 18px;
            }
            main {
                font-size: 16px;
            }
        }
    </style>
</head>
<body>
<header>
    <a href="/index.php/index/wechat/lst/?user={$row['ToUserName']}" class="button">列表</a>
    <h3>{$row.title}</h3>
    
</header>
<main>
    <h6>添加于{$row.CreateTime|date="Y-m-d H:i:s",###}</h6>
    <div style="font-size: larger; font-weight: bold;">
         {if $row.MsgType=='text'}{$row.Content}{/if}
          {if $row.MsgType=='image'}<img src="{$row['Content']}" style="width:100%;"/>{/if}
    </div>
</main>
</body>
</html>
列表lst.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>我的笔记</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }
        .container {
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        h1 {
            font-size: 24px;
            margin-bottom: 10px;
        }
        ul {
            list-style-type: none;
            padding: 0;
        }
        li {
            margin-bottom: 20px;
            border: 1px solid #ccc;
            padding: 10px;
        }
        .pagination {
            display: flex;
            justify-content: center;
            margin-top: 20px;
        }
        .pagination a {
            display: inline-block;
            padding: 5px 10px;
            margin: 0 5px;
            border: 1px solid #ccc;
            text-decoration: none;
            color: #333;
        }
        .pagination .active {
            background-color: #ccc;
        }
        a {
         text-decoration: none;
      }
    </style>
</head>
<body>
<div class="container">
    <h1>我的笔记</h1>
    <ul id="list"></ul>
    <div class="pagination" id="pagination"></div>
</div>
<script>
    // 模拟数据
    var data = {$list};
    var user= "{$user}";
    var currentPage = 1; // 当前页码
    var pageSize = 1000000; // 每页显示的数量
    
    function renderList() {
        var startIndex = (currentPage - 1) * pageSize;
        var endIndex = startIndex + pageSize;
        var listHtml = "";
        for (var i = startIndex; i < endIndex && i < data.length; i++) {
            listHtml += `<a href="/index.php/index/wechat/index/?user=${user}&id=${data[i].id}"><li><strong>${data[i].title}</strong> - 添加时间:${data[i].time}</li></a>`;
        }
        document.getElementById("list").innerHTML = listHtml;
    }
    function renderPagination() {
        var totalPages = Math.ceil(data.length / pageSize);
        var paginationHtml = "";

        for (var i = 1; i <= totalPages; i++) {
            paginationHtml += `<a href="#" class="${i === currentPage ? 'active' : ''}" onclick="changePage(${i})">${i}</a>`;
        }
       // document.getElementById("pagination").innerHTML = paginationHtml;
    }
    function changePage(page) {
        currentPage = page;
        renderList();
        renderPagination();
    }
    // 初始化页面
    renderList();
    renderPagination();
</script>
</body>
</html>

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
phpWechat 是由一个具有多年行业开发经验的前端 UI 设计师、PHP开发工程师组成的团队设计、研发的一套的微信公众平台管理系统,您可以瞬间完成一个公共或者PC站或者两者皆有的平台搭建。 phpWeChat 微信+网站开发框架功能亮点: 1、100%开源,没有任何加密文件 phpWeChat核心文件100%开源,没有任何加密文件,开发者可以放心使用而无需担心留有后门程序等。 2、程序轻量级,一天读完所有代码 核心框架压缩包只有2.66M,十分利于开发者迅速阅读全部代码。 3、代码严谨,结构清晰 phpWeChat使用MVC开发模式,各个功能模块之间独立并目录结构统一。开发者可迅速掌握phpWeChat的框架结构。 4、二次开发文档十分完善 我们提供了完善的phpWeChat二次开发文档,便于开发者学习与查阅。 5、高度集成微信接口 phpWeChat高度集成了微信公共的自动回复、菜单管理、素材管理、模板消息、粉丝管理、微信支付等常用接口,您只需一个函数或2/3行代码即可实现原本需要很费时费力才能开发功能。 6、phpWeChat也是一个PC(网站)开发框架和CMS 慢慢您会发现,phpWeChat是一个更接近CMS功能的框架。 7、高度封装常用开发功能 只需一两行固定的代码,您便可以写出列表分页、微信支付、文件上传、邮件发送、短信发送等功能。 8、数据结构合理,负载强劲 phpWeChat集成了常见的内存级缓存(MemCache)、文件缓存处理方案,使得系统更符合大数据、大并发的公共或网站使用。 9、集成应用市场,功能拓展一瞬间 phpWeChat集成了应用市场并在线安装应用的功能,您可以在一瞬间安装完成其他开发开发功能模块。 phpWeChat安装方法: 将下载的程序压缩包(zip格式)解压后,将全部文件和文件夹上传至网站根目录。然后输入域名/install.php 即可进入安装程序。 注意:安装phpWeChat前请先创建好phpWeChat所需的数据库。 phpWeChat 目录结构: addons 功能模块目录 admin 公用后台目录 api 插件目录 data 数据缓存目录 install 安装程序目录,安装后请改名或删除 include 公用操作类目录 statics 静态文件目录 template 视图(模板)目录 upload 上传文件存放目录 phpWeChat 更新日志: 新版v1.0.3发布: phpWeChat PC+微信公众号开发核心框架v1.0.3针对v1.0.2版本出现的问题,主要修复了和增加了以下功能: 1、优化自定义模块操作; 2、优化安装过程; 3、修复一处在线支付的PHP版本兼容问题; 4、修复一处自定义模块的问题; 5、修复后台模块管理显示未知版本的bug; 6、修复粉丝行为IP报错的Bug; 7、删除一些冗余代码; 8、修复消息模板不存在时,一直提示[同步中]的bug。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP隔壁老王邻居

啦啦啦啦啦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值