微信公众号授权给开放平台

公众号授权给第三方平台的技术实现流程比较简单

这个步骤遗漏了开头获取第三方平台自己的accessToken

先说下流程

如何注册开放平台的第三方信息看截图

其他不说了,此文只说代码部分。

先获取第三方10分一次的ticket。

             using (var streamReader = new StreamReader(Request.InputStream))
{
string stringInput = streamReader.ReadToEnd();
string sMsg = ""; //解析之后的明文
int ret = ;
ret = wxcpt.DecryptMsg(signature, timestamp, nonce, stringInput, ref sMsg);
if (ret != )
return Content(string.Format("解析错误{0}", ret));
var xDoc = XDocument.Parse(sMsg);
var q = (from c in xDoc.Elements() select c).ToList();
var infoType = q.Elements("InfoType").First().Value;
switch (infoType)
{
case "component_verify_ticket":
var ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value;
var wxOpen = (WebProject_GlobalConfig)WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.SelectSingle.ToString(),
new object[] { "4add738c-369d-4570-ad18-77542e18a47a"});//这条请无视,只是wcf取数据。
wxOpen.KeyValue = ComponentVerifyTicket;
wxOpen.ModifyTime = DateTime.Now;
wxOpen = (WebProject_GlobalConfig)WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.Save.ToString(),
new object[] { wxOpen });
return Content("success");
case "unauthorized":
return Content(string.Format("{0} 已取消授权", q.Elements("AuthorizerAppid").First().Value));
default:
break;
}
}
return Content("参数错误!");

获取到的信息解密,并保存component_verify_ticket。

然后就开始做第三方的token事情!

拿accesstoken

                var accessTokenTime = wxOpen.ModifyTime;
if (accessTokenTime < DateTime.Now.AddSeconds(-) | String.IsNullOrEmpty(wxOpen.KeyValue))
{
dynamic authorizerResult = ComponenToken();
wxOpen.ModifyTime = DateTime.Now;
wxOpen.KeyValue = authorizerResult.component_access_token;
WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.Save.ToString(), new object[] { wxOpen });
} /// <summary>
/// Ticket票据读取第三方token
/// </summary>
/// <returns></returns>
public static dynamic ComponenToken()
{
var url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
var jsonDate = new
{
component_appid = GetConfig("ComponentAppid"),
component_appsecret = GetConfig("ComponentSercet"),
component_verify_ticket = GetConfig("ComponentVerifyTicket")
};
return CommonJsonSend.Send<dynamic>(null, url, jsonDate);
}

然后就可以做授权跳转

        /// <summary>
/// 跳转授权
/// </summary>
/// <returns></returns>
public ActionResult WxRedirect()
{
var url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid={0}&pre_auth_code={1}&redirect_uri={2}";//跳转网页
var proResult = WeChatTokenHelper.GetProCode();//预授权码
url = String.Format(url, WeChatTokenHelper.GetConfig("ComponentAppid"), proResult.pre_auth_code, "http://XXXXX/DptWxOpen/AuthInfo");
return Redirect(url);
}

不知道怎么拿预授权码?好吧,看代码!

        /// <summary>
/// 第三方token读取预授权读取
/// </summary>
/// <param name="Ticket"></param>
/// <returns></returns>
public static dynamic GetProCode()
{
var url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={0}";
var jsonData = new
{
component_appid = GetConfig("ComponentAppid")
};
return CommonJsonSend.Send<dynamic>(GetOpenToken(), url, jsonData);
}

最后的悲哀授权成功回调~

        /// <summary>
/// 微信回调url
/// </summary>
/// <param name="auth_code"></param>
/// <returns></returns>
public ActionResult AuthInfo(String auth_code)
{
var admin = Session["WebAdmin"] as WebProject_Admin; //登陆身份而已,别太在意
if (admin == null)
return Redirect("/DptPages/Login");
dynamic tokenResult = WeChatTokenHelper.GetWeChat(auth_code);//换授权码
dynamic authorizationInfo = tokenResult.authorization_info;
String appId = authorizationInfo.authorizer_appid;
var authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.SelectSingle.ToString(),
new object[] { "x.WebId == " + admin.WebId, true });
if (authorizerInfo == null)
{
authorizerInfo = new WebProject_AuthorizerWeChat
{
WebId = admin.WebId
};
authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.Save.ToString(),
new object[] { authorizerInfo });
}
if (authorizerInfo == null)
return Content("对象报错!");
authorizerInfo.AppId = appId;
authorizerInfo.AccessToken = authorizationInfo.authorizer_access_token;
authorizerInfo.AccessTokenTime = DateTime.Now;
authorizerInfo.RefreshToken = authorizationInfo.authorizer_refresh_token;
var Func = JSON.Deserialize<func_info>(funcinfo(authorizationInfo.func_info));
var Json = "";
foreach (var i in Func.Info)
{
i.funcscope_category.FuncType = i.funcscope_category.id > ? (FuncType)i.funcscope_category.id : FuncType.Error;
Json += JSON.ToJson(i);
}
authorizerInfo.FuncInfo = Json;
authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.Save.ToString(),
new object[] { authorizerInfo });
return Redirect("WeChatInfo?state=true");
}

