一.简介

nop支持第三方外部授权登录的扩展,本篇通过编写微信公众平台登录插件进一步了解nop授权登录的开发过程。

微信公众平台、微信开放平台使用场景不一样,前者通过微信客户端进行开发如公众号,后者基于网站或第三方应用这里不多说,本插件是基于微信公众平台开发,因此测试需要使用到微信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.如果没有测试号,微信公众平台接口测试账号申请地址:点击查看进行申请,申请成功后将下图信息填到插件配置中并保存。

然后在公众平台配置网页授权回调域名,这里域名不包含http://

最后需要注册个测试账号,使用微信扫一扫下边的二维码,到此微信公众平台测试配置完成。

7.我们使用微信web开发者工具进行测试,使用上边添加的测试微信号扫描即可进入,地址来输入项目地址(项目外网可访问并且授权回调域名与网站域名相同)。

如果插件安装成功,登录页面会显示微信登录,点击即可登录。

首次登录需要手动授权。

8.未注册、未授权过的账户需要输入邮箱进行账户注册,邮箱唯一。

9.当注册成功后,下次点击微信登录按钮直接登录网站。

三.插件流程

微信登录授权流程

四.项目结构

这里不在介绍如何创建插件项目了。

首先看下插件目录结构

  • Content   放置css文件及静态文件
  • Controller 控制器文件夹
  • Core 放置核心类
  • Models 放置视图模型
  • Services 放置服务
  • Validators 放置模型验证(注册时对邮箱验证)
  • Views  视图
  • WeiXin  放置微信接口响应类
  • DependencyRegistrar.cs    依赖注入
  • Description.txt   插件描述
  • packages.config   NuGget包配置
  • RouteProvider.cs  路由注册
  • WeiXinAuthSettings.cs   插件配置
  • WeiXinExternalAuthMethod.cs    外部授权插件接口实现类

五.授权接口

相比支付接口外部授权登录接口相对简单一些,继承IExternalAuthenticationMethod接口。

GetConfigurationRoute 方法得到插件配置路由

GetPublicInfoRoute  方法则返回了显示授权按钮的路由。

 using System.Web.Routing;
 using Nop.Core.Plugins;

 namespace Nop.Services.Authentication.External
 {
     /// <summary>
     /// Provides an interface for creating external authentication methods
     /// </summary>
     public partial interface IExternalAuthenticationMethod : IPlugin
     {
         /// <summary>
         /// 插件配置路由
         /// </summary>
         /// <param name="actionName">Action name</param>
         /// <param name="controllerName">Controller name</param>
         /// <param name="routeValues">Route values</param>
         void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues);

         /// <summary>
         ///  显示授权登录路由
         /// </summary>
         /// <param name="actionName">Action name</param>
         /// <param name="controllerName">Controller name</param>
         /// <param name="routeValues">Route values</param>
         void GetPublicInfoRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues);
     }
 }

IExternalAuthenticationMethod

六.路由定义

RouteProvider.cs文件定义两个路由。

"DaBoLang.Plugin.ExternalAuth.WeiXin.Login"  路由用于返回微信授权地址。

"DaBoLang.Plugin.ExternalAuth.WeiXin.LoginCallback" 路由在用户同意微信授权时,微信回调的路由地址。

            //登录授权路由
             routes.MapRoute("DaBoLang.Plugin.ExternalAuth.WeiXin.Login",
                 "Plugins/ExternalAuthWeiXin/Login",
                 new { controller = "WeiXinExternalAuth", action = "Login" },
                 new[] { "DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Controllers" }
             );
             //微信通知路由
             routes.MapRoute("DaBoLang.Plugin.ExternalAuth.WeiXin.LoginCallback",
                 "Plugins/ExternalAuthWeiXin/LoginCallback",
                 new { controller = "WeiXinExternalAuth", action = "LoginCallback" },
                 new[] { "DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Controllers" }
             );

七.用户注册、模型验证

邮箱是nop用户注册必须提供的,如果是未注册过的用户进行首次微信授权时则需要跳转到注册界面,输入邮箱进行注册。

WeiXinExternalAuthController控制器中Register()方法用于新用户注册。

