1. 程式人生 > >微信網頁授權操作邏輯封裝-C#例項

微信網頁授權操作邏輯封裝-C#例項

一、微信網頁授權登入

前提:

1.已經獲取的介面許可權,如果是測試賬號就已經有許可權了

2.配置介面的授權域名

步驟:

1.使用者同意授權,獲取code

2.根據code 獲取access_token及當前操作使用者的openid、unionid

3.根據openid獲取使用者基本資訊(如果需要的話)

注:如果想在網站使用掃一掃,授權登入,可以講 _oauth.GetCodeUrl() 授權地址生成二維碼來使用

C#封裝微信網頁授權登入使用例項:

string appid = "wx145b4a8fd07b24e8";
string appsecrect = "fe6951dcb99772411c42f724b1336065";
string redirect_url = "配置域名下的回撥地址";
OAuthManage _oauth = null;
/// <summary>
///控制器建構函式
/// </summary>
public UserController()
{
    _oauth = new OAuthManage(appid, appsecrect, redirect_url);
}
/// <summary>
/// 授權登入
/// </summary>
/// <returns></returns>
public ActionResult AuthLogin()
{
    ViewBag.url = _oauth.GetCodeUrl();
    return View();
}
/// <summary>
/// 回撥處理
/// </summary>
/// <returns></returns>
public ActionResult OAuthHandle()
{
    string result = "";
    //註冊事件處理
    _oauth.OnError = (e) =>
    {
        string msg = "";
        Exception inner = e;
        while (inner != null)
        {
            msg += inner.Message;
            inner = inner.InnerException;
        }
        result = msg;
        LogOperate.Write(msg);
    };
    _oauth.OnGetTokenSuccess = (token) =>
    {
        result += "<br/>";
        result += token.ToJsonString();
    };
    _oauth.OnGetUserInfoSuccess = (user) =>
    {
        result += "<br/>";
        result += user.ToJsonString();
    };
    //第二步
    _oauth.GetAccess_Token();
    //第三步
    _oauth.GetUserInfo();
    //顯示結果
    ViewBag.msg = result;
    return View();
}

封裝程式碼類定義:

namespace WXPackage
{
    /// <summary>
    /// 網頁授權邏輯處理,
    /// 處理三步操作,處理成功,返回使用者基本資訊
    /// </summary>
    public class OAuthManage
    {
        #region 基本資訊定義
        /// <summary>
        /// 公眾號的唯一標識
        /// </summary>
        private string appid;
        /// <summary>
        /// 公眾號的appsecret
        /// </summary>
        private string secret;
        /// <summary>
        /// 回撥url地址
        /// </summary>
        private string redirect_uri;
        /// <summary>
        /// 獲取微信使用者基本資訊使用snsapi_userinfo模式
        /// 如果使用靜默授權,無法獲取使用者基本資訊但可以獲取到openid
        /// </summary>
        private string scope;
        public OAuthManage(string appid, string appsecret, string redirect_uri, bool IsUserInfo = true)
        {
            this.appid = appid;
            this.secret = appsecret;
            this.redirect_uri = redirect_uri;
            this.scope = IsUserInfo ? "snsapi_userinfo" : "snsapi_base";
        }
        #endregion

        #region 請求過程資訊
        /// <summary>
        /// 第一步獲取到的Code 值
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 第二步獲取到的access_token及相關資料
        /// </summary>
        public OAuthAccess_Token TokenData = null;
        #endregion

        #region 事件定義
        /// <summary>
        /// 當處理出現異常時,觸發
        /// </summary>
        public Action<Exception> OnError = null;
        /// <summary>
        /// 當獲取AccessToken成功是觸發
        /// </summary>
        public Action<OAuthAccess_Token> OnGetTokenSuccess = null;
        /// <summary>
        /// 當獲取使用者資訊成功時觸發
        /// </summary>
        public Action<OAuthUser> OnGetUserInfoSuccess = null;
        #endregion

        #region 第二步,回撥處理
        /// <summary>
        /// 第二步,通過code換取網頁授權access_token
        /// </summary>
        public void GetAccess_Token()
        {
            try
            {
                //1.處理跳轉
                this.Code = ReqHelper.GetString("code");
                if (string.IsNullOrEmpty(this.Code))
                    throw new Exception("獲取code引數失敗或使用者禁止授權獲取基本資訊");
                //1.傳送獲取access_token請求
                string url = GetAccess_TokenUrl();
                string result = NetHelper.Get(url);

                //2.解析相應結果
                TokenData = JsonConvert.DeserializeObject<OAuthAccess_Token>(result);
                if (TokenData == null)
                    throw new Exception("反序列化結果失敗,返回內容為:" + result);
                //3.獲取成功
                if (OnGetTokenSuccess != null)
                    OnGetTokenSuccess(TokenData);
            }
            catch (Exception ex)
            {
                Error("第二步,通過code換取網頁授權access_token異常", ex);
            }
        }
        /// <summary>
        /// 重新整理當前access_token
        /// </summary>
        public OAuthAccess_Token RefreshAccess_Token()
        {
            try
            {
                //1.傳送請求
                string url = GetReferesh_TokenUrl();
                string result = NetHelper.Get(url);
                //2.解析結果
                OAuthAccess_Token token = JsonConvert.DeserializeObject<OAuthAccess_Token>(result);
                if (token == null)
                    throw new Exception("反序列化結果失敗,返回內容:" + result);
                return token;
            }
            catch (Exception ex)
            {
                Error("重新整理當前access_token失敗", ex);
                return null;
            }
        }
        #endregion

