如何给你的GPT网站加上微信登录

前言

最近做了一个 GPT 网站 支持 GPT3 / GPT4 / 文本生成图片 / 识别图片生成代码; 但是在做的过程中有很多同学问我为啥没有微信登录, 由于微信登录需要使用企业号去申请,针对我们这种个人用户其实很难,所以只能另辟蹊径了

先来看看效果

第一步扫码 第二步登录

前置准备

要想实现这种效果只需要准备一件事情: 注册一个个人的小程序,并完成服务https请求

注册完个人小程序之后再完成如下几件事情:

  1. 完成实名认证
  2. 自己的服务器申请 https 证书: 如果你的服务是部署在阿里云/腾讯云 可以直接使用免费的证书,确保服务请求是https的;
  3. 完成服务端域名配置: 登录仅小程序管理页面,在 [开发管理] => [服务器域名] 部分完成上述域名配置

完成如上三个步骤后就可以进入开发了。

技术方案

整体的方案如下:

  • 第一步:完成小程序登录二维码生成,临时零时id,透传给小程序;
  • 第二步: 前端页面基于零时id进行轮训状态,查询登录是否成功;
  • 第三步: 在小程序侧将 微信openid 获取到并临时临时id更新状态

1. 生成小程序登录二维码

此处以nodejs为例, 调用微信api获取到图片流,并转换成base64图片

typescript 复制代码
let WX_TOKEN = '';
/**
 * 获取微信accesstoken
 * @returns
 */
export async function getWXAccessToken(): Promise<string> {
  if (Date.now() < weixin_expire_time)
    return WX_TOKEN

  const data = await axios.get<{
    access_token: string
    expires_in: number
  }>('https://api.weixin.qq.com/cgi-bin/token', {
    params: {
      grant_type: 'client_credential',
      appid: APPID,
      secret: APP_SECRET,
    },
  })

  logger.info(`wx token is : ? ${data?.data?.access_token}`)

  WX_TOKEN = data?.data?.access_token
  //   比微信时间少20s
  weixin_expire_time = Date.now() + (data?.data?.expires_in - 20 || 0) * 1000
  return WX_TOKEN
}



/**
 * 获取微信小程序登录二维码
 * @param sign_id
 * @returns
 */
export async function getWXMinAppLoginQRCode(sign_id: string) {
  const token = await getWXAccessToken()
  // https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
  const res = await axios.post<Buffer>(`https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${token}`, {
    scene: sign_id,
    page: 'pages/login/login',
    // env_version: 'develop',
    check_path: false,
  }, {
    params: {
      access_token: token,
    },
    responseType: 'arraybuffer',
  })
  const buffer = res?.data as Buffer
  return `data:image/png;base64,${Buffer.from(buffer).toString('base64')}`
}

2. 微信小程序侧开发

微信小程序侧比较简单,获取到用户的昵称然后携带 临时id 调研服务端接口完成注册

ts 复制代码
 login(userInfo: any) {
    const that = this;
    if (!this.data.nickname) {
      wx.showToast({
        title: '请输入微信昵称',
        icon: 'none'
      })
      return;
    }
    wx.login({
      success(data) {
        const openCode = data.code;
        wx.showLoading({
          title: '登录中..'
        })
        wx.request({
          url: '你的接口地址',
          data: {
            // ... 你的参数
            temp_id: this.data.scene, // 在onLoad中使用 options.scene 获取
            name: this.data.nickname
          },
          method: 'POST',
          success(res) {

            wx.hideLoading();
            wx.showToast({
                    title: '登录成功',
                  })
              },
          fail() {
            wx.hideLoading()
          }
        })
      },
      fail() {
        wx.showToast({
          title: '获取登录凭证失败',
          icon: 'none'

        })
      }
    })
  },

3. 完成微信 openId 获取并注册

ts 复制代码
/**
 * 获取微信登录唯一id
 * @param js_code 就是上面的openCode
 * @returns
 */
export async function getWXOpenId(js_code: string) {
  const res = await axios.get<{
    openid: string
    unionid: string
  }>('https://api.weixin.qq.com/sns/jscode2session', {
    params: {
      grant_type: 'authorization_code',
      appid: APPID,
      secret: APP_SECRET,
      js_code,
    },
  })
  return res?.data?.openid
}

最后

至此一个简单的微信登录即可完成,有需要的同学可以在这里体验一下 免费 GPT 使用, 支持 GPT3 / GPT4 / 文本生成图片 / 识别图片生成代码;

AI Vision AI Image
相关推荐
G佳伟10 分钟前
‌微信小程序Webview转发页面空白问题解决方案‌
微信小程序·小程序
颜酱28 分钟前
package.json 配置指南
前端·javascript·node.js
todoitbo34 分钟前
基于 DevUI MateChat 搭建前端编程学习智能助手:从痛点到解决方案
前端·学习·ai·状态模式·devui·matechat
oden40 分钟前
SEO听不懂?看完这篇你明天就能优化网站了
前端
黑客思维者40 分钟前
ChatGPT软件开发提示词库:开发者常用150个中文提示词分类与应用场景设计
人工智能·chatgpt·提示词·软件开发
IT_陈寒1 小时前
React性能优化:这5个Hooks技巧让我减少了40%的重新渲染
前端·人工智能·后端
Sunhen_Qiletian1 小时前
《Python开发之语言基础》第六集:操作文件
前端·数据库·python
珑墨1 小时前
【唯一随机数】如何用JavaScript的Set生成唯一的随机数?
开发语言·前端·javascript·ecmascript
L***d6701 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
少云清1 小时前
【功能测试】6_Web端抓包 _Fiddler抓包工具的应用
前端·功能测试·fiddler