RegisterModel 为视图模型用于接收请求参数。

 using System.Web.Mvc;
 using DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Validators;
 using FluentValidation.Attributes;
 using Nop.Web.Framework;
 using Nop.Web.Framework.Mvc;

 namespace DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Models
 {
     /// <summary>
     /// 命名空间:DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Models
     /// 名    称:RegisterModel
     /// 功    能:注册使用,主要提供邮箱
     /// 详    细:
     /// 版    本:1.0.0.0
     /// 文件名称:RegisterModel.cs
     /// 作    者:大波浪
     /// 联系方式:http://www.cnblogs.com/yaoshangjin
     /// 说    明:
     /// </summary>
     [Validator(typeof(RegisterValidator))]
     public partial class RegisterModel : BaseNopModel
     {

         [NopResourceDisplayName("Account.Fields.Email")]
         [AllowHtml]
         public string Email { get; set; }
         public bool EnteringEmailTwice { get; set; }
         [NopResourceDisplayName("Account.Fields.ConfirmEmail")]
         [AllowHtml]
         public string ConfirmEmail { get; set; }
     }
 }
 

RegisterValidator 用于对模型RegisterModel数据进行验证。

nop项目默认是FluentValidation进行验证的。

八.服务接口

IWeiXinExternalAuthService接口为插件提供服务:

1.提供微信公众平台接口对接的服务。

2.提供nop外部授权验证服务。IWeiXinExternalAuthService继承IExternalProviderAuthorizer接口。

 using DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.WeiXin;
 using Nop.Core.Domain.Customers;
 using Nop.Services.Authentication.External;

 namespace DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Services
 {
     /// <summary>
     /// 命名空间:DaBoLang.Nop.Plugin.ExternalAuth.WeiXin.Services
     /// 名    称:IWeiXinExternalAuthService
     /// 功    能:微信登录服务类
     /// 详    细:
     /// 版    本:1.0.0.0
     /// 文件名称:IWeiXinExternalAuthService.cs
     /// 作    者:大波浪
     /// 联系方式:http://www.cnblogs.com/yaoshangjin
     /// 说    明:
     /// </summary>
     public interface IWeiXinExternalAuthService : IExternalProviderAuthorizer
     {
         /// <summary>
         /// 1.获取用户授权
         /// </summary>
         /// <param name="redirect_uri">跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。</param>
         /// <param name="scope">应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param>
         /// <param name="state">重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节</param>
         /// <returns></returns>
         string GetAuthorizeUrl(string redirect_uri, string scope="",string state = "");

         /// <summary>
         /// 2.通过code换取网页授权access_token
         /// </summary>
         /// <param name="code">填写第一步获取的code参数</param>
         /// <returns></returns>
         WeiXinResponse GetAccessToken(string code) ;
         /// <summary>
         /// 3.刷新access_token(如果需要)
         /// </summary>
         /// <param name="refresh_token"></param>
         /// <returns></returns>
         WeiXinResponse RefreshToken(string refresh_token);
         /// <summary>
         /// 4.拉取用户信息(需scope为 snsapi_userinfo)
         /// </summary>
         /// <param name="access_token"></param>
         /// <param name="openid"></param>
         /// <param name="lang"></param>
         /// <returns></returns>
         WeiXinResponse GetUserInfo(string access_token,string openid,string lang= "zh_CN");
         /// <summary>
         /// 检验授权凭证(access_token)是否有效
         /// </summary>
         /// <param name="access_token">网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同</param>
         /// <param name="openid">用户的唯一标识</param>
         /// <returns></returns>
         bool CheckAccessToken(string access_token, string openid);
         /// <summary>
         /// 获取微信用户信息
         /// </summary>
         /// <param name="code">填写第一步获取的code参数</param>
         /// <param name="cache">是否缓存用户信息</param>
         /// <returns></returns>
         WeiXinUserInfoResponse GetUserInfo(string code, bool cache=false);
         /// <summary>
         /// 获取授权用户
         /// </summary>
         /// <param name="userInfo">微信授权用户信息</param>
         /// <returns>关联用户</returns>
         Customer GetUser(WeiXinUserInfoResponse userInfo );

     }

 }
 

IWeiXinExternalAuthService

 namespace Nop.Services.Authentication.External
 {
     /// <summary>
     /// External provider authorizer
     /// </summary>
     public partial interface IExternalProviderAuthorizer
     {
         /// <summary>
         /// Authorize response
         /// </summary>
         /// <param name="returnUrl">Return URL</param>
         /// <param name="verifyResponse">true - Verify response;false - request authentication;null - determine automatically</param>
         /// <returns>Authorize state</returns>
         AuthorizeState Authorize(string returnUrl, bool? verifyResponse = null);
     }
 }