        #region 第三步,獲取使用者基本資訊
        /// <summary>
        /// 第三步,獲取基本資訊
        /// </summary>
        public void GetUserInfo()
        {
            try
            {
                //1.傳送get請求
                string url = GetUserInfoUrl();
                string result = NetHelper.Get(url);
                //2.解析結果
                OAuthUser user = JsonConvert.DeserializeObject<OAuthUser>(result);
                if (user == null)
                    throw new Exception("反序列化結果失敗,返回內容:" + result);
                //3.獲取成功
                if (OnGetUserInfoSuccess != null)
                    OnGetUserInfoSuccess(user);
            }
            catch (Exception ex)
            {
                Error("第三步、獲取使用者基本資訊異常", ex);
            }
        }
        #endregion

        #region 靜態方法
        /// <summary>
        /// 驗證授權憑證是否有效
        /// </summary>
        /// <param name="access_token">access_token</param>
        /// <param name="openid">使用者針對當前公眾號的openid</param>
        /// <returns></returns>
        public static bool CheckWebAccess_Token(string access_token, string openid)
        {
            try
            {
                string url = string.Format("https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}",
             access_token,
             openid);
                string result = NetHelper.Get(url);
                JObject obj = JObject.Parse(result);
                int errcode = (int)obj["errcode"];
                return errcode == 0;
            }
            catch (Exception ex)
            {
                throw new Exception("," + ex.Message);
            }
        }
        #endregion

        #region 獲取請求連線
        /// <summary>
        /// 獲取Code的url 地址
        /// </summary>
        /// <returns></returns>
        public string GetCodeUrl()
        {
            string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect",
                this.appid,
                SecurityHelper.UrlEncode(this.redirect_uri),
                this.scope);
            return url;
        }
        /// <summary>
        /// 獲取access_token的url地址
        /// </summary>
        /// <returns></returns>
        private string GetAccess_TokenUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code",
                this.appid,
                this.secret,
                this.Code);
            return url;
        }
        /// <summary>
        /// 獲取重新整理AccessToke的地址
        /// </summary>
        /// <returns></returns>
        private string GetReferesh_TokenUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}",
                this.appid,
                this.TokenData.refresh_token
                );
            return url;
        }
        /// <summary>
        /// 獲取使用者基本資訊地址
        /// </summary>
        /// <returns></returns>
        private string GetUserInfoUrl()
        {
            string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN",
                this.TokenData.access_token,
                this.TokenData.openid);
            return url;
        }
        #endregion
        private void Error(string msg, Exception inner)
        {
            if (this.OnError != null)
            {
                this.OnError(new Exception(msg, inner));
            }
        }
    }
    /// <summary>
    /// 授權之後獲取使用者基本資訊
    /// </summary>
    public class OAuthUser
    {
        public string openid { get; set; }
        public string nickname { get; set; }
        public int sex { get; set; }
        public string province { get; set; }
        public string city { get; set; }
        public string country { get; set; }
        public string headimgurl { get; set; }
        /// <summary>
        /// 使用者特權資訊,json 陣列
        /// </summary>
        public JArray privilege { get; set; }
        public string unionid { get; set; }
    }
    /// <summary>
    /// 獲取Access_Token或者重新整理返回的資料物件
    /// </summary>
    public class OAuthAccess_Token
    {
        public string access_token { get; set; }
        public int expires_in { get; set; }
        public string refresh_token { get; set; }
        /// <summary>
        /// 使用者針對當前公眾號的唯一標識
        /// 關注後會產生,返回公眾號下頁面也會產生
        /// </summary>
        public string openid { get; set; }
        public string scope { get; set; }
        /// <summary>
        /// 當前使用者的unionid,只有在使用者將公眾號繫結到微信開放平臺帳號後
        /// </summary>
        public string unionid { get; set; }
    }
}

更多:

相關推薦

網頁授權操作邏輯封裝-C#例項

一、微信網頁授權登入 前提: 1.已經獲取的介面許可權,如果是測試賬號就已經有許可權了 2.配置介面的授權域名 步驟: 1.使用者同意授權,獲取code 2.根據code 獲取access_token及當前操作使用者的openid、unionid 3.根據openid獲

C#網頁授權登入(NET MVC)

##Token驗證 WeixinController.cs using System.Web.Mvc; namespace WeChat.Controllers { public class WeixinController : Controller

