此弟不宜久留 發表於 2020-10-20 11:16:00

微信公众号开发:4、用户管理

<div>
<p>原文:https://www.cnblogs.com/i3yuan/p/10957939.html</p>
<hr>
<h2><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">前言</span>:</h2>
<p>微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号提供了相应的接口方便我们调用,可方便的把用户同步到本地,这样我们可以自己为用户定义更多的信息,以及与本地的业务更好的对接起来。以方便做各种应用分析。所以本节内容主要是用户和用户组的管理。</p>
<h2><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">开始</span>:</h2>
<h3>一、用户关注与退订事件:</h3>
<p>在之前的消息处理中,我们在UserMessageHandler.cs,需要继承Senparc.Weixin.MP.MessageHandlers&lt;TC&gt;这个抽象类,并重写所有方法,在这里面,我们可以添加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&lt;ResponseMessageText&gt;<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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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&lt;ResponseMessageText&gt;<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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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&lt;ResponseMessageText&gt;<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>
<h3>二、设计数据库</h3>
<p>根据微信公众号开发文档,用户管理对应字段而建立,基本与官方提供的用户信息是一样的</p>
<p><img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223005351-850556524.png" alt="" width="1060" height="616"></p>
<p>&nbsp; 建立用户组管理表(WX_Group)和用户表(WX_User)</p>
<p><img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223245289-169059907.png" alt="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="https://img2018.cnblogs.com/blog/1576550/201905/1576550-20190531223410098-1720532985.png" alt=""></p>
<p>&nbsp;</p>
<h3>三、提交同步数据</h3>
<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)">&lt;summary&gt;</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)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="id"&gt;</span><span style="color: rgba(0, 128, 0, 1)">用户id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="officeId"&gt;</span><span style="color: rgba(0, 128, 0, 1)">对应的公众号id</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</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>&lt;BatchGetUserInfoData&gt; list = <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;BatchGetUserInfoData&gt;<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>&nbsp; 通过以上方式,将用户和分组的方式同步提交,实现用户的分组。</p>
<h2><span style="color: rgba(45, 148, 222, 1); font-size: 18pt">总结</span>:</h2>
<p>1.实现用户的分组,能更好的对关注者进行管理和分析业务应用</p>
<p>2.使用了开源的Senparc.Weixin,可以快速的实现分组和同步数据</p>
<p>3.参考官网示例源代码</p>
</div><br><br>
来源:https://www.cnblogs.com/springsnow/p/13845434.html
頁: [1]
查看完整版本: 微信公众号开发:4、用户管理