nop支持第三方登录授权扩展,本篇通过编写微信公众平台登录插件进一步了解nop授权登录的开发过程。
微信公众平台、微信开放平台使用场景不一样,前者通过微信客户端进行开发如公众号,后者基于网站或第三方应用这里不多说,本插件是基于微信公众平台开发,因此测试需要使用到微信web开发者工具.
插件源码下载:点击下载
微信公众平台网站授权帮助地址:传送门
微信web开发者工具使用下载地址:传送门
微信公众平台接口测试账号申请地址:传送门
1.将插件DaBoLang.Nop.Plugin.ExternalAuth.WeiXin插件项目放置在“nopCommerce_3.90_Source\Plugins”目录下。
2.如果缺少引用可以通过NuGet安装,打开【工具】【NuGet 包管理器】【程序包管理器控制台】,输入下边命令,更新包
Update-Package -ProjectName 'DaBoLang.Nop.Plugin.ExternalAuth.WeiXin' -Reinstall
3.编译后文件会保存在“nopCommerce_3.90_Source\Presentation\Nop.Web\Plugins\DaBoLang.ExternalAuth.WeiXin”文件夹下如下图:
4.【后台管理】【插件管理】【本地插件】选择微信登录,点击安装。安装成功后点击编辑勾选已启用。
5.找到插件,点击配置按钮进入配置
6.如果没有测试号,微信公众平台接口测试账号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login进行申请,申请成功后将下图信息填到插件配置中并保存。
然后在公众平台配置网页授权回调域名,这里域名不包含http://
最后需要注册个测试账号,使用微信扫一扫下边的二维码,到此微信公众平台测试配置完成。
7.我们使用微信web开发者工具进行测试,使用上边添加的测试微信号扫描即可进入,地址来输入项目地址(项目外网可访问并且授权回调域名与网站域名相同)。
如果插件安装成功,登录页面会显示微信登录,点击即可登录。
首次登录需要手动授权。
8.未注册、未授权过的账户需要输入邮箱进行账户注册,邮箱唯一。
9.当注册成功后,下次点击微信登录按钮直接登录网站。
微信登录授权流程
这里不在介绍如何创建插件项目了。
首先看下插件目录结构
class="code_img_closed" src="/Upload/Images/2017080921/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('7c330841-a8bf-4a99-8354-00bda896ce67',event)" src="/Upload/Images/2017080921/2B1B950FA3DF188F.gif" alt="" />相比支付接口外部授权登录接口相对简单一些,继承IExternalAuthenticationMethod接口。
GetConfigurationRoute 方法得到插件配置路由
GetPublicInfoRoute 方法则返回了显示授权按钮的路由。
1 using System.Web.Routing; 2 using Nop.Core.Plugins; 3 4 namespace Nop.Services.Authentication.External 5 { 6 /// <summary> 7 /// Provides an interface for creating external authentication methods 8 /// </summary> 9 public partial interface IExternalAuthenticationMethod : IPlugin 10 { 11 /// <summary> 12 /// 插件配置路由 13 /// </summary> 14 /// <param name="actionName">Action name</param> 15 /// <param name="controllerName">Controller name</param> 16 /// <param name="routeValues">Route values</param> 17 void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues); 18 19 20 /// <summary> 21 /// 显示授权登录路由 22 /// </summary> 23 /// <param name="actionName">Action name</param> 24 /// <param name="controllerName">Controller name</param> 25 /// <param name="routeValues">Route values</param> 26 void GetPublicInfoRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues); 27 } 28 }IExternalAuthenticationMethod
RouteProvider.cs文件定义两个路由。
"DaBoLang.Plugin.ExternalAuth.WeiXin.Login" 路由用于返回微信授权地址。
"DaBoLang.Plugin.ExternalAuth.WeiXin.LoginCallback" 路由在用户同意微信授权时,微信回调的路由地址。
1 //登录授权路由 2 routes.MapRoute("DaBoLang.Plugin.ExternalAuth.WeiXin.Login", 3 "Plugins/ExternalAuthWeiXin/Login", 4 new { controller = "WeiXinExternalAuth", action = "Login" }, 5 new[] { "DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Controllers" } 6 ); 7 //微信通知路由 8 routes.MapRoute("DaBoLang.Plugin.ExternalAuth.WeiXin.LoginCallback", 9 "Plugins/ExternalAuthWeiXin/LoginCallback", 10 new { controller = "WeiXinExternalAuth", action = "LoginCallback" }, 11 new[] { "DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Controllers" } 12 );
邮箱是nop用户注册必须提供的,如果是未注册过的用户进行首次微信授权时则需要跳转到注册界面,输入邮箱进行注册。
WeiXinExternalAuthController控制器中Register()方法用于新用户注册。
RegisterModel 为视图模型用于接收请求参数。
1 using System.Web.Mvc; 2 using DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Validators; 3 using FluentValidation.Attributes; 4 using Nop.Web.Framework; 5 using Nop.Web.Framework.Mvc; 6 7 namespace DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Models 8 { 9 /// <summary> 10 /// 命名空间:DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Models 11 /// 名 称:RegisterModel 12 /// 功 能:注册使用,主要提供邮箱 13 /// 详 细: 14 /// 版 本:1.0.0.0 15 /// 文件名称:RegisterModel.cs 16 /// 作 者:大波浪 17 /// 联系方式:http://www.cnblogs.com/yaoshangjin 18 /// 说 明: 19 /// </summary> 20 [Validator(typeof(RegisterValidator))] 21 public partial class RegisterModel : BaseNopModel 22 { 23 24 [NopResourceDisplayName("Account.Fields.Email")] 25 [AllowHtml] 26 public string Email { get; set; } 27 public bool EnteringEmailTwice { get; set; } 28 [NopResourceDisplayName("Account.Fields.ConfirmEmail")] 29 [AllowHtml] 30 public string ConfirmEmail { get; set; } 31 } 32 } 33
RegisterValidator 用于对模型RegisterModel数据进行验证。
nop项目默认是FluentValidation进行验证的。
IWeiXinExternalAuthService接口为插件提供服务:
1.提供微信公众平台接口对接的服务。
2.提供nop外部授权验证服务。IWeiXinExternalAuthService继承IExternalProviderAuthorizer接口。
1 using DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.WeiXin; 2 using Nop.Core.Domain.Customers; 3 using Nop.Services.Authentication.External; 4 5 namespace DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Services 6 { 7 /// <summary> 8 /// 命名空间:DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Services 9 /// 名 称:IWeiXinExternalAuthService 10 /// 功 能:微信登录服务类 11 /// 详 细: 12 /// 版 本:1.0.0.0 13 /// 文件名称:IWeiXinExternalAuthService.cs 14 /// 作 者:大波浪 15 /// 联系方式:http://www.cnblogs.com/yaoshangjin 16 /// 说 明: 17 /// </summary> 18 public interface IWeiXinExternalAuthService : IExternalProviderAuthorizer 19 { 20 /// <summary> 21 /// 1.获取用户授权 22 /// </summary> 23 /// <param name="redirect_uri">跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。</param> 24 /// <param name="scope">应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param> 25 /// <param name="state">重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节</param> 26 /// <returns></returns> 27 string GetAuthorizeUrl(string redirect_uri, string scope="",string state = ""); 28 29 /// <summary> 30 /// 2.通过code换取网页授权access_token 31 /// </summary> 32 /// <param name="code">填写第一步获取的code参数</param> 33 /// <returns></returns> 34 WeiXinResponse GetAccessToken(string code) ; 35 /// <summary> 36 /// 3.刷新access_token(如果需要) 37 /// </summary> 38 /// <param name="refresh_token"></param> 39 /// <returns></returns> 40 WeiXinResponse RefreshToken(string refresh_token); 41 /// <summary> 42 /// 4.拉取用户信息(需scope为 snsapi_userinfo) 43 /// </summary> 44 /// <param name="access_token"></param> 45 /// <param name="openid"></param> 46 /// <param name="lang"></param> 47 /// <returns></returns> 48 WeiXinResponse GetUserInfo(string access_token,string openid,string lang= "zh_CN"); 49 /// <summary> 50 /// 检验授权凭证(access_token)是否有效 51 /// </summary> 52 /// <param name="access_token">网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同</param> 53 /// <param name="openid">用户的唯一标识</param> 54 /// <returns></returns> 55 bool CheckAccessToken(string access_token, string openid); 56 /// <summary> 57 /// 获取微信用户信息 58 /// </summary> 59 /// <param name="code">填写第一步获取的code参数</param> 60 /// <param name="cache">是否缓存用户信息</param> 61 /// <returns></returns> 62 WeiXinUserInfoResponse GetUserInfo(string code, bool cache=false); 63 /// <summary> 64 /// 获取授权用户 65 /// </summary> 66 /// <param name="userInfo">微信授权用户信息</param> 67 /// <returns>关联用户</returns> 68 Customer GetUser(WeiXinUserInfoResponse userInfo ); 69 70 } 71 72 73 } 74IWeiXinExternalAuthService
1 namespace Nop.Services.Authentication.External 2 { 3 /// <summary> 4 /// External provider authorizer 5 /// </summary> 6 public partial interface IExternalProviderAuthorizer 7 { 8 /// <summary> 9 /// Authorize response 10 /// </summary> 11 /// <param name="returnUrl">Return URL</param> 12 /// <param name="verifyResponse">true - Verify response;false - request authentication;null - determine automatically</param> 13 /// <returns>Authorize state</returns> 14 AuthorizeState Authorize(string returnUrl, bool? verifyResponse = null); 15 } 16 }
在IExternalProviderAuthorizer接口Authorize方法授权验证中
最主要的是调用nop提供的Nop.Services.Authentication.External.IExternalAuthorizer接口实现类进行授权认证。该实现类实现了登录验证,注册用户等一系列的功能。
本文地址:http://www.cnblogs.com/yaoshangjin/p/7327242.html
本文为大波浪原创、转载请注明出处。