微信授权_为什么微信授权不了微信微信弹出必须在微信浏览器打开 - CSDN
  • 微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId。两者之间有着必然的联系。 首先,先来理一下微信开放平台的架构。开发微信登录,必须有一个开放平台账号(公众号授权可以不用,后面会讲到)。开放...

    1.UnionId和OpenId

    微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId。两者之间有着必然的联系。

    首先,先来理一下微信开放平台的架构。开发微信登录,必须有一个开放平台账号(公众号授权可以不用,后面会讲到)。开放平台下面可以申请多个应用或绑定微信公众号(必须为服务号)。如下图所示

    图片描述

    APP登录就得申请移动应用(做了微信支付的都知道怎么回事了哈);电脑端登录就得申请网页应用(必须有域名,还得填表什么的,具体就不说了);微信公众号授权,主要场景是,在微信打开某个链接,然后用户统一授权给公众号,表示可以获取用户的微信信息。

    开放平台和各种申请的应用或者公众号的关系,如下图所示(别问我为什么这都还要用图表示)。

    图片描述

    可以把这想象成是订单主表和订单明细的关系(一对多)。

    这跟OpenId和UnionId有什么关系呢?

    先来讲OpenId,一个微信账户对应每一个应用或者微信公众号,有各自的OpenId,用来标记,这个微信账户,和这个应用,或者微信公众号的关系。接着看图会清晰一点(好羞耻,又有不可描述的图了)

    图片描述

    PS:图上所示的应用和微信公众号都在同一个开放平台下。但是这个关系即使是应用不在同一个微信开放平台下仍然成立。

    接着是UnionId。可以把UnionId看成是微信用户和微信开放平台的关系。再来一个图(请叫我达芬奇,谢谢)。

    图片描述

    总结起来就一句话,一个微信和不同应用以OpenId联系,与开放平台下以UnionId联系。

    2.微信登录(公众号授权)的流程

    流程说起来就那么点。获取Code->用Code获取AccessToken和OpenId(和UnionId)->用AccessToken获取微信用户的微信信息。

    需要讲的是,每种应用获取Code的方法不一样。UnionId返回的时候可能没有,APP登录需要根据获取code传入的scope来返回,公众号需要绑定了开放平台之后才能获取UnionId。本人姓懒,所以这个SDK获取的Code都是能拿到UnionId的。

    首先是APP,微信有官方的SDK提供,几行代码他们APP前端就能获取到Code。

    @RequestMapping("/recieveCode")
    public void revieveCode(Code4AccessToken codeObj) throws Exception{
        WechatLoginClient.getUserInfoByCode4App(codeObj);
    }

    接着是电脑端扫码登录。流程大概是这样子的。前端请求服务器->服务器重定向到,拼接好微信扫码登录的链接(里面拼接了回调接口)->微信收到用户扫码登录确认的请求,回调服务器的接口->服务器获得Code->接下来用Code为所欲为。代码示例如下:

    //以Spring MVC为例
    @GetMapping("/wxauth")
    public String wxAuth(String state) throws Exception{
    //state我称为胎记,最后会讲到。    
        String authUrl=WechatLoginClient.getPcAuthUrl("域名"+"/recieveCode",state);
        return "redirect:"+authUrl;
    }
    
    @RequestMapping("/recieveCode")
    public void revieveCode(Code4AccessToken codeObj) throws Exception{
        //拿到微信头像,昵称什么的。当然还有UnionId和OpenId
        WechatUserInfo userInfo = WechatLoginClient.getUserInfoByCode4PC(codeObj);
    }

    登录的效果如下:
    图片描述

    PS:还有一种做法呢是引用微信官方的JS,同样是微信扫码确认之后,回调服务器的切口并返回Code,具体看文档吧。

    最后是公众号。流程跟Pc扫码的差不多。前端请求服务器->服务器拼接授权地址返回->前端把授权地址分享到微信->用户点开授权->微信回调服务器接口。也可以不经过服务器返回链接,直接像PC端登录一样,请求服务器的时候重定向。但是鉴于有些特殊的需求。比如下面的Demo是演示分销模块的逻辑(就是特么的邀请码什么的)。

    @GetMapping("/wxauth")
    @ResponseBody
    public String wxAuth(@RequestParam("token")String token) throws Exception{
    
        //处理token
        LoginInfo info = service.findByToken(token);    
    
        String inviteCode = info.getInviteCode();
        String authUrl=WechatLoginClient.getOfficialAccAuthUrl("域名"+"/recieveCode",inviteCode);
        return authUrl;
    }
    
    @RequestMapping("/recieveCode")
    public void revieveCode(Code4AccessToken codeObj) throws Exception{
        //获取邀请码
        String inviteCode = codeObj.getState();
        /**
            根据邀请码处理自己的业务
         */
    
        //拿到微信头像,昵称什么的。当然还有UnionId和OpenId
        WechatUserInfo userInfo = WechatLoginClient.getUserInfoByCode4OffcialAcc(codeObj);
    }

    3.State参数

    接着说说state这个参数。在拼接获取Code链接的时候,会额外传入一个参数叫state。这个参数的值是你怎么传过去给微信,微信怎么传回来给你。我觉得跟胎记很像。就是你不管你的娃去微信那里多久了,你都能根据这个胎记认出,这就是你的娃。分销模块就是个很好的例子。也有的往state里面传入sessionId的,比如扫码登录。

    展开全文
  • 微信授权前端代码

    2020-07-27 23:30:25
    微信授权登录,判断是否是微信客户端打开HTML5页面站点,是微信则授权并请求接口,否则拦截接口请求。
  • 微信授权登录demo源码

    2020-07-30 23:30:25
    微信授权登录的简单demo,仅供参考了解拉取微信授权,获取微信accessToken的过程。
  • 关于分享主要是分享时的链接、标题、描述文字、分享图标,这些信息不配置的话分享的就是当前页面的信息1、平台微信公众号:是针对公众号的,公众号里文章的推送、消息提醒。地址 ...

    关于分享主要是分享时的链接、标题、描述文字、分享图标,这些信息不配置的话分享的就是当前页面的信息

    1、平台

    微信公众号:是针对公众号的,公众号里文章的推送、消息提醒。

    地址 http://mp.weixin.qq.com/wiki/home/index.html

    微信开放平台:针对应用,如果app要用到微信登录,就需要开放平台,需要申请自己的应用的信息,AppID和AppSecret,以及支付权限也是在这里申请

    2、微信登录

    在你的页面中加入如下代码就可以调用微信的授权页面

    /*微信公众号登录验证,需要用户自己授权

    redirect_uri用户授权后的回调链接   只能是域名方式

    state为了我们自己做校验的,这个数当授权成功后微信会给我们传回来,使用随机数就可以

    */

    function weiChatLogin(redirect_uri,state){

        //回调链接一定要用urlencode编码

        redirect_uri=encodeURIComponent(redirect_uri);

    window.locaton"https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXX&redirect_uri="+redirect_uri+"&response_type=code&scope=snsapi_userinfo&state="+state+"#wechat_redirect"

    }

    这里的appid用的公共平台的appid,在授权成功后微信会在回调链接中自动拼接code=CODE&state=state,code就是微信的此次授权凭证,根据它我我们就可以获取登陆者的个人信息了,state就是我们传过去的,不会改变

    需要进一步的配置:


    点开修改


    这里设置的域名,不包括http://,也不能包含ip,这个域名用在redirect_uri参数中,这个参数的域名就是这个aa.bb了,用其他的授权不了

    ps:如果需要在多公众号、移动应用之间做用户共通,则需要到微信开发平台,将这些公众号和应用绑定到一个开放平台账号下


    绑定之前,需要在你的公众号平台里要做好安全设置,不然绑定不了

    3、微信分享

    1、官方的js=JDK使用说明文档:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 


    微信需要我们在自己的服务器上来获取必要的签名凭证,

    1、https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret

    获得access_token,需要说明的是appid和secret用的是公众平台的你们自己应用的

    2、用1中的access_token来获取ticket,方法:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token + "&type=jsapi

    3、然后将参数拼接成字符串进行签名:

    String nStr = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonceStr + "&timestamp="+timestamp+"&url="+surl;

    签名算法,微信官方提供的demo中有

    4、关于surl的说明含义是:当前页面的完整链接,但是有一种情况就是  我们通过后台去跳转的页面,例如例如 http://xxx/test/?id=123 跳转到 bb.html,此时在bb.html中链接会变            成http://xxx/test.html?id=123,可能是微信自己补充的后缀吧,这这个地方呗坑了好久,伤心...

    最简单的就是用js来查看本页的完整链接:

    alert(window.location.href)//查看本页的完整url

    5、1和2的方法每天有请求次数的限制,所以我们的服务器要最好缓存,一般一个小时就够了

    //在配置微信分享时 需要用到调用服务器进行授权处理,会用到当前页面的链接  

    //这一步如果使用的是window.location.href这种方式得到的当前页链接就一定要encodeURIComponent(),不然,2次分享以后,自定义信息将会消失






    展开全文
  • (一)java微信授权登录

    2018-05-07 09:34:55
    微信授权的话,获取用户信息有两种:1.静默获取用户信息、2.弹出授权界面,用户确认之后获取用户信息(这种方法能够获取到更多信息)。开发准备,登录微信公众平台后台->基本配置->公众号开发信息:1....

    最近工作中,接触到微信开发(公众号服务号开发)。

    由于第一次接触微信开发,所以第一步先去看微信开发文档。

    微信公众平台开发文档

    接下来,我们要使用微信来进行授权登录。

    微信授权的话,获取用户信息有两种:

    1.静默获取用户信息、

    2.弹出授权界面,用户确认之后获取用户信息(这种方法能够获取到更多信息)。

    开发准备,登录微信公众平台后台->基本配置->公众号开发信息:

    1.获取到AppID

    2.AppSecret

    3.设置IP白名单


    4.添加网页授权域名

    公众号设置->功能设置



    这一步,小伙伴本地开发的话没有域名,可以使用内网穿透软件,这里我用的是NATAPP,这样我们就能得到一个域名了,

    然后按照微信的流程来绑定授权域名就好了。

    获取用户信息,需要openid,然而获取openid的话要通过这个接口先获得一个code

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    这里我们用的是弹出授权页面snsapi_userinfo

    后台授权接口代码

        @RequestMapping("/")
        public void login(HttpServletResponse response) {
                    //这里是回调的url
                    String redirect_uri = URLEncoder.encode("http://回调页面的路径", "UTF-8");
                    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
                            "appid=APPID" +
                            "&redirect_uri=REDIRECT_URI"
                            "&response_type=code" +
                            "&scope=SCOPE" +
                            "&state=123#wechat_redirect";
                    response.sendRedirect(url.replace("APPID","你的APPID").replace("REDIRECT_URL",redirect_url).replace("SCOPE","snsapi_userinfo"));
        }

    使用微信web开发工具访问该接口,会弹出授权确认界面



    用户点击确认登录之后跳转到我们的回调接口,并携带上code参数redirect_uri/?code=CODE&state=STATE,那我们就通过code来获取openid了。

    获取code后,请求以下链接获取access_token与openid:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


    后台回调接口代码

        @RequestMapping("/index")
        public void index(String code) {
                    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
                //开始请求url地址,第一次请求通过code获取openid与access_token     
                 UrlConnUtils.get(url.replace("APPID", "你的APPID").replace("SECRET", "你的SECRET")
                          .replace("CODE", code), new GetDataUrlConnListener() {                
                         @Override
                         public void onSuccess(HttpURLConnection connection) throws IOException {
                            String data = MyUtils.inputStreamToString(connection.getInputStream());
                            JSONObject jsonObject = JSONObject.parseObject(data);
                            if (jsonObject.getString("openid") != null) {
                                //拉取用户信息
                                String openid = jsonObject.getString("openid");
                                String access_token = jsonObject.getString("access_token");
                                String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
                                 //第二次请求,用openid与access_token获取用户的信息
                                UrlConnUtils.get(url.replace("OPENID", openid).replace("ACCESS_TOKEN", access_token), new GetDataUrlConnListener() {
                                    @Override
                                    public void onSuccess(HttpURLConnection connection) throws IOException {
                                        String data = MyUtils.inputStreamToString(connection.getInputStream());                                   
                                        System.out.println(data);//输出微信返回的用户信息
                            }
                        }
                    });
        }


    第一次返回的数据:
    {
        "access_token":"9_zB3*****************w",
        "expires_in":7200,
        "refresh_token":"9_Uze***************9WTQ",
        "openid":"o*************ug",
        "scope":"snsapi_userinfo"
    }
    第二次返回的数据:(用户的信息)
    {
    "openid":"o***********g",
    "nickname":"Smile",
    "sex":1,
    "language":"zh_CN",
    "city":"厦门",
    "province":"福建",
    "country":"中国",
    "headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTLs8SZLLWjyib0Q\/132",
    "privilege":[]
    }

    这样就大功告成了!

    展开全文
  • 微信网页授权登录

    2018-03-20 13:39:03
    功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证)微信网页授权api说明网址:https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html相关说明:目前微信api有两种方式获取...

    功能:用于纪录微信网页授权步骤(前提条件:公众号为服务号,且通过认证)

    微信网页授权api说明网址:https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html

    相关说明:目前微信api有两种方式获取用户信息。第一种是用户管理获取用户基本信息(包括UnionID机制),这个前提是用户必须事先已经关注公众号,通过获取基础access_token和openID来获取用户信息。第二种是以snsapi_userinfo为scope发起的网页授权,来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

    一、什么是OAuth2.0

    OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密的资源(如用户个人信息、照片、视频、联系人列表),而无需将用户名和密码提供给第三方应用。

    OAuth 2.0OAuth协议的下一版本,但不向后兼容OAuth 1.0 OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

    二、微信公众平台OAuth2.0授权

    微信公众平台OAuth2.0授权详细步骤如下:

    1. 引导用户进入授权页面

    2. 用户点击授权页面URL,将向服务器发起请求

    3. 服务器询问用户是否同意授权给微信公众账号(scopesnsapi_base时无此步骤)

    4. 用户同意(scopesnsapi_base时无此步骤)

    5. 服务器将CODE通过回调传给微信公众账号

    6. 微信公众账号获得CODE

    7. 微信公众账号通过CODE向服务器请求Access Token

    8. 服务器返回Access TokenOpenID给微信公众账号

    9. 微信公众账号通过Access Token向服务器请求用户信息(scopesnsapi_base时无此步骤)

    10. 服务器将用户信息回送给微信公众账号(scopesnsapi_base时无此步骤)


    使用的AppIdAppSecret在公众平台基本配置中,可以找到。


    如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”

    在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调域名。请注意,这里填写的域名不要加http://


    配置授权回调页面域名

    点击右侧的修改。


    授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 

    http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权

     

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

    1   、引导用户进入授权页面同意授权,获取code

    、通过code换取网页授权access_token(与基础支持中的access_token不同)

    、如果需要,开发者可以刷新网页授权access_token,避免过期

    4、通过网页授权access_token和openid获取用户基本信息

    下面详细说明这些步骤:

    第一步:用户同意授权,获取code

    在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),

    引导关注者打开如下页面:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect (若提示“该链接无法访问”,

    请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。)

    参数说明:

    参数

    是否必须

    说明

    appid

    公众号的唯一标识

    redirect_uri

    授权后重定向的回调链接地址,请使用urlencode对链接进行处理

    response_type

    返回类型,请填写code

    scope

    应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息

    state

    重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值

    #wechat_redirect

    无论直接打开还是做页面302重定向时候,必须带此参数

    用户同意授权后

    如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,

    仅会带上state参数redirect_uri?state=STATE

    code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

    第二步:通过code换取网页授权access_token

    首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。公众号可通过下述接口来获取网页授权access_token。

    如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

    获取code后,请求以下链接获取,请求方法:GET

    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

    返回说明

    正确时返回的JSON数据包如下:

    {

      "access_token":"ACCESS_TOKEN",

       "expires_in":7200,

      "refresh_token":"REFRESH_TOKEN",

       "openid":"OPENID",

       "scope":"SCOPE"

    }

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

    expires_in

    access_token接口调用凭证超时时间,单位(秒)

    refresh_token

    用户刷新access_token

    openid

    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID

    scope

    用户授权的作用域,使用逗号(,)分隔

     

    错误时微信会返回JSON数据包如下(示例为Code无效错误):

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

    第三步:刷新access_token(如果需要)

    由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。

    请求方法:GET

    获取第二步的refresh_token后,请求以下链接获取access_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参数

    返回说明:

    正确时返回的JSON数据包如下:

    {

      "access_token":"ACCESS_TOKEN",

       "expires_in":7200,

      "refresh_token":"REFRESH_TOKEN",

       "openid":"OPENID",

       "scope":"SCOPE"

    }

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

    expires_in

    access_token接口调用凭证超时时间,单位(秒)

    refresh_token

    用户刷新access_token

    openid

    用户唯一标识

    scope

    用户授权的作用域,使用逗号(,)分隔

    错误时微信会返回JSON数据包如下(示例为Code无效错误):

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

    第四步:拉取用户信息(需scope为snsapi_userinfo)

    如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

    httpGET(请使用https协议)

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

    注意:这里调用的接口千万不要用下面这个:

    http请求方式: GET

    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN(这个接口是用基础access_tokenopenID

    获取用户信息,前提是用户必须已经关注该公众号)

    参数说明

    参数

    描述

    access_token

    网页授权接口调用凭证,注意:此access_token与基础支持的

    access_token不同

    openid

    用户的唯一标识

    lang

    返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

    正确时返回的JSON数据包如下:

    {

       "openid":" OPENID",

       " nickname": NICKNAME,

       "sex":"1",

       "province":"PROVINCE"

       "city":"CITY",

       "country":"COUNTRY",

        "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",

         "privilege":[

         "PRIVILEGE1"

         "PRIVILEGE2"

        ],

        "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"

    }

     

    参数

    描述

    openid

    用户的唯一标识

    nickname

    用户昵称

    sex

    用户的性别,值为1时是男性,值为2时是女性,值为0时是未知

    province

    用户个人资料填写的省份

    city

    普通用户个人资料填写的城市

    country

    国家,如中国为CN

    headimgurl

    用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。

    若用户更换头像,原有头像URL将失效。

    privilege

    用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

    unionid

    只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)

     

    错误时微信会返回JSON数据包如下(示例为openid无效):

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

    展开全文
  • 1 微信开放平台:https://open.weixin.qq.com/ 2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&...

    1 微信开放平台:https://open.weixin.qq.com/

    2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

    3.pc页面显示

    4. 通过官方提供的文档,我们可以看出一共分4个步骤

    第一步:请求CODE
    第二步:通过code获取access_token
    第三步:通过access_token调用接口
    第4步:获取用户个人信息(UnionID机制)

     

     5.源码下载地址:http://pan.baidu.com/s/1pLyG66J

    因代码加密:现贴出代码如下(下载后替换):

    Controllers--》DefaultController.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Configuration;
      4 using System.Text;
      5 using System.Web;
      6 using System.Web.Mvc;
      7 
      8 using WebWeChat.Models;
      9 
     10 namespace WebWeChat.Controllers
     11 {
     12     public class DefaultController : Controller
     13     {
     14         #region 微信登录
     15 
     16         /// <summary>
     17         /// 微信登录
     18         /// </summary>
     19         public ActionResult WeChat()
     20         {
     21             //获得配置信息
     22             string oauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     23             string redirectUri = ConfigurationManager.AppSettings["Redirect_uri"];
     24             if (oauthAppId == null)
     25             {
     26                 return this.Content("出错了,您尚未配置微信相关的API信息!");
     27             }
     28             string state = Guid.NewGuid().ToString().Replace("-", "");
     29             this.Session["oauth_state"] = state;
     30             string sendUrl =
     31                 "https://open.weixin.qq.com/connect/qrconnect?appid=" + oauthAppId +
     32                 "&redirect_uri=" + HttpUtility.UrlEncode(redirectUri.ToLower()) +
     33                 "&response_type=code&scope=snsapi_login&state=" + state +
     34                 "#wechat_redirect";
     35 
     36             //开始发送
     37             return this.Redirect(sendUrl); //跳转到微信自己 指定的关联登陆页面
     38         }
     39 
     40         /// <summary>
     41         /// 微信登录返回action
     42         /// </summary>
     43         public ActionResult WeChatReturnUrl(string state, string code)
     44         {
     45             //取得返回参数
     46 
     47             if (this.Session["oauth_state"] == null || this.Session["oauth_state"].ToString() == "" ||
     48                 state != this.Session["oauth_state"].ToString() || string.IsNullOrEmpty(code)) //若返回参数中未包含code或者state没有通过验证则提示出错
     49             {
     50                 return this.Content("出错啦,state未初始化!");
     51             }
     52 
     53             //第一步:通过code来获取Access Token以及openid
     54             Dictionary<string, object> dic1 = WeixinHelper.get_access_token(code, state);
     55             if (dic1 == null || !dic1.ContainsKey("access_token"))
     56             {
     57                 return this.Content("错误代码:,无法获取Access Token,请检查App Key是否正确!");
     58             }
     59             if (!dic1.ContainsKey("openid"))
     60             {
     61                 return dic1.ContainsKey("errmsg")
     62                     ? this.Content("errcode:" + dic1["errcode"] + ",errmsg:" + dic1["errmsg"])
     63                     : this.Content("出错啦,无法获取用户授权Openid!");
     64             }
     65 
     66             var accessToken = dic1["access_token"].ToString();
     67             var refreshToken = dic1["refresh_token"].ToString();
     68             var openid = dic1["openid"].ToString();
     69 
     70             //储存获取数据用到的信息
     71             this.Session["oauth_name"] = "webchat";
     72             this.Session["oauth_access_token"] = accessToken;
     73             this.Session["oauth_openid"] = openid;
     74             this.Session["oauth_refresh_token"] = refreshToken;
     75 
     76             #region todo 将获取到的用户信息保存到数据库中
     77 
     78             #endregion
     79 
     80             //第二步:通过Access Token以及openid来获取用户的基本信息
     81             //Dictionary<string, object> dic2 = weixin_helper.get_user_info(access_token,openid);
     82 
     83             //第三步:跳转到指定页面
     84             return this.Content(this.WeChatResultJson());
     85         }
     86 
     87         /// <summary>
     88         /// 微信登录返回action, 处理用户信息
     89         /// </summary>
     90         public string WeChatResultJson()
     91         {
     92             if (this.Session["oauth_name"] == null || this.Session["oauth_access_token"] == null ||
     93                 this.Session["oauth_openid"] == null)
     94             {
     95                 return "{\"ret\":\"1\", \"msg\":\"出错啦,Access Token已过期或不存在!\"}";
     96             }
     97             var oauthName = this.Session["oauth_name"].ToString();
     98             var oauthAccessToken = this.Session["oauth_access_token"].ToString();
     99             var oauthOpenid = this.Session["oauth_openid"].ToString();
    100             var oauthRefreshToken = this.Session["oauth_refresh_token"].ToString();
    101 
    102             if (!WeixinHelper.check_access_token(oauthAccessToken)) //调用access_token前需判断是否过期
    103             {
    104                 Dictionary<string, object> dic1 = WeixinHelper.get_refresh_token(oauthRefreshToken); //如果已过期则重新换取新的access_token
    105                 if (dic1 == null || !dic1.ContainsKey("access_token"))
    106                 {
    107                     return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取access_token!\"}";
    108                 }
    109                 oauthAccessToken = dic1["access_token"].ToString();
    110             }
    111 
    112             Dictionary<string, object> dic = WeixinHelper.get_user_info(oauthAccessToken, oauthOpenid);
    113             if (dic == null)
    114             {
    115                 return "{\"openid\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    116             }
    117             try
    118             {
    119                 StringBuilder str = new StringBuilder();
    120                 str.Append("{");
    121                 str.Append("\"openid\": \"" + dic["openid"] + "\", ");
    122                 str.Append("\"nickname\": \"" + dic["nickname"] + "\", ");
    123                 str.Append("\"sex\": \"" + dic["sex"] + "\", ");
    124                 str.Append("\"province\": \"" + dic["province"] + "\", ");
    125                 str.Append("\"city\": \"" + dic["city"] + "\", ");
    126                 str.Append("\"country\": \"" + dic["country"] + "\", ");
    127                 str.Append("\"headimgurl\": \"" + dic["headimgurl"] + "\", ");
    128                 str.Append("\"privilege\": \"" + dic["privilege"] + "\", ");
    129                 str.Append("\"unionid\": \"" + dic["unionid"] + "\"");
    130                 str.Append("\"oauth_name\": \"" + oauthName + "\"");
    131                 str.Append("\"oauth_access_token\": \"" + oauthAccessToken + "\"");
    132                 str.Append("\"oauth_openid\": \"" + oauthOpenid + "\"");
    133                 str.Append("}");
    134                 return str.ToString();
    135             }
    136             catch
    137             {
    138                 return "{\"ret\":\"0\", \"msg\":\"出错啦,无法获取授权用户信息!\"}";
    139             }
    140         }
    141 
    142         #endregion
    143     }
    144 }

    Models---》HttpMethods

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Net;
      5 using System.Text;
      6 
      7 namespace WebWeChat.Models
      8 {
      9     ////////////////////////////////////////////////////////////////////////////////////////////////////
     10     /// <summary>   A HTTP methods. </summary>
     11     ///
     12     /// <remarks>   xiaop, 2014/12/16. </remarks>
     13     ////////////////////////////////////////////////////////////////////////////////////////////////////
     14     public static class HttpMethods
     15     {
     16         #region POST
     17 
     18         /// <summary>
     19         /// HTTP POST方式请求数据
     20         /// </summary>
     21         /// <param name="url">URL.</param>
     22         /// <param name="param">POST的数据</param>
     23         /// <returns></returns>
     24         public static string HttpPost(string url, string param)
     25         {
     26             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     27             request.Method = "POST";
     28             request.ContentType = "application/x-www-form-urlencoded";
     29             request.Accept = "*/*";
     30             request.Timeout = 15000;
     31             request.AllowAutoRedirect = false;
     32 
     33             string responseStr;
     34 
     35             var requestStream = new StreamWriter(request.GetRequestStream());
     36             requestStream.Write(param);
     37             requestStream.Close();
     38 
     39             var response = request.GetResponse();
     40             {
     41                 // ReSharper disable once AssignNullToNotNullAttribute
     42                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     43                 responseStr = reader.ReadToEnd();
     44                 reader.Close();
     45             }
     46 
     47             return responseStr;
     48         }
     49 
     50         #endregion
     51 
     52         #region Get
     53 
     54         /// <summary>
     55         /// HTTP GET方式请求数据.
     56         /// </summary>
     57         /// <param name="url">URL.</param>
     58         /// <returns></returns>
     59         public static string HttpGet(string url)
     60         {
     61             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
     62             request.Method = "GET";
     63 
     64             //request.ContentType = "application/x-www-form-urlencoded";
     65             request.Accept = "*/*";
     66             request.Timeout = 15000;
     67             request.AllowAutoRedirect = false;
     68 
     69             string responseStr;
     70 
     71             var response = request.GetResponse();
     72 
     73             {
     74                 // ReSharper disable once AssignNullToNotNullAttribute
     75                 StreamReader reader = new StreamReader(stream: response.GetResponseStream(), encoding: Encoding.UTF8);
     76                 responseStr = reader.ReadToEnd();
     77                 reader.Close();
     78             }
     79 
     80             return responseStr;
     81         }
     82 
     83         #endregion
     84 
     85         #region Post With Pic
     86 
     87         public static string HttpPost(string url, IDictionary<object, object> param, string filePath)
     88         {
     89             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
     90             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
     91 
     92             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
     93             wr.ContentType = "multipart/form-data; boundary=" + boundary;
     94             wr.Method = "POST";
     95             wr.KeepAlive = true;
     96             wr.Credentials = CredentialCache.DefaultCredentials;
     97 
     98             Stream rs = wr.GetRequestStream();
     99             string responseStr = null;
    100 
    101             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    102             foreach (string key in param.Keys)
    103             {
    104                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    105                 string formitem = string.Format(formdataTemplate, key, param[key]);
    106                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    107                 rs.Write(formitembytes, 0, formitembytes.Length);
    108             }
    109             rs.Write(boundarybytes, 0, boundarybytes.Length);
    110 
    111             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    112             string header = string.Format(headerTemplate, "pic", filePath, "text/plain");
    113             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    114             rs.Write(headerbytes, 0, headerbytes.Length);
    115 
    116             FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    117             byte[] buffer = new byte[4096];
    118             int bytesRead;
    119             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    120             {
    121                 rs.Write(buffer, 0, bytesRead);
    122             }
    123             fileStream.Close();
    124 
    125             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    126             rs.Write(trailer, 0, trailer.Length);
    127             rs.Close();
    128 
    129             WebResponse wresp = null;
    130             try
    131             {
    132                 wresp = wr.GetResponse();
    133                 Stream stream2 = wresp.GetResponseStream();
    134                 if (stream2 != null)
    135                 {
    136                     StreamReader reader2 = new StreamReader(stream2);
    137                     responseStr = reader2.ReadToEnd();
    138                 }
    139 
    140                 //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
    141             }
    142             catch (Exception)
    143             {
    144                 //logger.Error("Error uploading file", ex);
    145                 if (wresp != null)
    146                 {
    147                     wresp.Close();
    148                 }
    149             }
    150             return responseStr;
    151         }
    152 
    153         #endregion
    154 
    155         #region Post With Pic
    156 
    157         /// <summary>
    158         /// HTTP POST方式请求数据(带图片)
    159         /// </summary>
    160         /// <param name="url">URL</param>        
    161         /// <param name="param">POST的数据</param>
    162         /// <param name="fileByte">图片</param>
    163         /// <returns></returns>
    164         public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
    165         {
    166             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    167             byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    168 
    169             HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
    170             wr.ContentType = "multipart/form-data; boundary=" + boundary;
    171             wr.Method = "POST";
    172             wr.KeepAlive = true;
    173             wr.Credentials = CredentialCache.DefaultCredentials;
    174 
    175             Stream rs = wr.GetRequestStream();
    176             string responseStr = null;
    177 
    178             string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
    179             foreach (string key in param.Keys)
    180             {
    181                 rs.Write(boundarybytes, 0, boundarybytes.Length);
    182                 string formitem = string.Format(formdataTemplate, key, param[key]);
    183                 byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    184                 rs.Write(formitembytes, 0, formitembytes.Length);
    185             }
    186             rs.Write(boundarybytes, 0, boundarybytes.Length);
    187 
    188             string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
    189             string header = string.Format(headerTemplate, "pic", fileByte, "text/plain"); //image/jpeg
    190             byte[] headerbytes = Encoding.UTF8.GetBytes(header);
    191             rs.Write(headerbytes, 0, headerbytes.Length);
    192 
    193             rs.Write(fileByte, 0, fileByte.Length);
    194 
    195             byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    196             rs.Write(trailer, 0, trailer.Length);
    197             rs.Close();
    198 
    199             WebResponse wresp = null;
    200             try
    201             {
    202                 wresp = wr.GetResponse();
    203                 Stream stream2 = wresp.GetResponseStream();
    204                 if (stream2 != null)
    205                 {
    206                     StreamReader reader2 = new StreamReader(stream2);
    207                     responseStr = reader2.ReadToEnd();
    208                 }
    209 
    210                 // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
    211             }
    212             catch (Exception)
    213             {
    214                 //logger.Error("Error uploading file", ex);
    215                 if (wresp != null)
    216                 {
    217                     wresp.Close();
    218                 }
    219             }
    220             return responseStr;
    221         }
    222 
    223         #endregion
    224     }
    225 }

    Models---》WeixinHelper

      1 using System.Collections.Generic;
      2 using System.Configuration;
      3 
      4 using Newtonsoft.Json;
      5 
      6 namespace WebWeChat.Models
      7 {
      8     public static class WeixinHelper
      9     {
     10         #region 获得配置信息
     11 
     12         private static readonly string OauthAppId = ConfigurationManager.AppSettings["oauth_app_id"];
     13         private static readonly string OauthAppKey = ConfigurationManager.AppSettings["oauth_app_key"];
     14 
     15         #endregion
     16 
     17         /// <summary>
     18         /// 根据AppID和AppSecret获得access token(默认过期时间为2小时)
     19         /// </summary>
     20         /// <returns>Dictionary</returns>
     21         public static Dictionary<string, object> get_access_token()
     22         {
     23             string sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +
     24                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "";
     25 
     26             //发送并接受返回值
     27             string result = HttpMethods.HttpGet(sendUrl);
     28             if (result.Contains("errmsg"))
     29             {
     30                 return null;
     31             }
     32             try
     33             {
     34                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     35                 return dic;
     36             }
     37             catch
     38             {
     39                 return null;
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// 取得临时的Access Token(默认过期时间为2小时)
     45         /// </summary>
     46         /// <param name="code">临时Authorization Code</param>
     47         /// <param name="state">防止CSRF攻击,成功授权后回调时会原样带回</param>
     48         /// <returns>Dictionary</returns>
     49         public static Dictionary<string, object> get_access_token(string code, string state)
     50         {
     51             string sendUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +
     52                              WeixinHelper.OauthAppId + "&secret=" + WeixinHelper.OauthAppKey + "&code=" + code +
     53                              "&grant_type=authorization_code";
     54 
     55             //发送并接受返回值
     56             string result = HttpMethods.HttpGet(sendUrl);
     57             if (result.Contains("errmsg"))
     58             {
     59                 return null;
     60             }
     61             try
     62             {
     63                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     64                 return dic;
     65             }
     66             catch
     67             {
     68                 return null;
     69             }
     70         }
     71 
     72         /// <summary>
     73         /// 根据access_token判断access_token是否过期
     74         /// </summary>
     75         /// <param name="accessToken"></param>
     76         /// <returns>true表示未失效</returns>
     77         public static bool check_access_token(string accessToken)
     78         {
     79             string sendUrl = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + WeixinHelper.OauthAppId;
     80 
     81             //发送并接受返回值
     82             string result = HttpMethods.HttpGet(sendUrl);
     83             try
     84             {
     85                 Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
     86                 if (dic.ContainsKey("errmsg"))
     87                 {
     88                     return dic["errmsg"].ToString() == "ok";
     89                 }
     90                 return false;
     91             }
     92             catch
     93             {
     94                 return false;
     95             }
     96         }
     97 
     98         /// <summary>
     99         /// 若fresh_token已过期则根据refresh_token取得新的refresh_token
    100         /// </summary>
    101         /// <param name="refreshToken">refresh_token</param>
    102         /// <returns>Dictionary</returns>
    103         public static Dictionary<string, object> get_refresh_token(string refreshToken)
    104         {
    105             string sendUrl =
    106                 "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" +
    107                 WeixinHelper.OauthAppId + "&grant_type=refresh_token&refresh_token=" + refreshToken;
    108 
    109             //发送并接受返回值
    110             string result = HttpMethods.HttpGet(sendUrl);
    111             if (result.Contains("errmsg"))
    112             {
    113                 return null;
    114             }
    115             try
    116             {
    117                 return JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    118             }
    119             catch
    120             {
    121                 return null;
    122             }
    123         }
    124 
    125         /// <summary>
    126         /// 获取登录用户自己的基本资料
    127         /// </summary>
    128         /// <param name="accessToken">临时的Access Token</param>
    129         /// <param name="openId">用户openid</param>
    130         /// <returns>Dictionary</returns>
    131         public static Dictionary<string, object> get_user_info(string accessToken, string openId)
    132         {
    133             //发送并接受返回值   
    134             string sendUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
    135 
    136             //发送并接受返回值
    137             string result = HttpMethods.HttpGet(sendUrl);
    138             if (result.Contains("errmsg"))
    139             {
    140                 return null;
    141             }
    142 
    143             //反序列化JSON
    144             Dictionary<string, object> dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(result);
    145             return dic;
    146         }
    147     }
    148 }

     

    我的签名:坚持赚钱,顺便理想

    转载于:https://www.cnblogs.com/xxpeng/p/4832051.html

    展开全文
  • 微信第三方登录 Android 微信原生登录
  • 转自 http://www.cnblogs.com/0201zcr/p/5133062.html   1、OAuth2.0  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,... ...每一个令牌授权...
  • 本篇将帮助读者实现基于 微信开发者工具 &amp; C#环境 下的用户在小程序上的授权登陆。     准备: 微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html ...
  • 步骤一:申请微信开发者测试账号 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&amp;amp;amp;amp;amp;t=sandbox/index 步骤二:需要一个服务器,用来获取你要的信息,我使用的是阿里云 ...
  • 这几天开发要用到微信授权的功能,所以就研究了一下。可是微信开放平台接入指南里有几个地方写的不清不楚。在此总结一下,以便需要的人。 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了。  ...
  • 微信授权 微信SDK的使用,例如分享 小程序授权 小程序微信支付 小程序模板消息 不要问我为什么后面是小程序微信支付,小程序模板消息,因为普通微信公众号项目的更本不需要前端去操作太多,直接调取后台接口就可以...
  • 这几天开发要用到微信授权的功能,所以就研究了一下。可是微信开放平台接入指南里有几个地方写的不清不楚。在此总结一下,以便需要的人。 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了。  ...
  • 微信授权和测试整理

    2017-02-21 18:40:11
    微信授权和测试整理第一次开发微信相关内容,做了两件事:微信授权获取用户基本;微信公众号消息和菜单的开发与测试。整理如下: -微信授权 -微信公众号消息 -微信公众号菜单 -微信公众号测试相关微信授权 微信...
  • uni-app之APP和小程序微信授权uni-app 介绍APP微信授权检测服务商授权登录获取用户信息示例代码小程序微信授权获取用户基本信息微信登录微信登录状态监测 uni-app 介绍 uni-app 是一个使用 Vue.js 开发跨平台应用的...
  • php 微信授权原理

    2018-01-23 16:50:04
    微信授权有什么作用,微信授权我们需要使用微信开发的什么接口。微信授权,对于开发来说,他是与微信用户系统对接的唯一途径。为什么说是唯一途径,因为,只有通过微信授权,才能拿到用户在微信平台上的信息(头像,...
  • 微信授权登录基本流程微信oauth2.0授权登录流程说明让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),...
  • Java实现微信授权登录

    2017-09-29 22:38:26
    这篇文章出了介绍微信授权登录之外,还简单介绍QQ登录的相关流程。 首先要开发微信授权登录操作,必须有一个微信公众平台注册一个账号,具体网址在微信公众平台。在这里仅对于个人开发者而言,订阅号应该是个人...
  • 微信授权登陆-app

    2020-04-24 13:26:11
    移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统,前提你需要到微信开放平台注册开发者帐号,并...1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定...
1 2 3 4 5 ... 20
收藏数 68,448
精华内容 27,379
关键字:

微信授权