好人做到底,授权码方法:

        /// <summary>
/// 授权码code换身份
/// </summary>
/// <param name="authCode"></param>
/// <returns></returns>
public static dynamic GetWeChat(String authCode)
{
var url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={0}";
var jsonData = new
{
component_appid = GetConfig("ComponentAppid"),
authorization_code = authCode
};
return CommonJsonSend.Send<dynamic>(GetOpenToken(), url, jsonData);
}

几个关于授权信息的类工具:

        #region AuthorInfo Helper

        public string funcinfo(dynamic info)
{
string newinfo = "{\"Info\":" + info + "}";
return newinfo;
}
public class func_info
{
public List<InfoList> Info { get; set; }
}
public class InfoList
{
public Info funcscope_category { get; set; }
} public class Info
{
public Int32 id { get; set; }
public FuncType FuncType { get; set; }
} #endregion

 若有问题请评论留言~

微信第三方平台开头篇--MVC代码(第三方获取ticket和公众号授权)的更多相关文章

  1. 微信公众号授权,支付,退款总结【shoucang】

    1.支付前准备 1.1首先两个平台接入账户. 商户平台:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F 公众平台: ...

  2. 【tp5.1】微信公众号授权登录及获取信息录入数据库

    微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...

  3. uniapp - 微信公众号授权登录

    [缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程   [摸索] ...

  4. Python3 itchat微信获取好友、公众号、群聊的基础信息

    Python3 itchat微信获取好友.公众号.群聊的基础信息 一.简介 安装 itchat pip install itchat 使用个人微信的过程当中主要有三种账号需要获取,分别为: 好友 公众 ...

  5. 基于.net5 wtm框架、uni-app微信公众号开发一、公众号授权

    前端公众号授权 公众号设置 0.首先用IIS创建一个空目录的网站用于公众号域名验证,接着把该网站内网穿透出去,推荐用utools工具,官网:https://u.tools/ 下载安装好后搜索内网穿透并 ...

  6. ASP.NET之MVC 微信公众号授权给第三方平台的技术实现流程(获取第三方平台access_token)

    “出于安全考虑,在第三方平台创建审核通过后,微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket,用于获取第三方平台接口调用凭据”.这是文档中的原话,也 ...

  7. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

  8. 公众号第三方平台开发 component_verify_ticket和accessToken的获取

    公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...

  9. 微信开放平台创建android应用时怎么获取应用签名

    之前微信开放平台中申请创建应用,没有整理,过了好久,又重新百度,今天索性整理了,以供童鞋们备用. 1.微信开发平台注册申请成开发者账号,就此略过 2.在管理中心选择创建移动应用.按照严格要求填写.上传 ...

随机推荐

  1. log4net生成多个日志文件

    使用Log4Net日志组件时,经常会碰到这样一种场景,我想把错误的日志记录在Error.log文件中,而把操作的日志放在Operation.log文件中 经过几番尝试,终于实现了,在此把Log4Net ...

  2. 【转】Jenkins+Ant+Jmeter搭建持续集成的接口测试平台

    一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻 ...

  3. FTP协议完全详解

    1. 介绍 FTP的目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据.虽然我们也可以手工使用它,但是它的主要作用是供程序使用的.在阅读本文之前最好能够阅读TC ...

  4. tp5操作mongo

    1.通过composer安装 composer require mongodb/mongodb 2.使用 <?php /** * @author: jim * @date: 2017/11/17 ...

  5. django-settings.py配置

    django settings 详细资料 ############ 开始项目 python3.5 pip -m install django==1.11.7 指定版本安装 pip3 install d ...

  6. python学习(十五) 屏幕抓取

    15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...

  7. springmvc防止表单重复提交demo

    原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...

  8. OCX RegSvr32 error

    [Window Title]RegSvr32 [Content]The module "tt.ocx" failed to load. Make sure the binary i ...

  9. Java多线程-新特征-原子量

    所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过volatile.synch ...

  10. mysql\redis局域网链接

    mysql: GRANT SELECT,DELETE,UPDATE,INSERT ON int_worm.* TO 'root'@'%' IDENTIFIED BY 'root'; redis: co ...