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

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

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

 

 

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

以下上代码:

 

    ///
    /// 二维码分享   测试使用
    ///
    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代码:

  #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 @ 2018-11-17 13:48  keke..lele  阅读(2221)  评论(0编辑  收藏  举报