是的,在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字段。
两种操作如下图
到此刻,我们就完成了用户订阅的逻辑。,下一篇我们将为你讲解为用户推送订阅信息的功能实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。