微信公众号 二维码场景统计 场景二维码

  之前接到了一个项目,要求在关注公众号的用户,推广下个用户,实行奖励模式(只有两级!)。然而,一脸懵,网站开发推广生成二维码,我知道怎么做,大不了记录用户Id,生成二维码,扫描的时候,获取用户Id,然后得到推荐者。微信公众号的,还真不知道头绪。好吧,那就先按照网站的思路进行开发,将存储在数据库中的用户Id和要跳转的地址拼接成最终的字符串,生成二维码,开始开发(依旧没有自信可以成功,┭┮﹏┭┮)。现实总是那个顺应人意,果然是不可以的,推荐的用户,如果没有关注,是没法直接跳转相应的地址的,如果把跳转地址去掉权限,那么,推荐的用户就不能关注公众号,也就是此推荐是无效的。。。(难过10分钟),各种在网上找解决方案,问各路大神,貌似我都没法解释清楚问题(自己的表达能力有待提高。。。),然后,只能硬着头皮再去查看微信公众号开发平台的文档了,抱着死马当活马医的态度,竟然柳暗花明了,超开心,下面的图,这个不就是我要的结果么(跳跃,开心)

 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000)。两种二维码分别适用于帐号绑定、用户来源统计等场景。

 

 

与用户关联,我在项目中使用的是长期有效二维码,根据场景Id与用户Id对应,然后将生成的长期二维码图片保存在服务器上,直接使用(但是无奈的是有数量限制)。

以下上代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
///
/// 二维码分享   测试使用
///
public class ShareCodeController
{
    // GET: ShareCode
    public ActionResult Index()
    {
        return View();
    }
 
    /*生成永久二维码*/
    public   void getPerpetualQR(String account)
    {
        var accessToken = AccessTokenContainer.TryGetAccessToken(AppId, AppSecret);
        var ticketMessage = QrCode.Create(accessToken,0,100);
        var urlFormat = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={0}";
 
        GetTicketImage(ticketMessage.ticket, openId);
 
    }
 
    ///
    /// 通过ticket换取二维码
    ///
    ///票据
    ///二维码依照openId 命名
    ///相对路径 @"\weixin\HuLu\erweima2"
    /// 下载二维码成功后的物理路径:D:\XXXXXX.com\kkk\erweima2\201503031044566511190.jpg
    public  string GetTicketImage(string TICKET, string openId)
    {
        string content = string.Empty;
        string strpath = string.Empty;//生成的URL 也就是 关注的URL
        string savepath = string.Empty;//图片保存的路径
 
        string stUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" +(TICKET);
 
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl);
 
        req.Method = "GET";
 
        using (WebResponse wr = req.GetResponse())
        {
            HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
            strpath = myResponse.ResponseUri.ToString();
 
            WebClient mywebclient = new WebClient();
            // @"
            var path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
           var filePath = $"UploadImages\\ShareCode";
            path = $"{path}{filePath}\\{DateTime.Now.ToString("yyy-MM")}";
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);//不存在就创建目录
            }
            savepath = $"{path}\\{openId}.{myResponse.ContentType.Split('/')[1].ToString()}";
 
            try
            {
                mywebclient.DownloadFile(strpath, savepath);//下载生成的二维码图片
            }
            catch (Exception ex)
            {
                savepath = ex.ToString();
                 
            }
 
 
        }
 
        return savepath.ToString();
 
 
    }
 
}

如何识别呢? 就是在用户关注的事件中,可以获取到二维码场景值,根据二维码的场景值(在上面,已经将场景值和yoghurt一一对应存储),可以获取到用户的Id,即可获取到推广者的信息。 以下用户关注公众号事件处理场景值Id代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#region 用户关注公众号
      ///
      /// 用户关注公众号
      ///
      ///
      ///
      public async override Task OnEvent_SubscribeRequestAsync(RequestMessageEvent_Subscribe requestMessage)
      {
          try
          {
              if (AppID != null)
              {
                  var userInfo = await UserApi.InfoAsync(AppID, base.WeixinOpenId);
                  if (userInfo == null)
                  {
                      Sprite.Agile.Logger.LoggerManager.Instance.Logger_Info($"获取用户信息失败");
                  }
                  else
                  {
                      Sprite.Agile.Logger.LoggerManager.Instance.Logger_Info($"获取用户信息,OpenId:{userInfo.openid}, WeixinOpenId:{WeixinOpenId}");
                  }
 
                  #region 处理用户信息
                  if (requestMessage.Event == Event.subscribe)
                  {
                      var user = usersRepository.GetUserByOpenId(userInfo.openid);
                      Sprite.Agile.Logger.LoggerManager.Instance.Logger_Info($"二维码场景值{userInfo.qr_scene}");
                      if (user == null)
                      {
                          user = new YueSaoUser
                          {
                              OpenId = userInfo.openid,
                              WeChatNickName = userInfo.nickname,
                              HeadImg = userInfo.headimgurl,
                              Status = Sprite.Agile.Domain.Status.Disabled,
                              UserType=Sprite.Agile.Model.Domain.Entities.UserType.User,
                              IsSubscribe = true
                          };
                          //判断是否通过扫描进入关注
                          if (userInfo.subscribe_scene == "ADD_SCENE_QR_CODE")
                          {
                              //暂时通过场景Id识别上级
                              var parent = usersRepository.GetUserByScanId(userInfo.qr_scene);
                              if(parent!=null)
                              {
                                  user.ParentId = parent.Id;
                              }
                          }
 
                          usersRepository.AddUser(user);
                      }
                      else
                      {
                          user.OpenId = userInfo.openid;
                          user.HeadImg = userInfo.headimgurl;
                          user.WeChatNickName = userInfo.nickname;
                          user.IsSubscribe = true;
                           
                          usersRepository.SaveUser(user);
                      }
                  }
                  #endregion
 
                  var responseMessage = requestMessage.CreateResponseMessage();
                  responseMessage.Content = $"  感谢您的关注";
                  return responseMessage;
              }
              else
              {
                  Sprite.Agile.Logger.LoggerManager.Instance.Logger_Info($"用户关注事件, 微信商户信息为空:{requestMessage.ToUserName}");
                  return new ResponseMessageNoResponse();
              }
          }
          catch (Exception ex)
          {
              Sprite.Agile.Logger.LoggerManager.Instance.Logger_Error(ex);
              return new ResponseMessageNoResponse();
          }
 
      }
      #endregion
posted @   keke..lele  阅读(2270)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示