第三方微信登录_微信第三方登录,没有微信时怎么登录 - CSDN
精华内容
参与话题
  • 微信第三方登录接口

    万次阅读 2018-05-08 17:26:43
    随着手机微信的崛起,腾讯发布的微信联登确实很诱惑pc端的伙伴们,现在就说说在pc端用微信扫一扫实现微信第三方登陆的方式。 第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请)第二步:生成扫描...
    随着手机微信的崛起,腾讯发布的微信联登确实很诱惑pc端的伙伴们,现在就说说在pc端用微信扫一扫实现微信第三方登陆的方式。

      第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请)

    第二步:生成扫描二维码,获取code
    https://open.weixin.qq.com/connect/qrconnect?appid=AppID&redirect_uri=http://www.baidu.com&response_type=code&scope=snsapi_login&state=2014#wechat_redirect

    第三步:通过code获取access_token
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=AppID&secret=AppSecret&code=00294221aeb06261d5966&grant_type=authorization_code

    第四步:因接口频率有次数限制,如果需要,刷新access_token
    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=AppID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

        第步:通过access_token和openid获取用户的基础信息,包括头像、昵称、性别、地区
    https://api.weixin.qq.com/sns/userinfo?access_token=bezXEiiBSKSxW0eoblIewFNHqAG-PyW9OqI_L81E4ZCi2cFpfoJTyQc0xKlPPCtqK1kLJfiRbVrpoOVLw7fjpqh52bn7C68SHa2HSgYsVPXZPvJvtayDa57-_7TeHYw&openid=o39YsbmuV_bIPGpj1MTe


    这是接口在线调试工具:
    http://mp.weixin.qq.com/debug/
    这是错误码说明文档:
    http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html 
    另外需要特别注意
    如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求,文档:
    http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html


    微信网页第三方登录原理


    微信开放平台和公众平台的区别

    1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能。目前大多数微信通过认证之后,都在做这个事情。

    mp.weixin.qq.com


    2.开放平台面向的开发者和第三方独立软件开发商。我觉得开发平台最大的开放就是微信登录。当年腾讯没有花大力气去做统一登录这个事情,导致目前各个网站都要弄一套登录机制。好在他们现在认清了局势。开发者或软件开发商,通过微信开放提供的平台和接口,可以开发适合企业的电子商务网站,扫描二维码进去一个游戏界面,然后去购买商品等。当然后续开放平台要开放支付接口,那么类似口袋通这种软件开发厂商,就可以为大型,中小企业提供微信小店这种服务和软件了。

    open.weixin.qq.com

     

    公众平台就是服务号订阅号的管理开发后台。

    开发平台说得通俗一点就是实现手机里边安装软件的内容一键分享朋友圈;

    下面的第三方登陆就是依托于开放平台(open.weixin.qq.com)的功能

     

    准备工作

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

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

    授权流程说明

    微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

    微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

      1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

      2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

      3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    获取access_token时序图:

    技术分享

    第一步:请求CODE

    第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(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进行校验
    返回说明

    用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数

    redirect_uri?code=CODE&state=STATE

    若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数

    redirect_uri?state=STATE

    请求示例

    登录一号店网站应用

    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):

    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>

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

                              var obj = new WxLogin({

                                  id:"login_container", 

                                  appid: "", 

                                  scope: "", 

                                  redirect_uri: "",

                                  state: "",

                                  style: "",

                                  href: ""

                                });

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

    错误返回样例:

    {"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 /sns/oauth2/refresh_token 刷新或续期access_token使用 /sns/auth 检查access_token有效性 snsapi_userinfo /sns/userinfo 获取用户个人信息

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

    接口调用方法可查阅《微信授权关系接口调用指南》

    F.A.Q
    1. 什么是授权临时票据(code)?

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

     

    2. 什么是授权作用域(scope)?

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

    3. 网站内嵌二维码微信登录JS代码中style字段作用?

    答:第三方页面颜色风格可能为浅色调或者深色调,若第三方页面为浅色背景,style字段应提供"black"值(或者不提供,black为默认值),则对应的微信登录文字样式为黑色。相关效果如下:

    技术分享 技术分享

    若提供"white"值,则对应的文字描述将显示为白色,适合深色背景。相关效果如下:

    技术分享 技术分享

    4.网站内嵌二维码微信登录JS代码中href字段作用?

    答:如果第三方觉得微信团队提供的默认样式与自己的页面样式不匹配,可以自己提供样式文件来覆盖默认样式。举个例子,如第三方觉得默认二维码过大,可以提供相关css样式文件,并把链接地址填入href字段

    .impowerBox .qrcode {width: 200px;}
    .impowerBox .title {display: none;}
    .impowerBox .info {width: 200px;}
    .status_icon {display:none}
    .impowerBox .status {text-align: center;} 

    相关效果如下:

    技术分享 技术分享

    通过code获取access_token
    接口说明

    通过code获取access_token的接口。

    请求说明

    http请求方式: GET

    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" 
    }

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

    错误返回样例:

    {
    "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失效的后,需要用户重新授权。

    请求方法

    使用/sns/oauth2/access_token接口获取到的refresh_token进行以下接口调用:

    http请求方式: GET

    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"
    }

    接口说明

    检验授权凭证(access_token)是否有效

    请求说明

    http请求方式: GET

    https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明
    参数 是否必须 说明 access_token 是 调用接口凭证 openid 是 普通用户标识,对该公众帐号唯一
    返回说明

    正确的Json返回结果:


    "errcode":0,"errmsg":"ok"
    }

    错误的Json返回示例:


    "errcode":40003,"errmsg":"invalid openid"
    }

    获取用户个人信息(UnionID机制)
    接口说明

    此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

    请求说明

    http请求方式: GET

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明
    参数 是否必须 说明 access_token 是 调用凭证 openid 是 普通用户的标识,对当前开发者帐号唯一
    返回说明

    正确的Json返回结果:


    "openid":"OPENID",
    "nickname":"NICKNAME",
    "sex":1,
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege":[
    "PRIVILEGE1", 
    "PRIVILEGE2"
    ],
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"

    }

    参数 说明 openid 普通用户的标识,对当前开发者帐号唯一 nickname 普通用户昵称 sex 普通用户性别,1为男性,2为女性 province 普通用户个人资料填写的省份 city 普通用户个人资料填写的城市 country 国家,如中国为CN headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

    错误的Json返回示例:


    "errcode":40003,"errmsg":"invalid openid"
    }

    调用频率限制
    接口名 频率限制 通过code换取access_token 1万/分钟 刷新access_token 5万/分钟 获取用户基本信息 5万/分钟 
    展开全文
  • 第三方登录---微信登录

    万次阅读 2018-02-06 16:20:36
    由于某一个误导,误打误撞的实现了微信登录...(其实是要实现第三方平台授权的,下一篇文档会讲解下第三方平台授权) 第三方登录多么常见我就不多说了,想要实现第三方登录首先需要在第三方平台(QQ、新浪微博、微信...
    由于某一个误导,误打误撞的实现了微信登录...(其实是要实现第三方平台授权的,下一篇文档会讲解下第三方平台授权)
    

    第三方登录多么常见我就不多说了,想要实现第三方登录首先需要在第三方平台(QQ、新浪微博、微信…)注册平台账号,然后配置…在此我就拿微信登录做一个简单的例子。

    在此只写一个简单的小demo,是想告诉大家这个第三方登录其实很简单,没有想象的那么难。大家还是要多看官方文档。
    

    首先也是最重要的:微信开放平台注册账号(收费di~)
    注册完毕,去管理中心,如下:
    这里写图片描述

    有五个功能:移动应用、网站应用、公众账号、小程序、第三方平台

    此篇文章主要说得是微信登录,所以主要讲一下网站应用,其他的功能大家百度一下哈
    >>>官方文档>>>

    看到官方文档这么简短,就可以知道微信登录的实现很简单啦

    下面我直接贴我测试的代码(前端实现代码):

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>第三方登录---微信登录</title>
    </head>
    <body>
    
    <div id="login_container">
    这是装二维码的容器div
    </div>
    
    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
    <script type="text/javascript">
    //id和scope不用改、appid和redirect_uri改为自己的
      var obj = new WxLogin({
                               id:"login_container", 
                               appid: "***************", 
                               scope: "snsapi_login", 
                redirect_uri:"http%3A%2F%2Fwww.baidu.cn",
                               state: "",
                               style: "black",
                               href: ""
                             });
    
    </script>
    </body>
    </html>    

    效果:这里写图片描述

    然后嵌到前端页面就可以了!

    还有一种方式是跳转到二维码页面再跳转回来,那种方式估计很少用吧。。。因此我就没有写demo。

    用户扫了二维码后,我们可以获得code。然后通过code获取access_token,然后再去调用接口获取用户信息。

    在此只写一个简单的小demo,是想告诉大家这个第三方登录其实很简单,没有想象的那么难。大家还是要多看官方文档。
    

    再往下就去看文档吧,我再写也不如官网详细啦
    >>>官方文档>>>

    展开全文
  • 第三方App接入微信登录 解读

    千次阅读 2018-06-10 14:19:29
    最近在做一个微信登录功能,发现腾讯的API文档写的实在是让人摸不着头脑,也没有搜到很详细的能让人参考的文章,借此把自己的一点儿使用心得与大家分享,欢迎指正其中的不足之处,谢谢!准备工作1.在微信开放平台...

    最近在做一个微信登录功能,发现腾讯的API文档写的实在是让人摸不着头脑,也没有搜到很详细的能让人参考的文章,借此把自己的一点儿使用心得与大家分享,欢迎指正其中的不足之处,谢谢!

    准备工作

    1.在微信开放平台https://open.weixin.qq.com/注册成为开发者。

    2.在“管理中心”中创建一个移动应用,需“应用名称、简介、及28*28和108*108的PNG图片各一张,且大小不超过300k”,点击下一步,需“应用官网地址,应用签名及包名”等信息,然后即可提交审核。 
    说明: 
    应用签名:可在微信开发平台的资源中心》》资源下载》》中下载“签名生成工具”,用户获取已经安装到手机的第三方应用的签名。输入应用包名,即可获得该应用的签名值。

    3.提交审核后,在7个工作日内腾讯将给出审核结果。(通常较快,几个小时就可反馈结果)

    微信登录接入

    微信登录遵循协议Aouth2.0中的授权码模式

    我们来看一下Aouth2.0中的授权码模式是怎么定义的:

    授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与”服务提供商”的认证服务器进行互动。 
    它的步骤如下:

    (A)用户访问客户端,后者将前者导向认证服务器。

    (B)用户选择是否给予客户端授权。

    (C)假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。

    (D)客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

    (E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)

    微信登录的官方文档将微信登录分为3个步骤:

    第一步.请求code

    {
        // send oauth request 
         Final SendAuth.Req req = new SendAuth.Req();
         req.scope = "snsapi_userinfo";
         req.state = "wechat_sdk_demo_test";
         api.sendReq(req);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录),如下图:

    1.如果微信授权页不显示,请检查你的APP签名是否和你在腾讯开放平台的APP签名一致,不一致可修改腾讯开放平台中的APP签名,修改后重装微信或清除微信数据后重试。

    2.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge,则新的包名为:net.sourceforge.wxapi),此处应注意包名不要弄错,新增类的名字必须为WXEntryActivity。

    返回说明 
    用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。回调WXEntryActivity中的onResp(BaseResp resp)方法,如下:

    @Override
        public void onResp(BaseResp resp) {
            int errorCode = resp.errCode;
            switch (errorCode) {
            case BaseResp.ErrCode.ERR_OK:
                //用户同意
                String code = ((SendAuth.Resp) resp).code;
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //用户拒绝
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //用户取消
                break;
            default:
                break;
            }
            ToastUtil.showMessageLong(this, resp.errStr);
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    客户端收到授权码后,向自己的服务器发起登录请求,并附带收到的授权码。

    服务端收到登录请求,向微信开放平台请求获取access_token,微信开放平台返回Json字符串:

    第二步:通过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

    private String getAccessToken(String code) {
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
            URI uri = URI.create(url);
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(uri);
    
            HttpResponse response;
            try {
                response = client.execute(get);
                if (response.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
    
                    BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
                    StringBuilder sb = new StringBuilder();
    
                    for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                        sb.append(temp);
                    }
    
                    JSONObject object = new JSONObject(sb.toString().trim());
                    accessToken = object.getString("access_token");
                    openID = object.getString("openid");
                    refreshToken = object.getString("refresh_token");
                    expires_in = object.getLong("expires_in");
                    return accessToken;
                }
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return null;
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    参数说明

    参数        是否必须        说明 
    appid       是        应用唯一标识,在微信开放平台提交应用审核通过后获得
    
    secret      是      应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
    
    code        是       填写第一步获取的code参数
    
    grant_type  是      填authorization_code回说明**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    正确的返回:

    { 
    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", 
    "scope":"SCOPE",
    "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
        参数                              说明
    access_token                    接口调用凭证
    expires_in  access_token        接口调用凭证超时时间,单位(秒)
    refresh_token                   用户刷新access_token
    openid                          授权用户唯一标识
    scope                           用户授权的作用域,使用逗号(,)分隔
    unionid          只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    错误返回样例:
    {"errcode":40029,"errmsg":"invalid code"}
    • 1
    • 2

    服务端收到返回的access_token,将access_token,expires_in,access_token是否有效 等数据返回给客户端,客户端成功登录

    客户端可利用已有的access_token获取微信用户信息

    第三步:通过access_token调用接口

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

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

    对于接口作用域(scope),能调用的接口有以下:

    授权作用域(scope)             接口                接口说明
    snsapi_base       /sns/oauth2/access_token     通过code换取              access_token、refresh_token和已授权scope
                        /sns/oauth2/refresh_token  刷新或续期access_token使用
                        /sns/auth                  检查access_token有效性
    snsapi_userinfo    /sns/userinfo               获取用户个人信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    以获取用户信息为例:

    private void getUserInfo() {
            if (isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in) {
                String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openID;
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(URI.create(uri));
                try {
                    HttpResponse response = client.execute(get);
                    if (response.getStatusLine().getStatusCode() == 200) {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
                        StringBuilder builder = new StringBuilder();
                        for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                            builder.append(temp);
                        }
                        JSONObject object = new JSONObject(builder.toString().trim());
                        String nikeName = object.getString("nickname");
                    }
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    微信重复登录

    假设用户已经获得授权,则下次登录时只需要验证access_token是否有效,无效则重新获取授权,有效则无需重新获得授权。

    1.用户向自己的服务器请求登录,登录方式为微信登录,附带上次登录返回的的access_token

    2.服务器收到用户的登录请求,向微信开放平台发送access_token是否有效的验证请求如下

    private boolean isAccessTokenIsInvalid() {
            String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;
            URI uri = URI.create(url);
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(uri);
            HttpResponse response;
            try {
                response = client.execute(get);
                if (response.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
    
                    BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
                    StringBuilder sb = new StringBuilder();
    
                    for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                        sb.append(temp);
                    }
                    JSONObject object = new JSONObject(sb.toString().trim());
                    int errorCode = object.getInt("errcode");
                    if (errorCode == 0) {
                        return true;
                    }
                }
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return false;
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    返回说明

    正确的Json返回结果:
    { 
    "errcode":0,"errmsg":"ok"
    }
    错误的Json返回示例:
    { 
    "errcode":40003,"errmsg":"invalid openid"
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果access_token有效,服务端将信息返回给客户端,客户端成功登录。

    如果access_token无效,服务端向微信开放平台发送刷新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失效的后,需要用户重新授权。

    private void refreshAccessToken() {
            String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + ShareUtil.APP_ID + "&grant_type=refresh_token&refresh_token="
                    + refreshToken;
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(URI.create(uri));
            try {
                HttpResponse response = client.execute(get);
                if (response.getStatusLine().getStatusCode() == 200) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
                    StringBuilder builder = new StringBuilder();
                    for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
                        builder.append(temp);
                    }
                    JSONObject object = new JSONObject(builder.toString().trim());
                    accessToken = object.getString("access_token");
                    refreshToken = object.getString("refresh_token");
                    openID = object.getString("openid");
                    expires_in = object.getLong("expires_in");
                }
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    返回说明

    正确的返回:
    { 
    "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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.服务端获取到新的access_token等信息,并返回给客户端,客户端成功登录或者重新获取授权。

    展开全文
  • 第三方登陆(一)微信登陆

    千次阅读 2019-05-02 16:04:19
    现在微信越来越流行,我们开发的app或者网站如果想从微信导流的话可以选择微信登陆。...微信公众号(公众平台) 微信开放平台 1.我们需要在微信公众号(公众平台)账号 地址是:https://open.wei...

    现在微信越来越流行,我们开发的app或者网站如果想从微信导流的话可以选择微信登陆。

    现在这里介绍怎样集成微信登陆功能

    首先我们要做好前期工作,就是注册账号,目的就是获取appID 和appsecret ,并设置好回调地址,下面介绍两种注册方式。

    我们有两种注册方式:

    1. 微信公众号(公众平台)
    2. 微信开放平台

    1.我们需要在微信公众号(公众平台)账号

    地址是:https://open.weixin.qq.com/

    下面是我们注册的页面:

     

    注册成功之后我们就可以创建应用了:

    这里我们就可以取得设置回调地址和获取appID 和 appsecret

     

    2.如果你想测试,我们可以申请微信开放平台

    这里我们就不多说,下面我们也可以申请测试账号http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

     

     

    这是我们就可以获取appID 和 appsecret

    最后我们要设置回调地址,这里就是我们的域名,并不加http:// 或 http:// 只是填写域名就可以:

    点击网页授权获取用户信息 最右侧的修改就可以填写回调地址:

    之后我们需要开发者认证,这里要掏钱了:

     

    功能的集成

    前期的工作准备好以后我们就可看集成的文档了:

    文档的地址是: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

    具体流程图如下:

    具体而言,网页授权流程分为四步:

    • 1、引导用户进入授权页面同意授权,获取code
    • 2、通过code换取网页授权access_token(与基础支持中的access_token不同)
    • 3、如果需要,开发者可以刷新网页授权access_token,避免过期
    • 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

    下面就是我们的代码部分了:

    maven依赖:

    <dependency>
          <groupId>commons-httpclient</groupId>
          <artifactId>commons-httpclient</artifactId>
          <version>3.0.1</version>
       </dependency>
    
       <dependency>
       	<groupId>org.springframework.boot</groupId>
       	<artifactId>spring-boot-devtools</artifactId>
       </dependency>
       <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
    </dependency>
    
     <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
      </dependency>
    
     <dependency>
          <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.2</version>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.38</version>
        </dependency>
    

    配置application.properties:

    ####微信的登陆密钥#######
    #微信开放平台创建的网站应用的appid 和 appsecret
    appid=
    appsecret=
    scope=snsapi_login
    #微信开放平台创建的网站 设置的授权回调域
    callBack=

     

    scope部分我们要特别注意的是: 

     微信公众号(公众平台) 和 微信开放平台 是两码事。公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知;后者是需要用户确认同意的。

    但是微信开放平台(https://open.weixin.qq.com/) 就可以获取snsapi_login这种scope。坑爹的是,公众平台的认证和开放平台的认证是独立的,你如果想获取snsapi_login,还需要重新注册开放平台,交300块钱认证。

    如果你只是想实现微信扫二维码登录的话,其实snsapi_base 也足够了,因为它可以获取到用户的openid,你可以之后用来和自己数据库中作比对。

     

    下面是工具类,HttpRequestUtils.java:

    package com.haihua.haihua.Utils;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    /**
     * Created by liuzp on 2018/5/10.
     */
    public class HttpRequestUtils {
    
        private static  Logger log = LoggerFactory.getLogger(HttpRequestUtils.class);
    
        private static ObjectMapper objectMapper = new ObjectMapper();
    
        /**
         * http请求工具类,post请求
         *
         * @param url    url
         * @param params 参数值 仅支持String和list两种类型
         * @return
         * @throws Exception
         */
        public static String httpPost(String url, Map<String, Object> params) throws Exception {
            DefaultHttpClient defaultHttpClient = null;
            BufferedReader bufferedReader = null;
            try {
                defaultHttpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setHeader("Content-Type", "application/json;charset=ut-8");
                if (params != null) {
                    //转换为json格式并打印,不需要的你们可以不要
                    String jsonParams = objectMapper.writeValueAsString(params);
                    log.info("参数值:{}", jsonParams);
                    HttpEntity httpEntity = new StringEntity(jsonParams, "utf-8");
                    httpPost.setEntity(httpEntity);
                }
                HttpResponse httpResponse = defaultHttpClient.execute(httpPost);
                if (httpResponse.getStatusLine().getStatusCode() != 200) {
                    String errorLog="请求失败,errorCode:"+httpResponse.getStatusLine().getStatusCode();
                    log.info(errorLog);
                    throw new Exception(url+errorLog);
                }
                //读取返回信息
                String output;
                bufferedReader=new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(),"utf-8"));
                StringBuilder stringBuilder=new StringBuilder();
                while ((output=bufferedReader.readLine())!=null){
                    stringBuilder.append(output);
                }
                return stringBuilder.toString();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                throw e;
            }catch (IOException e){
                e.printStackTrace();
                throw e;
            }finally {
                if(defaultHttpClient!=null)
                    defaultHttpClient.getConnectionManager().shutdown();
                if(bufferedReader!=null)
                    bufferedReader.close();
            }
        }
    
        /**
         * http请求工具类,get请求
         * @param url
         * @param params
         * @param resonseCharSet
         * @return
         * @throws Exception
         */
        public static String httpGet(String url, Map<String, Object> params,String ...resonseCharSet) throws Exception {
            DefaultHttpClient defaultHttpClient = null;
            BufferedReader bufferedReader = null;
            try {
                defaultHttpClient = new DefaultHttpClient();
                if(params!=null){
                    StringBuilder stringBuilder=new StringBuilder();
                    Iterator<String> iterator=params.keySet().iterator();
                    String key;
                    while (iterator.hasNext()){
                        key=iterator.next();
                        Object val=params.get(key);
                        if(val instanceof List){
                            List v= (List) val;
                            for (Object o:v){
                                stringBuilder.append(key).append("=").append(o.toString()).append("&");
                            }
                        }else{
                            stringBuilder.append(key).append("=").append(val.toString()).append("&");
                        }
                    }
                    stringBuilder.deleteCharAt(stringBuilder.length()-1);
                    url=url+"?"+stringBuilder.toString();
                    log.info("url:{}",url);
                }
                HttpGet httpGet = new HttpGet(url);
                httpGet.setHeader("Content-Type", "application/json;charset=ut-8");
                HttpResponse httpResponse = defaultHttpClient.execute(httpGet);
                if (httpResponse.getStatusLine().getStatusCode() != 200) {
                    String errorLog="请求失败,errorCode:"+httpResponse.getStatusLine().getStatusCode();
                    log.info(errorLog);
                    throw new Exception(url+errorLog);
                }
                //读取返回信息
                String charSet="utf-8";
                if(resonseCharSet!=null && resonseCharSet.length>0)
                    charSet=resonseCharSet[0];
                String output;
                bufferedReader=new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(),charSet));
    
                StringBuilder dataBuilder=new StringBuilder();
                while ((output=bufferedReader.readLine())!=null){
                    dataBuilder.append(output);
                }
                return dataBuilder.toString();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                throw e;
            }catch (IOException e){
                e.printStackTrace();
                throw e;
            }finally {
                if(defaultHttpClient!=null)
                    defaultHttpClient.getConnectionManager().shutdown();
                if(bufferedReader!=null)
                    bufferedReader.close();
            }
        }
    
        //测试方法
        public static void main(String[] args) {
            String url="这里填写你的地址";
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("index","aaa");//这里是参数值
            try {
                String output=httpPost(url,map);
                log.info(output);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
    }

    下面是CoreController.java

    package com.haihua.haihua.controller;
    
    
    import com.haihua.haihua.Utils.HttpRequestUtils;
    import org.json.JSONObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    
    /**
     * Created by liuzp on 2018/5/9.
     */
    @Controller
    public class CoreController {
    
        private Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Value("${appid}")
        private String appid;
    
        @Value("${callBack}")
        private String callBack;
    
        @Value("${scope}")
        private String scope;
    
        @Value("${appsecret}")
        private String appsecret;
    
    @RequestMapping("/1")
        public String index1(Model model) throws UnsupportedEncodingException {
            String redirect_uri = URLEncoder.encode(callBack, "utf-8"); ;
            model.addAttribute("name","liuzp");
            model.addAttribute("appid",appid);
            model.addAttribute("scope",scope);
            model.addAttribute("redirect_uri",redirect_uri);
            return "index1";
        }
    
    
        @RequestMapping("/")
        public String index(Model model) throws UnsupportedEncodingException {
            String oauthUrl = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
            String redirect_uri = URLEncoder.encode(callBack, "utf-8"); ;
            oauthUrl =  oauthUrl.replace("APPID",appid).replace("REDIRECT_URI",redirect_uri).replace("SCOPE",scope);
            model.addAttribute("name","liuzp");
            model.addAttribute("oauthUrl",oauthUrl);
            return "index2";
        }
    
        
        @RequestMapping("/callBack")
        public String callBack(String code,String state,Model model) throws Exception{
            logger.info("进入授权回调,code:{},state:{}",code,state);
    
            //1.通过code获取access_token
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
            url = url.replace("APPID",appid).replace("SECRET",appsecret).replace("CODE",code);
            String tokenInfoStr =  HttpRequestUtils.httpGet(url,null,null);
    
            JSONObject tokenInfoObject = new JSONObject(tokenInfoStr);
            logger.info("tokenInfoObject:{}",tokenInfoObject);
    
            //2.通过access_token和openid获取用户信息
            String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
            userInfoUrl = userInfoUrl.replace("ACCESS_TOKEN",tokenInfoObject.getString("access_token")).replace("OPENID",tokenInfoObject.getString("openid"));
            String userInfoStr =  HttpRequestUtils.httpGet(userInfoUrl,null,null);
            logger.info("userInfoObject:{}",userInfoStr);
    
            model.addAttribute("tokenInfoObject",tokenInfoObject);
            model.addAttribute("userInfoObject",userInfoStr);
    
            return "result";
        }
    
    
    
    }
    

    前端 index1.html

     

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>内嵌(自定义二维码)</title>
    </head>
    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
    
    <body>
    <h1>hello! <label th:text="${name}"></label></h1>
    <div id="login_container"></div>
    <script th:inline="javascript">
        var obj = new WxLogin({
            self_redirect:true,
            id:"login_container",
            appid: [[${appid}]],
            scope: [[${scope}]],
            redirect_uri: [[${redirect_uri}]],
            state: "",
            style: "",
            href: ""
        });
    </script>
    </body>
    </html>

    前端 index2.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>hello! <label th:text="${name}"></label></h1>
    <a  th:href="${oauthUrl}">点击扫码登录</a>
    </body>
    </html>

    前端 result.html:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>授权结果页</title>
    </head>
    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
    
    <body>
    <h2>你好,授权成功!</h2><br>
    <h3>通过code换取access_token 结果:</h3>
    <p th:text="${tokenInfoObject}"></p>
    <h3>通过access_token获取用户信息 结果:</h3>
    <p th:text="${userInfoObject}"></p>
    </body>
    </html>

     

    这了我们就完成了微信登录的功能,当然最重要的是要给腾讯掏钱,坑爹!

    展开全文
  • 最近使用weexplus做了个app 用户需要的是可以使用第三方微信实现登录,于是我就去weexplus 官网了,发现还整有个wechat插件。于是直接就整合到应用里去了。接下来就开始了我的一路填坑之旅了… 一、插件不可用 ...
  • 使用第三方微信登录

    千次阅读 2018-03-28 12:03:16
    这两天了解了下使用微信第三方登录相关问题,这样方便用户登录,不用担心密码...或者在微信公众平台申请一个服务的公众号 两者的区别可以自行百度第三方微信接口登录流程图: 用户首先请求登录第三方应用(app.we...
  • 由于需要测试微信登录功能,在微信授权登录成功后需要解除绑定功能。一直没有找到对应的方法。偶然间在 “发现” =&gt; "游戏"里看见了最近在玩的列表中居然有相关的APP,然后在菜单中“游戏管理”...
  • 微信授权登录第三方app遇到的问题

    万次阅读 2015-10-22 15:35:39
    最近公司app要求实现微信授权登录app的功能,我是个应届毕业生,工作经验不是很足,但是,开发任务来了,我也不会拖泥带水,去了微信开放平台注册了公司的app,得到了appid等相关信息,回到程序里面,我导入微信相关...
  • final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo";...APPID和AppSecret是从微信官网申请下来的,应该没错。 错误提示是scope参数错误或没有scope权限 请问这是什么问题造成的呢?
  • 想做一个类同蘑菇街网站的微信扫二维码登录的功能,看下面的地址发现是腾讯QQ的地址,但是查不到任何的API,特别是二维码是在QQ的服务器上生成的,我找不到相应的API说明!也不是OAuth2.0网页授权模式实现的,请高人...
  •  前一段时间朋友由于没有对手机未安装微信做处理,被苹果审核组给拒绝了,主要原因就是说微信第三方登录没有对未安装微信的情况做处理,并且给出建议是对未安装微信的要调用web登录,信息如下: We were required ...
  •  URL(服务器地址):为第三方的的URL服务器的地址  Token(令牌):为微信公众平台的Token  AppID:登录到可以获得  AppSecret:登录到可以获得  原始ID:用于发送模板消息,登录到可以获得 微信公众平台: ...
  • iOS第三方微信登录时不走回调方法

    万次阅读 2016-09-21 17:56:49
    ios 开发中第三方微信登录时,使用真机测试,授权登录按钮点击后不走微信demo的 -(void)onResp:(BaseResp*)resp 回调方法不走,无法判断是否成功 查看网上一些解决方法,自己尝试了一下可行。 就是...
  • 微信第三方登录 不能登录问题

    千次阅读 2017-03-29 13:37:37
    Android debug 调试时微信第三方登录不能正常登录的问题:应用签名:5fe4d5632db8467ac81dbff9bdafmmmm微信平台的应用签名和你打包时的签名不一样时会造成微信第三方不能登录问题。解决: 新建签名文件,获得md5值...
  • h5做微信登录

    万次阅读 2016-06-06 13:52:50
    本来一开始怎么也想不通一点,就是客户端申请第三方登录,需要跳转到微信界面,然后再靠一开始填写的url回到自己的界面,这样的话,服务端不知道到底是谁请求的第三方登录,把获得的userinfo交给谁。 后来仔细研读...
  • 第三方支付平台:微信支付接口

    万次阅读 2016-05-16 11:07:34
    第三方支付平台:微信支付接口如果想要实在公众号支付方式,你需要准备以下几项内容: 首先,你要有一个服务号 服务号要开通微信认证
  • 二:用友盟的第三方微信登录 以下是官方文档 明明已经获取了登录权限 却还是 那么,此时有两个解决方法 1.检查代码的 appkey是否写的一致和正确与否(包括sso授权) 2.重置微信开发平台的appkey(在...
  • 企业微信---第三方应用开发 笔记

    万次阅读 热门讨论 2020-07-02 10:59:45
    这里的CorpID是第三方供应商供应商的企业ID,不同于企业微信的CorpID。 ProviderSecret:还未用到,之后再补 系统事件接收URL:保存之前腾讯的企业微信服务器会发送一个Get请求到这个地址,所有要准备一台服务器,...
  • 微信第三方登录问题,及-6错误

    千次阅读 2018-01-04 15:37:33
    2)检测当前运行的APP是否正式签名,DeBug调试下的APP应用签名是不一样的,具体可下载微信签名工具到手机上,再输入项目的packageName也可以查看到当前运行APP的应用签名,再更改微信注册应用平台的应用签名。...
  • 1 登录企业微信 https://work.weixin.qq.com/ 创建应用 2 在应用里需要配置 工作台应用主页 (即扫码后的跳转地址) 和 企业微信授权里的授权回调域 (必须跟跳转地址是相同域名)3 开始开发 文档地址<!DOCTYPE html> ...
1 2 3 4 5 ... 20
收藏数 106,857
精华内容 42,742
关键字:

第三方微信登录