nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件
一.简介
插件源码下载:点击下载
微信公众平台网站授权帮助地址: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 大波浪系列 之 微信公众平台登录插件的更多相关文章
- nopCommerce 3.9 大波浪系列 之 网页加载Widgets插件原理
一.插件简介 插件用于扩展nopCommerce的功能.nopCommerce有几种类型的插件如:支付.税率.配送方式.小部件等(接口如下图),更多插件可以访问nopCommerce官网. 我们看下后 ...
- nopCommerce 3.9 大波浪系列 之 可退款的支付宝插件(下)
一.回顾 支付宝插件源码下载地址:点击下载 上篇介绍了使用支付宝插件进行支付,全额退款,部分退款还有插件的多店铺配置,本文介绍下如何实现的. 二.前期准备 插件主要有3个功能: 多店铺插件配置 支付功 ...
- nopCommerce 3.9 大波浪系列 之 可退款的支付宝插件(上)
一.简介 nop通过插件机制可以支持更多的支付扩展,我们通过编写支持退款的支付宝插件来更好的理解支付插件的扩展. 先分享下支付宝插件源码点击下载,由于时间原因,本篇只介绍使用该插件,下一篇结合插件进行 ...
- nopCommerce 3.9 大波浪系列 之 外部授权登录插件的开发实现
一.简介 nop支持第三方外部授权登录的扩展,本篇通过编写微信公众平台登录插件进一步了解nop授权登录的开发过程. 微信公众平台.微信开放平台使用场景不一样,前者通过微信客户端进行开发如公众号,后者基 ...
- CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷
CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷 CROW-5 WEB APP引擎商业计划书(HTML5方向)
- nopCommerce 3.9 大波浪系列 之 引擎 NopEngine
本章涉及到的内容如下 1.EngineContext初始化IEngine实例 2.Autofac依赖注入初始化 3.AutoMapper框架初始化 4.启动任务初始化 一.EngineContext初 ...
- nopCommerce 3.9 大波浪系列 之 开发支持多店的插件
一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...
- nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存
一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...
- nopCommerce 3.9 大波浪系列 之 使用部署在Docker中的Redis缓存主从服务
一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...
随机推荐
- oracle 树形表结构查询 排序
oracle 树形表结构排序 select * from Table start with parentid is null connect by prior id=parentid order SI ...
- webpack自动生成页面
在项目中我们会不断的添加,优化代码,每次添加优化之后都需要打包进行再次上传更新.这时问题就回来了,每次打包出来js,css文件的名字都是一样的,在首页index.html的引用也不会变,这样老用户在访 ...
- java怎么连接mysql数据库
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- VS2015 +Qt5 串口工具
简单的小工具是VS2015 + Qt5.6.1实现的,界面部分是Qt实现,串口是封装的WinAPI,把串口收发模块封装成了个Serialport.dll 供Qt界面调用. 由于VS2015需要CRT运 ...
- c#面向对象-类(类及其构成)
学习c#已经快一个学期,在这一段时间里,通过自己的努力和老师指导,自己感觉收获颇丰,所以我想把自己学到东西整理一下,供大家点评!若有错误或不当之处,敬请指出. 今天,我先从类及其构成说起! 1. ...
- 二、Solr单机版的搭建
1.1. 运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本次使用Tocmat作为S ...
- JavaWeb 后端 <十二> 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器
一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤
- mac重开电脑后显示重装提示解决办法
情况描述: mac昨天电脑关闭后 第二天打开电脑就显示语言选择安装语言 解决办法: 1 出现语言安装提示界面 我们选择简体中文 2 出现苹果密码登陆 我们选择下面的按钮点击退出 这样就可 ...
- Mac终端查看sqlite3数据库、表数据等
背景: 我们在用FMDB处理iOS数据库时,沙盒里保存的数据库格式为.sqlite3. 当我们需要在模拟器上调试或查看数据库内容时,我们可以直接在终端里查看到. 正文: 1.在沙盒路径找到需要查看到文 ...
- 类 java.util.Scannar方法
类 java.util.Scannar方法 ·Scannar (InputStream ln):用给定的输人流创建一个Scanner对象. ·String nextLlne():读取输入的下一行内容. ...