欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

微信授權全鏈路打通指南(小程序、網頁、開放平臺、企業微信授權)

freeflydom
2024年12月17日 15:49 本文熱度 517

近期,我在致力于打造自己的小程序產品時,迎來了一項關鍵性的進展——微信相關授權流程的完整實現。從用戶登錄到權限獲取,我們細致入微地梳理并實現了每一項授權機制,確保了用戶體驗的流暢與安全。

微信小程序授權

授權流程:

  1. 用戶在小程序中點擊登錄按鈕,觸發 wx.login() 獲取 code
  2. 小程序將 code 發送到后端服務器。
  3. 后端通過微信接口 jscode2session 使用 code 獲取 session_key 和 openid
  4. 后端返回 session_key 和 openid 給前端。
  5. 前端獲取 session_key 和 openid,使用 wx.getUserProfile() 獲取用戶信息(如昵稱、頭像等)。
  6. 如果需要,可以將用戶信息(如昵稱、頭像等)發送到后端進行存儲或處理。
wx.login({
  success: function(res) {
    if (res.code) {
      // 將 code 發送到服務器
      wx.request({
        url: 'https://localhost:8080/api/login',
        method: 'POST',
        data: {
          code: res.code
        },
        success: function(response) {
          // 處理服務器返回的數據
          console.log(response.data);
        }
      });
    }
  }
});

下面是Nest 偽代碼實現

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
interface MiniProgramLoginResponse {
  openid: string;
  session_key: string;
  unionid?: string;
  errcode?: number;
  errmsg?: string;
}
@Injectable()
  export class MiniProgramAuthService {
    constructor(private readonly httpService: HttpService) {}
    async login(code: string): Promise<MiniProgramLoginResponse> {
      const url = 'https://api.weixin.qq.com/sns/jscode2session';
      try {
        const response = await firstValueFrom(
          this.httpService.get(url, {
            params: {
              appid: process.env.MINIPROGRAM_APPID,
              secret: process.env.MINIPROGRAM_APPSECRET,
              js_code: code,
              grant_type: 'authorization_code'
            }
          })
        );
        return response.data;
      } catch (error) {
        throw new Error('小程序登錄失敗');
      }
    }
    // 解密用戶敏感信息
    async decryptUserInfo(sessionKey: string, encryptedData: string, iv: string) {
      // 實現微信小程序用戶信息解密邏輯
      // 通常需要使用第三方加密庫如 crypto-js
    }
  }

微信網頁授權(OAuth 2.0)

網頁授權是通過微信官方提供的OAuth2.0認證方式,使第三方網站或應用能夠獲取用戶基本信息,實現用戶身份識別。

授權流程

  1. 發起授權
    • 用戶點擊登錄/授權按鈕
    • 生成授權鏈接
    • 跳轉至微信授權頁面
  2. 用戶確認
    • 用戶選擇是否授權
    • 確認后獲取臨時授權碼 code
  3. 換取 Access Token
    • 服務端使用 code 換取 access_token
    • 獲取用戶的 openid 和 access_token
  4. 獲取用戶信息
    • 使用 access_token 和 openid
    • 調用微信接口獲取用戶詳細信息
  5. 系統內部處理
    • 創建或更新用戶信息
    • 生成系統內部登錄態
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
// 用戶授權信息接口定義
interface WechatUserInfo {
  openid: string;      // 用戶唯一標識
  nickname: string;    // 用戶昵稱
  sex: number;         // 用戶性別
  province: string;    // 省份
  city: string;        // 城市
  country: string;     // 國家
  headimgurl: string;  // 頭像地址
  privilege: string[]; // 用戶特權信息
  unionid?: string;    // 開放平臺唯一標識
}
@Injectable()
export class WebAuthService {
  constructor(private readonly httpService: HttpService) {}
  // 生成授權鏈接
  generateAuthUrl(redirectUri: string, scope: 'snsapi_base' | 'snsapi_userinfo' = 'snsapi_userinfo') {
    const baseUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize';
    const params = new URLSearchParams({
      appid: process.env.WECHAT_APPID,
      redirect_uri: redirectUri,
      response_type: 'code',
      scope: scope,
      state: 'STATE#wechat_redirect'  // 自定義參數,用于回傳
    });
    
    return `${baseUrl}?${params}#wechat_redirect`;
  }
  // 獲取 Access Token
  async getAccessToken(code: string) {
    const url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
    
    try {
      const response = await firstValueFrom(
        this.httpService.get(url, {
          params: {
            appid: process.env.WECHAT_APPID,
            secret: process.env.WECHAT_APPSECRET,
            code: code,
            grant_type: 'authorization_code'
          }
        })
      );
      return response.data;
    } catch (error) {
      throw new Error('獲取 Access Token 失敗');
    }
  }
  // 獲取用戶信息
  async getUserInfo(accessToken: string, openid: string): Promise<WechatUserInfo> {
    const url = 'https://api.weixin.qq.com/sns/userinfo';
    
    try {
      const response = await firstValueFrom(
        this.httpService.get(url, {
          params: {
            access_token: accessToken,
            openid: openid,
            lang: 'zh_CN'
          }
        })
      );
      return response.data;
    } catch (error) {
      throw new Error('獲取用戶信息失敗');
    }
  }
}

微信開放平臺授權

