zoukankan      html  css  js  c++  java
  • 第三方网站集成微信开放平台API实现微信登录功能

    1.OAuth2.0

    网站应用微信登录是基于OAuth2.0协议标准构建的微信授权登录系统。

    建议开发前可以花半个小时去了解以下OAuth2.0相关的介绍,本人之前的博客有介绍OAuth2的。它是目前比较流行的开放授权协议,许多第三方平台集成QQ,微信或微博等都是使用这个协议,这个协议包括三个角色:用户,服务提供方,服务消费方。服务消费方会引导用户到服务提供方进行登录,并获取用户在服务提供方存储的信息,那么相应的服务提供方肯定会进行一些必要的安全认证,这个安全认证和授权流程需要三方共同参与:服务消费方(客户端或第三方网站)需要先注册到服务提供方,不然服务提供方“不认识”这个客户端,然后需要将用户引导至服务提供方的授权页面,服务提供方会让用户先登录,然后进行授权,授权的动作是用户完成的,用户可以选择授权或取消授权,一旦用户授权成功,服务消费方便可以通过服务提供方提供的合法访问令牌访问用户的信息了。

    2. 注册微信开放平台
    在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

    3. 微信授权流程:

    1)第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
    2)通过code参数加上AppID和AppSecret等,通过API换取access_token;
    3)通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    第一步:请求授权码

    第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
    https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识
    redirect_uri 请使用urlEncode对链接进行处理
    response_type 填code
    scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即
    state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

    请求示例

    登录一号店网站应用
    https://passport.yhd.com/wechat/login.do
    打开后,一号店会生成state参数,跳转到
    https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
    微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到
    https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e
    为了满足网站更定制化的需求,我们还提供了第二种获取code的方式,支持网站将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过JS将code返回给网站。
    JS微信登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到微信域下登录后再返回,提升微信登录的流畅性与成功率。 网站内嵌二维码微信登录JS实现办法:

    步骤1:在页面中先引入如下JS文件(支持https):

    http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
    

    步骤2:在需要使用微信登录的地方实例以下JS对象:

     var obj = new WxLogin({
     self_redirect:true,
     id:"login_container", 
     appid: "", 
     scope: "", 
     redirect_uri: "",
      state: "",
     style: "",
     href: ""
     });
    

    参数说明

    参数 是否必须 说明
    self_redirect true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。
    id 第三方页面显示二维码的容器id
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
    redirect_uri 重定向地址,需要进行UrlEncode
    state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
    style 提供"black"、"white"可选,默认为黑色文字描述。详见文档底部FAQ
    href 自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ

    这里面有个很重要的参数:回调的url, 请确保回调的URL的域名是申请过微信认证的,否则回调的时候会失败。这个回调的URL干嘛用的呢,就是用户授权成功后,微信会将授权码作为参数,回调你之前设置的URL,然后你就在这个URL里面去接收这个CODE。为啥不直接返回呢,还要这么麻烦去回调,当然是出于安全考虑了,直接返回到客户端信息容易泄露,微信也不好控制,微信自己去call你的接口就不会,首先你这个接口肯定是通过审核的,其次这个信息不会让其他用户看见,直接从微信到你的服务器。

    好了,拿到CODE之后,就可以进一步获取access token了。

    第二步:通过code获取access_token

    通过code获取access_token

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    secret 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
    code 填写第一步获取的code参数
    grant_type 填authorization_code

    返回说明

    正确的返回:

    { 
    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", 
    "scope":"SCOPE",
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    

    参数说明

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔
    unionid 当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。

    错误返回样例:

    {"errcode":40029,"errmsg":"invalid code"}
    

    刷新access_token有效期

    access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

    1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
    2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
    

    refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

    请求方法

    获取第一步的code后,请求以下链接进行refresh_token:

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识
    grant_type 填refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    返回说明

    正确的返回:

    { 
    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN", 
    "openid":"OPENID", 
    "scope":"SCOPE" 
    }
    

    参数说明

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

    错误返回样例:

    {"errcode":40030,"errmsg":"invalid refresh_token"}
    

    注意:

    1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
    2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
    3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。
    
    建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

    第三步:通过access_token调用接口

    获取access_token后,进行接口调用,有以下前提:

    1. access_token有效且未超时;
    2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

    对于接口作用域(scope),能调用的接口有以下:
    授权作用域(scope)    接口    接口说明
    snsapi_base    /sns/oauth2/access_token    通过code换取access_token、refresh_token和已授权scope
    snsapi_base    /sns/oauth2/refresh_token    刷新或续期access_token使用
    snsapi_base    /sns/auth    检查access_token有效性
    snsapi_userinfo    /sns/userinfo    获取用户个人信息

    其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。
    接口调用方法可查阅《微信授权关系接口调用指南》

    F.A.Q

        什么是授权临时票据(code)?
        答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。

        什么是授权作用域(scope)?
        答:授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应scope的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。

    只需三步,就能成功实现集成微信登录啦,更多内容可以浏览微信开放平台网站:

    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=

  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407126.html
Copyright © 2011-2022 走看看