类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

时间:2022-05-02 14:54:34

/** 转载请保留本人博客园的原地址以及版权声明,请勿恶意修改

*  作者:杨浩瑞  QQ:1420213383

* 演示系统地址:【后台】http://xiaoshuo.qqsiot.cn/manager 【前台】http://y6.qqsiot.cn

*  管理员账号:admin  渠道商账号:channel  代理商账号:agent  演示密码:1413051356   **/


一、微信小说分销系统是什么?

微信小说分销系统是一种合法变现系统,通过购买小说,添加到系统中,然后寻找一些需要粉丝变现的公众号管理者来做自己的渠道商,然后读者阅读小说,充值的钱80%-90%直接给渠道商。平台收取10%-20%,当然,比例自己可以设置。

二、为什么要多网页授权登录

对于微信小说分销系统来说,必然会出现多个公众号的情况,其实就是多个渠道商,每个渠道商都拥有一个公众号,为了更好的隔离渠道商,设计每个渠道商分配一个专属子域名,比如y{0}.qqsiot.cn。

为了更好的用户体验,需要实现自动登录和识别用户的功能,这样读者打开网站的时候不需要输入账号和密码之类的信息来验证信息,除了自动登录,还可以方便后期付款的时候可以调起微信支付。

三、多公众号设计方案

既然考虑到用户体验,不想让验证账号密码,减少繁琐的步骤,那么直接使用微信的无感授权登录方式,snsapi_base方式可以在用户没有关注公众号的时候获取到该用户的openid,并且不需要谈起授权页面,对于用户来说,整个过程是无感的,但是不好的地方在于,此方法无法获取到用户的详细信息,比如昵称、性别、年龄等(不方便后期分析网站的用户喜好和分布)。还有一种方式:snsapi_userinfo,此方式如果是从公众号内部进入的话是没有授权弹窗的,但是如果用户没有关注公众号,此时会弹出是否授权的页面,如果用户拒绝授权,那势必会造成一些不好的后果。

虽然snsapi_base方式无法获取到用户详细信息,但是可以考虑使用其他的办法解决,两个地方可以处理:

1、当用户阅读到一定章节的时候,提示关注公众号,关注成功后,微信会向我们的服务器推送一条关注消息,此时通过微信的获取用户消息接口去获取该用户的信息

  收到的关注推送如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>

2、每次阅读时需要判断是否关注,若用户未关注,则提示关注,若已关注,并且数据库中记录是未关注,那么更新一下用户的详细信息

上边两个地方都提到了获取用户详细信息的接口,接口地址为:https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

可以获取到如下信息:

{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4
eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0,
"tagid_list":[128,2]
}

有点跑题了,言归正传.

四、后台配置基本的公众号信息

每个渠道商可以后台设置自己的公众号的微信号、AppId、AppSecret,然后再微信公众号后台配置授权域名等信息,如下图:

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

微信后台需要配置的信息如下图:

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

五、源码分析

这些配置好之后,在数据库中保存这些信息,当用户打开网站的时候,拿出这些信息去授权。

var isWechat = Request.UserAgent.Contains("MicroMessenger");
if (isWechat)
{
int wid = Common.GetHomeWid();
string url = Request.Url.Scheme + "://" + Request.Url.Host;
//传递参数,获取用户信息后,可跳转到自己定义的页面,想怎么处理就怎么处理
reurl = reurl ?? url;
string appId;
//只要打开这个付款页面,就开始付款,不需要判断什么了
Uri reurlObj = new Uri(reurl);
if (reurlObj.LocalPath.ToLower().StartsWith("/payment/pay"))
{
appId = WxManFactory.AppId;
}
else
{
var account = _accountBll.Get(wid);
if (account == null)
{
return RedirectToAction("Subscribe");
}
appId = account.WechatPublicAppId;
}
reurl = Server.UrlEncode(reurl);
var wxreurl = Server.UrlEncode(url + "/User/WechatLogin?reurl=" + reurl);
//CommonBll.WriteLogFile("Login->" + wxreurl);
//弹出授权页面(如在不弹出授权页面基础下未获得openid,弹出授权页面,提示用户授权)
if (!string.IsNullOrWhiteSpace(auth) && auth == "")
{
return Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
appId + "&redirect_uri=" +
wxreurl + "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");
}
//不弹出授权页面
return Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
appId + "&redirect_uri=" +
wxreurl + "&response_type=code&scope=snsapi_base&state=1#wechat_redirect");
}
return RedirectToAction("Subscribe");