網頁授權登入(c# Webform)

##Default.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE

網頁授權獲取用戶息等機制

json 開發者 userinfo 技術分享 nal amp 分隔 response unionid 參考官方文檔 https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 1.用戶進入授權

網頁授權-公眾號支付(獲取openid、用戶息等)

blog red code rect ref true 說明 oauth2 具體細節 名詞解釋: openid 用戶唯一標識,請註意,在未關註公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID 業務功能描述:實現H

網頁授權

cde 註意 connect encode res str abc 有關 href 有關微信網頁授權 let wechat = { getCode:function(appids){ /** * 獲取微信code

【TP3.2.3】網頁授權--基類

重新 exec 進入 index.php sset AR 關註 fun func 非常好用的微信授權 基類:其他的微信權限類都可以繼承至該類: <?php namespace Wechat\Controller; use Think\Controller;

手把手實現網頁授權支付,附源代碼(VUE and thinkPHP)

nec ble 名單 ret 一次 hash 掃一掃 網頁 ada wechat github 手把手實現微信網頁授權和微信支付,附源代碼(VUE and thinkPHP) 概述 公眾號開發是痛苦的,痛苦在好多問題開發者文檔是沒有提到的,是需要你猜的. 在開發過程中翻

.netMVC企業網頁授權+註冊全局過濾器

glob for init cgi http 一個 使用 QQ == 微信網頁授權   達到效果:企業應用只能在微信中查看,在瀏覽器中打開企業頁面,顯示無權限! 原理,用session記錄用戶,如果用戶已經通過微信授權,記錄@Session["UserId"],如果用戶

解決網頁授權一個回調域名多個業務使用

ces 公眾號授權 存在 方案 安全問題 TP 公眾 處理 source 前言 我們都知道微信的網頁授權回調域名只能設置一個,但是多個業務使用同一個微信公眾號授權信息的話,就需要使用者內部進行處理了,下面給出我使用的一種簡陋的解決方案。 方法 正常流程 1: 第一步:用戶同

H5獲取網頁授權

esp lin storage {} cti 調用接口 set auth nav //判斷是否微信瀏覽器 isWeiXin: function(){   let ua = window.navigator.userAgent.toLowerCase();   retur

網頁授權報code been used, hints: [ req_id: XYv1Ha07042046 ]

web 獲取 UNC color 微信網頁授權 oauth image 授權 use 先貼上代碼: public function index() { $code = input(‘get.code‘); $tool = n

VueJs單頁應用實現網頁授權分享功能示例

在實際開發中,無論是做PC端、WebApp端還是微信公眾號等型別的專案的時候,或多或少都會涉及到微信相關的開發,最近公司專案要求實現微信網頁授權,並獲取微信使用者基本資訊的功能及微信分享的功能,現在總算完成了,但開發過程中遇到好幾個坑。廢話不多說了,開始正題。 描述點 微信相關開發知識

網頁授權——獲取code、access_token、openid,及跨域問題解決

首先在微信開發文件中有提到微信網頁授權的操作步驟: 第一步:使用者同意授權,獲取code 在確保微信公眾賬號擁有授權作用域(scope引數)的許可權的前提下(服務號獲得高階介面後,預設擁有scope引數中的snsapi_base和snsapi_userinfo),引導關注者開啟如下頁面:

網頁授權獲取code

<script> (function(){ var code = GetQueryString('code'); if(code){ alert(code) return false; }else{ shouquan(); } function shouquan(){ var redi

網頁授權失敗原因總結

1.專案中網頁授權回撥地址與微信公眾號設定的回撥地址不一樣 2.如果公眾號為服務號,沒有把MP_verify_zoOZRR6Jqi5eQA1n.txt貼上進專案裡 3.如果公眾號為服務號,專案必須要用域名訪問地址 4.如果公眾號為測試號,也不可以用ip地址做專案訪問地址,因為用ip地址訪問的話

PHP 網頁授權獲取使用者資訊

  class WxController extends Controller {     //put your code here     /**      * 微信授權相關介面

網頁授權access_token 與 基礎支援的access_token

   在此總結一下網頁授權access_token 與 微信基礎支援的access_token 的區別。 1. 網頁授權access_token  微信開放平臺的使用者掃碼登陸網站, 微信公眾號的H5頁面獲取使用者資訊, 微信小程式中的access_token均

普通js使用ajax,公眾號授權網頁授權

微信授權的整個流程: 引導使用者進入授權頁面同意授權,獲取code 通過code換取網頁授權access_token(與基礎支援中的access_token不同) 如果需要,開發者可以重新整理網頁授權access_token,避免過期 通過網頁授權access_tok

vue腳手架,公眾號授權網頁授權

如果使用者在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。 首先我做了一個H5小專案,然後申請公眾號,然後在【自定義選單】中輸入想填寫的,公眾號選單名稱,以及頁面地址: 然後,我們在我們的前端頁面寫呼叫伺服器介面,得到授權。當然