一.简介

插件源码下载:点击下载

微信公众平台网站授权帮助地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

微信web开发者工具使用下载地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140

微信公众平台接口测试账号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

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.如果没有测试号,微信公众平台接口测试账号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login进行申请,申请成功后将下图信息填到插件配置中并保存。

然后在公众平台配置网页授权回调域名,这里域名不包含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/7327136.html

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

nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件的更多相关文章

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

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

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

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

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

    一.简介 nop通过插件机制可以支持更多的支付扩展,我们通过编写支持退款的支付宝插件来更好的理解支付插件的扩展. 先分享下支付宝插件源码点击下载,由于时间原因,本篇只介绍使用该插件,下一篇结合插件进行 ...

  4. nopCommerce 3.9 大波浪系列 之 外部授权登录插件的开发实现

    一.简介 nop支持第三方外部授权登录的扩展,本篇通过编写微信公众平台登录插件进一步了解nop授权登录的开发过程. 微信公众平台.微信开放平台使用场景不一样,前者通过微信客户端进行开发如公众号,后者基 ...

  5. CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷

    CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷 CROW-5 WEB APP引擎商业计划书(HTML5方向)

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

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

  7. nopCommerce 3.9 大波浪系列 之 开发支持多店的插件

    一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...

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

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

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

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

随机推荐

  1. Array.apply(null,{length:20})与new Array(20)的区别

    Array.apply(null,{length:20}) 这句代码的实际意义:创建长度为20的一个数组,但并非空数组. 跟new Array(20)的区别在于,前一种创建方式,得到的数组中的每一个元 ...

  2. hibernate in List查询条件 sum求和使用参考

    @Override public Integer getSumZongShuByidList(List<String> idList){ Integer zongshu = 0; Stri ...

  3. 【Android Developers Training】 97. 序言:访问通讯录数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. PGI Compiler for OpenACC Output Syntax Highlighting

    PGI Compiler for OpenACC Output Syntax Highlighting When use the PGI compiler to compile codes with ...

  5. 在ASP.NET Core配置环境变量和启动设置

    在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...

  6. net::ERR_CONNCTION_ABORTED与http post request header is too large 错误

    开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...

  7. linux新手入门前知道的一些概念

    前言: 这篇文章是结合自己从小白开始学linux到工作中运用linux系统,以新手怎么理解的角度来说说linux系统,希望能给想学习linux的新手带来一些帮助. 引子:随着互联网技术不断更新,企业对 ...

  8. Your password does not satisfy the current policy requirements

    创建用户,做测试想设置一个简单的密码.报错: 大概是MySQL5.7搞事情,默认安装了validate_password插件. mysql> SHOW VARIABLES LIKE 'valid ...

  9. git常用基本命令

    一定要以管理员的身份打开,否则有些命令不能用,比如ssh -T git@github.com(查看配置ssh是否成功)@初始化git git config --global user.name ruo ...

  10. SpringEL 表达式错误记录

    原因暂时未知....