不要一味地去授权,先判断一下是不是在微信浏览器打开的,如果是的话才会去授权,如果不是的话,跳转到关注页面,此页面也是自己写的,上边有公众号的二维码,方便用户使用手机微信扫描关注。

如果是微信端,那么先获取渠道商的AppId,并且记录授权后需要跳转的地址,甚至是获取code和openid后再次跳转的地址。

if (!string.IsNullOrWhiteSpace(code))
{
string url = Request.Url.Scheme + "://" + Request.Url.Host;
reurl = reurl ?? url;
Uri reurlObj = new Uri(reurl);
//只要打开这个付款页面,就开始付款,不需要判断什么了
if (reurlObj.LocalPath.ToLower().StartsWith("/payment/pay"))
{
var model1 = WxManFactory.Get_token(code);
if (model1 == null || string.IsNullOrWhiteSpace(model1.openid))
{
return RedirectToAction("PayConfigError");
}
Session["openid"] = model1.openid;
return Redirect(reurl);
}
int wid = Common.GetHomeWid();
NameValueCollection collection = HttpUtility.ParseQueryString(reurlObj.Query);
var wexinTool = new WeixinNormalTool(wid);
OAuthToken model = wexinTool.Get_token(code); //获取token
//只做基本授权即可
UserBll userBll = new UserBll();
var user = userBll.GetByOpenId(model.openid);
if (user == null)
{
//说明没注册
UserReferralBll urBll = new UserReferralBll();
ConfigBll configBll = new ConfigBll();
//其他平台ID
var otherPlatform = collection.Get("other_id");
user = new User
{
Openid = model.openid,
CoinNum = configBll.GetFirstLoginCoin(),
Sex = ,//1男2女0未知
BelongToChanneltId = wid,
BelongToAgentId = wid,
OtherPlatform = otherPlatform??""
};
//推广链接ID
var referralId = collection.Get("referralId");
var ur = urBll.Get(referralId);
int agentId;
var uid = collection.Get("uid");
if (ur != null)
{
//record belong to
user.BelongToAgentId = ur.AgentId;
user.BecauseReferralId = int.Parse(referralId);
}
else if (int.TryParse(uid, out agentId))
{
//不是第一种推广链接的时候,判断是否是第二种
var account = _accountBll.Get(agentId);
if (account.CreateBy == wid)//只有这个代理的id确实属于该渠道的时候,才会加到该渠道
{
user.BelongToAgentId = agentId;
}
}
//为用户注册账号
userBll.Add(user);
}
Session["openid"] = model.openid;
//跳转到自己的页面,想怎么处理就怎么处理
return Redirect(reurl);
}
return RedirectToAction("Subscribe");

此时授权成功,并且如果用户没有注册会自动注册,如果已经注册了,则直接打开刚才被拦截的页面,另外代码里边还写了支付页面的拦截,以此实现支付独立的功能。

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

后台手机查看,完美匹配

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码