特點:

  • 適用于第三方應用
  • 支持移動應用、網站應用等
  • 需要開發者資質認證
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
// 定義開放平臺授權響應接口
interface OpenPlatformAuthResponse {
  access_token: string;    // 接口調用憑證
  expires_in: number;      // access_token 過期時間
  refresh_token: string;   // 刷新 token
  openid: string;          // 授權用戶唯一標識
  scope: string;           // 用戶授權的作用域
  unionid: string;         // 開放平臺唯一標識
}
@Injectable()
export class OpenPlatformAuthService {
  constructor(private readonly httpService: HttpService) {}
  /**
   * 獲取 access_token
   * @param code 授權碼
   * @returns 授權響應信息
   */
  async getAccessToken(code: string): Promise<OpenPlatformAuthResponse> {
    // 微信獲取 access_token 的接口地址
    const url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
    
    try {
      // 使用授權碼換取 access_token
      const response = await firstValueFrom(
        this.httpService.get(url, {
          params: {
            // 從環境變量讀取開放平臺 AppID
            appid: process.env.OPEN_PLATFORM_APPID,
            // 從環境變量讀取開放平臺密鑰
            secret: process.env.OPEN_PLATFORM_APPSECRET,
            // 授權碼
            code: code,
            // 授權類型,固定值
            grant_type: 'authorization_code'
          }
        })
      );
      return response.data;
    } catch (error) {
      // 捕獲并拋出授權失敗的錯誤
      throw new Error('開放平臺授權失敗');
    }
  }
  /**
   * 刷新 access_token
   * @param refreshToken 刷新 token
   * @returns 新的授權信息
   */
  async refreshAccessToken(refreshToken: string) {
    // 微信刷新 access_token 的接口地址
    const url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token';
    
    try {
      // 使用 refresh_token 換取新的 access_token
      const response = await firstValueFrom(
        this.httpService.get(url, {
          params: {
            // 開放平臺 AppID
            appid: process.env.OPEN_PLATFORM_APPID,
            // 授權類型,固定值
            grant_type: 'refresh_token',
            // 用于刷新的 token
            refresh_token: refreshToken
          }
        })
      );
      return response.data;
    } catch (error) {
      // 捕獲并拋出刷新 Token 失敗的錯誤
      throw new Error('刷新 Token 失敗');
    }
  }
}

企業微信授權

企業微信授權是針對企業內部應用和員工的身份認證機制,提供更嚴格和精細的權限控制。

特點:

  • 主要面向企業內部應用
  • 更強的權限控制
  • 安全性更高

授權流程

  1. 發起授權
    • 員工訪問企業內部應用
    • 觸發登錄機制(掃碼/輸入)
    • 生成企業微信授權鏈接
  2. 身份驗證
    • 跳轉企業微信登錄頁
    • 員工確認身份
    • 獲取臨時授權碼
  3. 換取用戶信息
    • 服務端使用 code 換取用戶標識
    • 獲取 userid
    • 調用接口獲取用戶詳細信息
  4. 系統內部處理
    • 驗證員工身份
    • 檢查權限狀態
    • 生成系統內部登錄態
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';
// 定義企業微信授權響應接口
interface EnterpriseWechatAuthResponse {
  access_token: string;    // 企業接口調用憑證
  expires_in: number;      // access_token 過期時間
  user_ticket?: string;    // 用戶票據(可選)
  user_info?: {
    userid: string;        // 企業成員 ID
    name: string;          // 成員名稱
    department: number[];  // 部門 ID 列表
  };
}
@Injectable()
export class EnterpriseWechatAuthService {
  constructor(private readonly httpService: HttpService) {}
  /**
   * 獲取企業微信用戶信息
   * @param code 臨時授權碼
   * @returns 用戶信息和 access_token
   */
  async getUserInfo(code: string): Promise<EnterpriseWechatAuthResponse> {
    // 獲取企業 access_token 的接口地址
    const tokenUrl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken';
    // 獲取用戶信息的接口地址
    const userInfoUrl = 'https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo';
    // 第一步:獲取企業 access_token
    // 需要使用企業 ID 和應用的秘鑰
    const tokenResponse = await firstValueFrom(
      this.httpService.get(tokenUrl, {
        params: {
          // 從環境變量讀取企業 ID
          corpid: process.env.ENTERPRISE_CORPID,
          // 從環境變量讀取企業應用秘鑰
          corpsecret: process.env.ENTERPRISE_CORPSECRET
        }
      })
    );
    // 從響應中提取 access_token
    const accessToken = tokenResponse.data.access_token;
    // 第二步:使用 access_token 和臨時授權碼獲取用戶信息
    const userInfoResponse = await firstValueFrom(
      this.httpService.get(userInfoUrl, {
        params: {
          // 企業 access_token
          access_token: accessToken,
          // 臨時授權碼
          code: code
        }
      })
    );
    return userInfoResponse.data;
  }
}

各個平臺授權小結

授權類型個人是否可用是否收費主要適用場景
網頁授權免費網站、H5應用
小程序授權免費小程序登錄、開放平臺
公眾號授權部分可用免費+增值服務公眾號相關應用(服務號、訂閱號)
企業微信有費用企業內部協作

?轉自https://www.cnblogs.com/HaiJun-Aion/p/18609286

該文章在 2024/12/17 15:49:13 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved