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


      之前接到了一个项目,要求在关注公众号的用户,推广下个用户,实行奖励模式(只有两级!)。然而,一脸懵,网站开发推广生成二维码,我知道怎么做,大不了记录用户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 命名
            ///相对路径 @"weixinHuLuerweima2"
            /// 下载二维码成功后的物理路径:D:XXXXXX.comkkkerweima2201503031044566511190.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
    
     
  • 相关阅读:
    Unity 鼠标控制视角功能和动画播放冲突解决办法
    Unity5.6.4f1 配置WebGL教程
    动态生成圈形+文字的图片
    mysql 常用操作语句
    ideal环境maven自动下载项目依赖配置
    java调用c#dll文件配置
    项目部署到阿里云遇到数据库和访问问题解决记录
    uni-app打印
    JS将时间对象输出为(12小时制和24小时制)的字符串
    基于H5的摄像头视频的采集与传输
  • 原文地址:https://www.cnblogs.com/kekelele/p/9973337.html
Copyright © 2020-2023  润新知