这可能是网上第一篇关于微信公众号“一次性订阅消息”接口的实现 之 客户订阅篇

是的,在2017年7月25日凌晨4分微信发布了这个消息,公众号和微信内网页,用户也可以订阅消息提醒了,这么好的事情阿北咋能错过,立刻实现到“北哥兄弟连”,并写下这篇干货,送给正想集成功能的小伙伴。

因为当前的各位微信库肯定还没有更新此功能,那只能自己实现了,因为北哥兄弟连使用的yii2 + easywechat开源库,因此其中获取accesstoken等部分还是要用到easywechat。

接口文档地址

实现此功能用到的库

  • easywechat

啥也不说,开搞~~~~

拼凑用户授权链接

这步没什么多说的,按照规格来吧。

红色部分为主要的,如下。

  • appid 公众号ID
  • template_id 公众号后台已经提供
  • scene 场景值 自己填写即可
  • redirect_url 回调地址
  • reserved 一个安全字符串

这个拼凑过程就不多说,没啥难度,当然你可以将这个地址生成一个二维码让用户微信扫描,阿北就是这样干的,扫描后微信的结果如下。

和微信所描述的一样(如果你不信,可以来 http://nai8.me ,首页的二维码就是哦),那咱就继续吧。

用户同意或取消

无论用户同意或是取消,都会跳转到我们在上面url中指定的redirect_url中,只不过多了一些get参数而已。

redirect_url/?openid=OPENID&template_id=TEMPLATE_ID&action=ACTION&scene=SCENE

微信很厚道了,返回了openid、template_id,action和sence,其中action代表用户是同意了还是拒绝,程序根据这个来确定呈现成功还是很遗憾的页面。

另外基于安全隐私考虑,当用户取消时,返回的get参数里并没有openid,这是可理解且正确的。

在书写代码前,我需要有一个数据表做支撑,根据上面的规则,新建表如下。

之所以写user_id,我希望在订阅的时候做一次查询,看看订阅者是否为本站会员。

我在yii2的action里做了如下逻辑。

public function actionIndex(){
    $action = Yii::$app->request->get('action');
    if($action == 'confirm'){
        $openId = Yii::$app->request->get('openid');
        $templateId = Yii::$app->request->get('template_id');
        $scene = Yii::$app->request->get('scene');

        $model = Subscribe::find()->where(['open_id'=>$openId,'template_id'=>$templateId,'scene'=>$scene])->one();
        if($model == false){
            $model = new Subscribe();
            $model->open_id = $openId;
            $model->template_id = $templateId;
            $model->scene = $scene;
        }

        $user = User::getUserByOpenId($openId);
        if($user){
            $model->user_id = $user->id;
        }

        $model->save();

        return $this->render('ok');
    }else{
        return $this->render('refuse');
    }
}

大体意思如下,通过action判断是否同意订阅,并呈现不同的视图,当同意时,记录一条subscribe记录并检查此微信是否为本站会员。

因为可以重复的订阅,因此数据表中增加了一个update_time字段。

两种操作如下图

到此刻,我们就完成了用户订阅的逻辑。,下一篇我们将为你讲解为用户推送订阅信息的功能实现。

你可能感兴趣的:(yii2,微信开发,yii)