实现微信小程序无限发消息,实现类似长期订阅的功能。判断用户是否关注公众号。(保姆级教学、建议阅读每一个字~)

博客介绍了微信小程序实现长期订阅的思路,需在开放平台绑定公众号和小程序,引导用户关注公众号,还普及了微信开放平台和公众平台知识,说明了准备工作,最后给出了以php的tp框架为例的代码示例。
该文章已生成可运行项目,

思路

目前微信小程序是没办法长期订阅的,除了什么教育、交通、医疗行业外。
那么想实现长期订阅,首先就要在开放平台绑定微信公众号和微信小程序。
用户注册小程序的同时,引导用户关注公众号。
如果用户不关注公众号,那么依然无法给用户长期发送消息
如果不适用于兄弟们,那就不用往下看了。

总结一下:
①:用户注册小程序,用户对于小程序的openid和unionid入库。
②:引导用户关注公众号,根据数据库中用户的unionid,更新用户对于公众号的openid信息。
③:公众号发送消息,需要用到用户在公众号中的openid。
④:公众号发送模板消息,然后在消息中跳转回小程序即可。

普及知识!

先普及一下知识。微信开放平台和微信公众平台是两个不同的平台。
微信开放平台上可以绑定公众号和小程序。
微信公众平台上可以选择公众号登录或者小程序登录,进而进入它们的管理后台。
公众号的appid和appsecret和小程序的不一样!
公众号的openid和小程序的openid不一样!
但是,绑定在同一个开放平台上的公众号的unionid和小程序的unionid是相同的。

准备工作
  1. 将公众号和小程序绑定在同一个开放平台中。
  2. 公众号管理后台菜单中,广告与服务-小程序管理菜单下,添加要发送消息的小程序。小程序中好像也需要关联一下。
  3. 在公众号后台设置与开发-基本设置菜单中,启用服务器配置。
    启用服务器配置的方法
  4. 在广告与服务-模板消息中添加消息模板。(很easy,不过多介绍。)
  5. 检车设置与开发-接口权限中,是否有获取用户基本信息的权限。这个一定要有。
代码示例 这里以php的tp框架为例

官方文档:基础消息能力/接收事件推送

以下代码,我们只需要看event事件触发时候的那一部分即可。

//路由
//发送公众号通知
Route::post('sendPublicMessage', 'home/Wechat/sendPublicMessage');
//公众号服务器配置以及回调接口
Route::any('subscribe', 'home/Wechat/subscribe');

//控制器代码-- Wechat类中
<?php
	
	use think\Db;
	use think\facade\Log;
	use think\Request;
    
    private $appId = 'your appid'; //公众号appid
    private $appSecret = 'your appsecret';//公众号appsecret

class Wechat
{
   
   
    /**
     * Description:获取token
     * @return mixed
     * @date 2024/4/26 14:12
     * @author zls
     */
    public function getAccessToken()
    {
   
   
        //获取access_token
        $tokenAccessUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={
     
     $this->appId}&secret={
     
     $this->appSecret}";
        $access_token_json = file_get_contents($tokenAccessUrl);
        $access_token_array = json_decode($access_token_json, true);
        return $access_token_array['access_token'] ?: '';
    }

    /**
     * Description:公众号回调接口
     * @param Request $request
     * @return \think\response\Json
     * @date 2024/4/25 17:29
     * @author zls
     */
    public function subscribe(Request $request)
    {
   
   
        //接收参数,验签的标识
        $echoStr = $request->param('echostr');
        if (!empty($echoStr)) {
   
   
            //验签-配置服务器配置
            $this->valid($request->param());
            echo $echoStr;
            exit;
        } else {
   
   
            $this->responseMsg($request->param());
            exit;
        }
    }

    /**
     * Description:公众号服务器验签
     * @param $data
     * @return bool
     * @date 2024/4/26 9:40
     * @author zls
     */
    public function valid($data)
    {
   
   
        $echoStr = $data['echoStr'];
        $signature = $data['signature'];
        $timestamp = $data['timestamp'];
        $nonce = $data['nonce'];
        $token = "123456";//公众号后台自定义的token

        $tmpArr = array($token, $timestamp, $nonce);

        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if ($tmpStr == $signature) {
   
   
            return true;
            //不可以在调用的方法中echo $echoStr; 必须要在主方法中echo;
//            echo $echoStr;
//            exit;
        } else {
   
   
            Log::info("验签失败");
            return json(false);
        }
    }

    /**
     * Description:响应消息
     * @return void
     * @date 2024/4/26 9:56
     * @author zls
     */
    public function responseMsg($data)
    {
   
   
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)) {
   
   
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            //处理用户发送到公众号的各种类型的消息。
            //其实我们只需要关注(event)事件接口即可!别的不用管也行。只是给大家普及一下。
            switch ($RX_TYPE) {
   
   
            	//关注、取关等事件
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                //用户发送文字消息    
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                //用户发送图片消息 以下不再一一注释    
                case "image":
                    $result = $this->receiveImage($postObj);
                    break;
                case "location":
                    $result = $this->receiveLocation($postObj);
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);
                    break;
                case "link":
                    $result = $this->receiveLink($postObj);
                    break;
                default:
                    $result = "unknown msg type: " . $RX_TYPE;
                    break;
            }
            Log::info('Result' . $result);
            echo $result;
        } else {
   
   
            echo "";
            exit;
        }
    }

    /**
     * Description:发送公众号消息推送
     * @param Request $request
     * @return void
     * @date 2024/4/8 10:19
     * @author zls
     */
    public function sendPublicMessage(Request $request)
    {
   
   

        //获取access_token
        $access_token = $this->getAccessToken();

        //接收者(用户)的OpenID
        $toUserOpenId = $request->param('openId');

        //模板ID
        $templateId = $request->param('templateId');

        //模板内容,这里以键值对形式表示
        $data = array(
            'thing1' => array('value' => '内容1', 'color' => '#173177'),
            'thing4' =
本文章已经生成可运行项目
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值