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

来源:http://www.cnblogs.com/yaoshangjin/archive/2017/08/09/7327242.html
-Advertisement-
Play Games

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”文件夾下如下圖:

  image

4.【後臺管理】【插件管理】【本地插件】選擇微信登錄,點擊安裝。安裝成功後點擊編輯勾選已啟用。

image

5.找到插件,點擊配置按鈕進入配置

image

6.如果沒有測試號,微信公眾平臺介面測試賬號申請地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login進行申請,申請成功後將下圖信息填到插件配置中並保存。

image

    然後在公眾平臺配置網頁授權回調功能變數名稱,這裡功能變數名稱不包含http://

image

image

   最後需要註冊個測試賬號,使用微信掃一掃下邊的二維碼,到此微信公眾平臺測試配置完成。

image

7.我們使用微信web開發者工具進行測試,使用上邊添加的測試微信號掃描即可進入,地址來輸入項目地址(項目外網可訪問並且授權回調功能變數名稱與網站功能變數名稱相同)。

如果插件安裝成功,登錄頁面會顯示微信登錄,點擊即可登錄。

image

     首次登錄需要手動授權。

image

8.未註冊、未授權過的賬戶需要輸入郵箱進行賬戶註冊,郵箱唯一。

image

image

9.當註冊成功後,下次點擊微信登錄按鈕直接登錄網站。

三.插件流程

微信登錄授權流程

image

四.項目結構

這裡不在介紹如何創建插件項目了。

首先看下插件目錄結構

image

  • 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用戶註冊必須提供的,如果是未註冊過的用戶進行首次微信授權時則需要跳轉到註冊界面,輸入郵箱進行註冊。

image

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進行驗證的。

image

八.服務介面

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 

本文為大波浪原創、轉載請註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 和Java、PHP等語言不一樣,sh的流程式控制制不可為空 if else if 語句語法格式: if condition then command1 command2 ... commandN fi 寫成一行(適用於終端命令提示符): if [ $(ps -ef | grep -c "ssh") -g ...
  • Shell 的另一個輸出命令 printf。預設 printf 不會像 echo 自動添加換行符,我們可以手動添加 \n。 #!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1 ...
  • Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字元和文件三個方面的測試 num1=100 num2=100 if test $[num1] -eq $[num2] then echo '兩個數相等!' else echo '兩個數不相等!' fi 輸出結果: 兩個數相等! ...
  • 顯示變數 read 命令從標準輸入中讀取一行,並把輸入行的每個欄位的值指定給 shell 變數 #!/bin/sh read name echo "$name It is a test" 以上代碼保存為 test.sh,name 接收標準輸入的變數,結果將是: [root@www ~]# sh te ...
  • 清理/var/spool/clientmqueue目錄可以釋放大量空間,具體命令是:ls | xargs rm -f ...
  • 認識Linux中的用戶和組 實踐: 查看用戶信息 查看用戶密碼信息 查看組信息 查看登錄的用戶 實踐: 用戶的增,刪,改 實踐:創建一個用戶nash_su,然後使用passwd給用戶nash_su創建密碼,最後刪除用戶。 首先創建用戶。 通過cat /etc/passwd命令,可以看到用戶nash_ ...
  • “工欲善其事,必先利其器” 這篇博文我們介紹一下如何正確的安裝基於c#使用的vs 2017. 1.首先在官網下載Visual Studio,下載地址:https://www.visualstudio.com/zh-hans/ 點擊如下圖位置,即可下載。 2.準備安裝 (1).雙擊安裝包,由於博主已安 ...
  • 前些天和我們的一個郵件服務商對接,雙方需要進行一些通訊,對方是java團隊,而作為.net團隊的我們,只能公佈出去的是一個wcf的basicbinding,想不 到問題來了,對方不知道怎麼去調用這個basic,可能他們水平有點菜,有點尷尬,不得已我來研究研究,其實只要知道公佈的wsdl,對什麼語言都 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...