微信公众号开发:用户管理
<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">前言</span>:</p><p> 微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号提供了相应的接口方便我们调用,可方便的把用户同步到本地,这样我们可以自己为用户定义更多的信息,以及与本地的业务更好的对接起来。以方便做各种应用分析。所以本节内容主要是用户和用户组的管理。</p>
<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">开始</span>:</p>
<p><span style="font-family: 楷体; font-size: 14pt">一、用户关注与退订事件</span>:</p>
<p> 在之前的消息处理中,我们在UserMessageHandler.cs,需要继承Senparc.Weixin.MP.MessageHandlers<TC>这个抽象类,并重写所有方法,在这里面,我们可以添加2个事件,一个是用户关注时候触发事件,一个是退订时候触发事件</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过扫描关注</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> responseMessage = CreateResponseMessage<ResponseMessageText><span style="color: rgba(0, 0, 0, 1)">();
responseMessage.Content </span>= responseMessage.Content ?? <span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">通过扫描二维码进入,场景值:{0}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, requestMessage.EventKey);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> responseMessage;
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 订阅(关注)事件
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> responseMessage = <span style="color: rgba(0, 0, 255, 1)">base</span>.CreateResponseMessage<ResponseMessageText><span style="color: rgba(0, 0, 0, 1)">();
responseMessage.Content </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">欢迎关注</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> responseMessage;
}
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 退订
</span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 实际上用户无法收到非订阅账号的消息,所以这里可以随便写。
</span><span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> unsubscribe事件的意义在于及时删除网站应用中已经记录的OpenID绑定,消除冗余数据。并且关注用户流失的情况。
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage)
{
</span><span style="color: rgba(0, 0, 255, 1)">var</span> responseMessage = <span style="color: rgba(0, 0, 255, 1)">base</span>.CreateResponseMessage<ResponseMessageText><span style="color: rgba(0, 0, 0, 1)">();
responseMessage.Content </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">有空再来</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> responseMessage;
}</span></pre>
</div>
<p><span style="font-family: 楷体; font-size: 14pt">二、设计数据库</span></p>
<p> 根据微信公众号开发文档,用户管理对应字段而建立,基本与官方提供的用户信息是一样的</p>
<p><img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223005351-850556524.png" alt="" width="1060" height="616"></p>
<p> 建立用户组管理表(WX_Group)和用户表(WX_User)</p>
<p><img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223245289-169059907.png" alt=""> <img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223410098-1720532985.png" alt=""></p>
<p> </p>
<p><span style="font-family: 楷体; font-size: 14pt">三、提交同步数据</span></p>
<p> 接口的实现方式我们使用了开源的Senparc.Weixin提供的专业的微信操作SDK来快速完成操作,在Senparc WX SDK下的Senparc.Weixin.MP.AdvancedAPIs ,通过OpenID到公众号同步到数据,再将本地数据修改。</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 同步数据
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="id"></span><span style="color: rgba(0, 128, 0, 1)">用户id</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="officeId"></span><span style="color: rgba(0, 128, 0, 1)">对应的公众号id</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></span>
<span style="color: rgba(0, 0, 0, 1)">
</span><span style="color: rgba(0, 0, 255, 1)">public</span> JsonResult SyncUser(<span style="color: rgba(0, 0, 255, 1)">string</span> id,<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> officeId)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrWhiteSpace(id))
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">填充数据</span>
<span style="color: rgba(0, 0, 255, 1)">string</span>[] arrs = id.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
List</span><BatchGetUserInfoData> list = <span style="color: rgba(0, 0, 255, 1)">new</span> List<BatchGetUserInfoData><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> m <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> arrs)
{
list.Add(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> BatchGetUserInfoData() {
openid </span>=<span style="color: rgba(0, 0, 0, 1)"> m,
lang </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">zh-CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
LangEnum </span>=<span style="color: rgba(0, 0, 0, 1)"> Senparc.Weixin.Language.zh_CN
});
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">批量同步数据</span>
WC_OfficalAccountsModel accountModel =<span style="color: rgba(0, 0, 0, 1)">account_BLL.GetById(officeId);
</span><span style="color: rgba(0, 0, 255, 1)">var</span> batchList =<span style="color: rgba(0, 0, 0, 1)">Senparc.Weixin.MP.AdvancedAPIs.UserApi.BatchGetUserInfo(accountModel.AccessToken, list);
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> info <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> batchList.user_info_list)
{
WC_UserModel userModel </span>=<span style="color: rgba(0, 0, 0, 1)"> m_BLL.GetById(info.openid);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (userModel != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
{
userModel.City </span>=<span style="color: rgba(0, 0, 0, 1)"> info.city;
userModel.OpenId </span>=<span style="color: rgba(0, 0, 0, 1)"> info.openid;
userModel.Id </span>=<span style="color: rgba(0, 0, 0, 1)"> info.openid;
userModel.HeadImgUrl </span>=<span style="color: rgba(0, 0, 0, 1)"> info.headimgurl;
userModel.Language </span>=<span style="color: rgba(0, 0, 0, 1)"> info.language;
userModel.NickName </span>=<span style="color: rgba(0, 0, 0, 1)"> info.nickname;
userModel.Province </span>=<span style="color: rgba(0, 0, 0, 1)"> info.province;
userModel.Sex </span>=<span style="color: rgba(0, 0, 0, 1)"> info.sex;
m_BLL.Edit(</span><span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)"> errors, userModel);
}
}
LogHandler.WriteServiceLog(GetUserId(), </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Ids:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + id, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">成功</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">删除</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WX_User</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> Json(JsonHandler.CreateMessage(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">, Resource.SaveSucceed));
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> Json(JsonHandler.CreateMessage(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, Resource.SaveFail));
}
}</span></pre>
</div>
<p> 通过以上方式,将用户和分组的方式同步提交,实现用户的分组。</p>
<p><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">总结</span>:</p>
<p> 1.实现用户的分组,能更好的对关注者进行管理和分析业务应用</p>
<p> 2.使用了开源的Senparc.Weixin,可以快速的实现分组和同步数据</p>
<p> 3.参考官网示例源代码</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:艾三元</div>
<div>出处:https://www.cnblogs.com/i3yuan/</div>
<div>关注:推荐扫码关注公众号</div>
<img src="https://images.cnblogs.com/cnblogs_com/i3yuan/1381525/o_210326143458wxcode.jpg" style="width: 105px">
<div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/i3yuan/p/10957939.html
頁:
[1]