1. 程式人生 > >nopCommerce 3.9 大波浪系列 之 微信公眾平臺登錄插件

nopCommerce 3.9 大波浪系列 之 微信公眾平臺登錄插件

authent verify rip state link value eat round 掃描

一.簡介

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 }
 74 
IWeiXinExternalAuthService
  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 大波浪系列 之 微信公眾平臺登錄插件