nopCommerce 3.9 大波浪系列 之 微信公眾平臺登錄插件
一.簡介
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.當註冊成功後,下次點擊微信登錄按鈕直接登錄網站。
三.插件流程
微信登錄授權流程
四.項目結構
這裏不在介紹如何創建插件項目了。
首先看下插件目錄結構
- 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 方法則返回了顯示授權按鈕的路由。
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接口實現類進行授權認證。該實現類實現了登錄驗證,註冊用戶等一系列的功能。
九.總結
- 插件源碼下載:點擊下載
- 微信公眾平臺測試賬戶申請、web工具下載。
- FluentValidation框架對輸入模型進行驗證。
- nop外部授權的驗證實現。
文中有不正確的觀點請指正,如果您覺得本文對您有幫助,請轉載支持
本文地址:http://www.cnblogs.com/yaoshangjin/p/7327242.html
本文為大波浪原創、轉載請註明出處。
nopCommerce 3.9 大波浪系列 之 微信公眾平臺登錄插件