类似818tu.co微信小说分销系统设计之多公众号网页授权自动登录源码的更多相关文章

  1. 类似818tu&period;c微信小说分销系统设计之多公众号网页授权自动登录源码分享

    /** 转载请保留原地址以及版权声明,请勿恶意修改 *  作者:杨浩瑞  QQ:1420213383  独立博客:http://www.yxxrui.cn * [后台]http://xiaoshuo. ...

  2. 类818tu&period;c微信小说分销系统设计之定时模板消息源码

    近期将出个系列讲解开发过程,同时作为此系统的开发记录吧,万能的博客园,本边讲解如何发送模板消息,并且能够定时发送,下一篇讲解如何处理多个公众号的网页授权登录问题 [后台]http://xiaoshuo ...

  3. 微信公众平台开发-OAuth2&period;0网页授权(含源码)

    微信公众平台开发-OAuth2.0网页授权接口.网页授权接口详解(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 在微信开发的高级应用中,几乎都会使用到该接口,因为通过该接口,可以获 ...

  4. 微信公众号网页授权登录--JAVA

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  5. 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题

    前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...

  6. 微信公众号网页授权获取用户openid

    最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid. 这是微信官方文档https://mp.weixin.qq.com/wiki?t=re ...

  7. 微信小说分销系统设计之使用百度Echarts地图统计功能统计微信粉丝地域分布情况

    /** 转载请保留博客园原地址以及版权声明,请勿恶意修改,本博客中的内容均属于技术交流,请勿用于商业用途,谢谢配合 *  作者:杨浩瑞  QQ:1420213383  独立博客:http://www. ...

  8. JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

    一,首先说明下这个微信的openid 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开 ...

  9. 公众号第三方授权 以及微信H5支付(前端)

    由于公司业务需要,想用户通过我们公众号平台支付的金额直接进去用户自己的账户,所以涉及到公众号第三方授权: 由于涉及第三方,故需要在微信开放平台创建第三方平台: 创建第三方平台:(申请页面链接:http ...

随机推荐

  1. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  2. 如何变相的绕过QQ邮箱订阅的繁琐核审

    先看看正常流程:http://open.mail.qq.com/ 点击“接入订阅”==>申请接入==>登录一下 选择接入完全免费 大概流程就是这样: 下面我们说说快速接入的方法: 1.登录 ...

  3. adb push命令的使用

    最近刚接触一种工具(命令),什么命令呢?就是adb命令,对这个命令纯属一个小白鼠,什么都不懂,所以只能adb --help 一下参数,然后就尝试着使用. 今天遇到一个问题,需要将某个文件拷到小机上面, ...

  4. WCF账户密码认证

    记录一下我实现WCF用户认证与权限控制的实现方法, 也让其他网友少走一些弯路. 内容写得非常小白(因为我也是小白嘛), 比较详细, 方便WCF知识基础薄的朋友 主要分为下面几个步骤 作为例子, 创建最 ...

  5. &lbrack;一位菜鸟的COCOS-2D编程之路&rsqb;精灵表单的制作以及简易动画的生成

    1.第一步:使用Zwoptex 制作精灵表单 2.制作的表单的名称为 cocos2Dpng,cocos2D.plist: 3.精灵的动画效果 主要分为五部分. // on "init&quo ...

  6. 谈JAVA的内存回收&lpar;一&rpar;

    谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...

  7. python模块导入的方法与区别

    import ..   #导入整个模块 from .. import .. #导入模块中的类.函数或者变量 from .. import *  #导入模块中的所有公开成员 from .. import ...

  8. php的开发的apache的配置及伪静态的应用

    1.Apache之所以能够解析php代码是游览器首先发送数据到模版页面,然后模版页提交数据到php页面,然后php代码经过Apache解析过后生成结果的,所以是 在Apache的配置文件中是可以看到开 ...

  9. plsql连接oracle

    在plsql中:   需要在工具----选项    指定 1. orcacle   主目录    :G:\PLSQL Developer 11.0.0.1762 中文绿色注册版(免Oracle11g客 ...

  10. CNN 参数计算

    CNN 时间计算复杂度与空间复杂度 即,连续个数与参数个数, 每一个连接都意味着一个计算, 每一个参数都意味一个存储单元. 只计算主要部分. CNN局部连接与权值共享 如图所示: 全连接:如左图所示, ...