在IExternalProviderAuthorizer接口Authorize方法授权验证中

最主要的是调用nop提供的Nop.Services.Authentication.External.IExternalAuthorizer接口实现类进行授权认证。该实现类实现了登录验证,注册用户等一系列的功能。

九.总结

  • 微信公众平台测试账户申请、web工具下载。
  • FluentValidation框架对输入模型进行验证。
  • nop外部授权的验证实现。

文中有不正确的观点请指正,如果您觉得本文对您有帮助,请转载支持

本文地址:http://www.cnblogs.com/yaoshangjin/p/7327588.html

本文为大波浪原创、转载请注明出处。

nopCommerce 3.9 大波浪系列 之 外部授权登录插件的开发实现的更多相关文章

  1. nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件

    一.简介 插件源码下载:点击下载 微信公众平台网站授权帮助地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp142114084 ...

  2. nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  3. nopCommerce 3.9 大波浪系列 之 使用部署在Docker中的Redis缓存主从服务

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  4. nopCommerce 3.9 大波浪系列 之 引擎 NopEngine

    本章涉及到的内容如下 1.EngineContext初始化IEngine实例 2.Autofac依赖注入初始化 3.AutoMapper框架初始化 4.启动任务初始化 一.EngineContext初 ...

  5. nopCommerce 3.9 大波浪系列 之 网页加载Widgets插件原理

    一.插件简介 插件用于扩展nopCommerce的功能.nopCommerce有几种类型的插件如:支付.税率.配送方式.小部件等(接口如下图),更多插件可以访问nopCommerce官网. 我们看下后 ...

  6. nopCommerce 3.9 大波浪系列 之 可退款的支付宝插件(下)

    一.回顾 支付宝插件源码下载地址:点击下载 上篇介绍了使用支付宝插件进行支付,全额退款,部分退款还有插件的多店铺配置,本文介绍下如何实现的. 二.前期准备 插件主要有3个功能: 多店铺插件配置 支付功 ...

  7. nopCommerce 3.9 大波浪系列 之 global.asax

    一.nop的global.asax文件 nop3.9基于ASP.NET MVC 5框架开发,而ASP.NET MVC中global.asax文件包含全局应用程序事件的事件处理程序,它响应应用程序级别和 ...

  8. nopCommerce 3.9 大波浪系列 之 IWebHelper

    接口:Nop.Core.IWebHelper 实现:Nop.Core.WebHelper 测试:Nop.Core.Tests.WebHelperTests 简介:Web辅助类 功能:获取客户端IP地址 ...

  9. nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman

    官网:http://www.roxyfileman.com/ 中文包:zh.json 1.将zh.json包拷贝到Nop.Admin项目中"Content\Roxy_Fileman\lang ...

随机推荐

  1. ES6中的export以及import的使用多样性

    模块功能主要由两个命令构成:export和import.export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能. 一.export导出模块使用部分的几种方式 一个模块就是一 ...

  2. jquery让页面滚动条top,滚动条 顶部

    jquery让页面滚动条top,滚动条 顶部$(document).scrollTop(0);

  3. Swift字符串插值

    字符串插值是一种全新的构建字符串的方式,可以在其中包含常量.变量.字面量和表达式.您插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中: let multiplier = let messa ...

  4. php测试题

    1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数据库 D:PHP语言 2. 以下哪个SQL语句是正确的(D) A:insert into u ...

  5. .NET C#到Java没那么难,MVC篇

    最典型的JAVA MVC就是JSP + servlet + javabean的模式.比较好的MVC,老牌的有Struts.Webwork.新兴的MVC 框架有Spring MVC.Tapestry.J ...

  6. Linux 重启和关机命令

    shutdown -r  05:30   在凌晨五点30分关机     shutdown -r  05:30 &     后台执行     shutdown -c    取消前一个关机命令   ...

  7. (转载)JAVA中八种基本数据类型的默认值

    原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...

  8. Spring IOC bean加载过程

    首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固 ...

  9. 自画一张linux基础架构学习框架图

    草图一张,仅供参考,学习并掌握下面这张图的技能只是个开始--

  10. webpack1 新手入门教程

    本文github仓库地址: https://github.com/Rynxiao/webpack-tutorial ,里面包括了本教程的所有代码. [如果你觉得这篇文章写得不错,麻烦给本仓库一颗星:- ...