微信登陆_微信登陆记录android设备 - CSDN
精华内容
参与话题
  • 第三方登陆(一)微信登陆

    千次阅读 2019-05-02 16:04:19
    现在微信越来越流行,我们开发的app或者网站如果想从微信导流的话可以选择微信登陆。 现在这里介绍怎样集成微信登陆功能 首先我们要做好前期工作,就是注册账号,目的就是获取appID 和appsecret ,并设置好回调地址...

    现在微信越来越流行,我们开发的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>

     

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

    展开全文
  • 微信登录(官方指导)

    千次阅读 2019-07-12 10:01:08
    已有的互联网产品在接入小程序会面临一些和登录态相关的问题:怎么获取微信登录态?怎么把微信帐号和自己的帐号进行打通? 在这一节中,我们来介绍:如何把微信登录应用到你的小程序中,我们先来看看微信登录的整个...

    已有的互联网产品在接入小程序会面临一些和登录态相关的问题:怎么获取微信登录态? 怎么把微信帐号和自己的帐号进行打通?

    在这一节中,我们来介绍:如何把微信登录应用到你的小程序中,我们先来看看微信登录的整个过程,如图所示:

                                                                                     (微信登录的整个过程

    我们来依次分解一下图中的七个步骤:第1步到第4步,我们分别用一小节来讲述;第5步到第7步,都和SessionId相关,放在5节一起讨论。

     

        1 、获取微信登录凭证code

          首先说到登录,我们可能很正常地想到一个做法:通过wx.login直接拿到微信用户的id编号,再把这个id传到自己的后台,从而知道是哪个微信用户在使用我的服务。

          而我们上述微信登录的流程中并不是通过wx.login直接获取微信用户的id,那直接获取微信用户id的做法有什么问题呢? 

          假设现在我们有个接口,通过wx.request请求 https://test.com/getUserInfo?id=1 拉取到微信用户id为1在我们业务侧的个人信息,那么黑客就可以通过遍历所有的id,把整个业务侧的个人信息数据全部拉走,如果我们还有其他接口也是依赖这样的方式去实现的话,那黑客就可以伪装成任意身份来操作任意账户下的数据,想想这给业务带来多大的安全风险。

          为了避免这样的风险,wx.login是生成一个带有时效性的凭证(code),就像是一个会过期的临时身份证一样,在wx.login调用时,会先在微信后台生成一张临时的身份证,其有效时间仅为5分钟。然后把这个临时身份证返回给小程序方,这个临时的身份证我们把它称为微信登录凭证code。如果5分钟内小程序的后台不拿着这个临时身份证来微信后台服务器换取微信用户id的话,那么这个身份证就会被作废,需要再调用wx.login重新生成登录凭证。

          由于这个临时身份证5分钟后会过期,如果黑客要冒充一个用户的话,那他就必须在5分钟内穷举所有的身份证id,然后去开发者服务器换取真实的用户身份。显然,黑客要付出非常大的成本才能获取到一个用户信息,同时,开发者服务器也可以通过一些技术手段检测到5分钟内频繁从某个ip发送过来的登录请求,从而拒绝掉这些请求。

     

        2 、发送code到开发者服务器

          在wx.login的success回调中拿到微信登录凭证,紧接着会通过wx.request把code传到开发者服务器,为了后续可以换取微信用户身份id。如果当前微信用户还没有绑定当前小程序业务的用户身份,那在这次请求应该顺便把用户输入的帐号密码一起传到后台,然后开发者服务器就可以校验账号密码之后再和微信用户id进行绑定,小程序端的示例代码如下所示。

    代码清单 wx.login获取code后

    Page({
      tapLogin: function() {
        wx.login({
          success: function(res) {
            if (res.code) {
              wx.request({
                url: 'https://test.com/login',
                data: {
                  username: 'zhangsan',   // 用户输入的账号
                  password: 'pwd123456',  // 用户输入的密码
                  code: res.code
                },
                success: function(res) {
                  // 登录成功
                  if (res.statusCode === 200) {
                   console.log(res.data.sessionId)  // 服务器回包内容
                  }
                }
              })
            } else {
              console.log('获取用户登录态失败!' + res.errMsg)
            }
          }
        });
      }
    })

        3、 到微信服务器,换取微信用户身份id

          到了第3步,开发者的后台就拿到了前边wx.login()所生成的微信登录凭证code,此时就可以拿这个code到微信服务器换取微信用户身份。微信服务器为了确保拿code过来换取身份信息的人就是刚刚对应的小程序开发者,到微信服务器的请求要同时带上AppId和AppSecret,这两个信息在小程序管理平台的开发设置界面可以看到,由此可以看出,AppId和AppSecret是微信鉴别开发者身份的重要信息,AppId是公开信息,泄露AppId不会带来安全风险,但是AppSecret是开发者的隐私数据不应该泄露,如果发现泄露需要到小程序管理平台进行重置AppSecret,而code在成功换取一次信息之后也会立即失效,即便凭证code生成时间还没过期。

          开发者服务器和微信服务器通信也是通过HTTPS协议,微信服务器提供的接口地址是:https://api.weixin.qq.com/sns/jscode2session?appid=<AppId>&secret=<AppSecret>&js_code=<code>&grant_type=authorization_code

          URL的query部分的参数中 <AppId>, <AppSecret>, <code> 就是前文所提到的三个信息,请求参数合法的话,接口会返回以下字段:

     

    字段 描述
    openid 微信用户的唯一标识
    session_key 会话密钥
    unionid 用户在微信开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。

                                                                    (jscode2session接口返回字段

     

          我们暂时只要关注前两个字段即可,openid就是前文一直提到的微信用户id,可以用这个id来区分不同的微信用户。session_key则是微信服务器给开发者服务器颁发的身份凭证,开发者可以用session_key请求微信服务器其他接口来获取一些其他信息,由此可以看到,session_key不应该泄露或者下发到小程序前端。

          可能我们会好奇为什么要设计session_key,如果我们每次都通过小程序前端wx.login()生成微信登录凭证code去微信服务器请求信息,步骤太多造成整体耗时比较严重,因此对于一个比较可信的服务端,给开发者服务器颁发一个时效性更长的会话密钥就显得很有必要了。session_key也存在过期时间,因为篇幅关系,我们不在此展开,可以参考小程序的官方文档关于session_key的相关介绍。

     

        4、 绑定微信用户身份id和业务用户身份

          在第2节提到,业务侧用户还没绑定微信侧身份时,会让用户填写业务侧的用户名、密码,这两个值会和微信登录凭证一起请求开发者服务器的登录接口,此时开发者后台通过校验用户名密码就拿到了业务侧的用户身份id,通过code到微信服务器获取微信侧的用户身份openid。微信会建议开发者把这两个信息的对应关系存起来,我们把这个对应关系称之为“绑定”。

          有了这个绑定信息,小程序在下次需要用户登录的时候就可以不需要输入账号密码,因为通过wx.login()获取到code之后,可以拿到用户的微信身份openid,通过绑定信息就可以查出业务侧的用户身份id,这样静默授权的登录方式显得非常便捷。

        5 、业务登录凭证SessionId

          第3节已经说到微信侧返回的session_key是开发者服务器和微信服务器的会话密钥。同样道理,“开发者服务器”和“开发者的小程序”应该也有会话密钥(开发者服务器自己的session_key),在本书中我们就把它称之为SessionId。

          用户登录成功之后,开发者服务器需要生成会话密钥SessionId,在服务端保持SessionId对应的用户身份信息,同时把SessionId返回给小程序。小程序后续发起的请求中携带上SessionId,开发者服务器就可以通过服务器端的Session信息查询到当前登录用户的身份,这样我们就不需要每次都重新获取code,省去了很多通信消耗。

           下面是如何利用本地数据缓存的能力,把SessionId存储起来,以便在它还没过期的时候能重复利用,以提高通信的性能。

     

        6、缓存用户登录态SessionId

           处理用户登录态的一般方法,通常用户在没有主动退出登录前,用户的登录态会一直保持一段时间,就无需用户频繁地输入账号密码。如果我们把SessionId记录在Javascript中某个内存变量,当用户关闭小程序再进来小程序时,之前内存的SessionId已经丢失,此时我们就需要利用本地缓存的能力来持久化存储SessionId。

    代码清单 利用本地缓存持久存储用户登录态SessionId

    // page.js
    varapp = getApp()  
    Page({
      onLoad: function() {
        // 调用wx.login获取微信登录凭证
        wx.login({
          success: function(res) {
            // 拿到微信登录凭证之后,去自己服务器换取自己的登录凭证
            wx.request({
              url: 'https://test.com/login',
              data: { code: res.code },
              success: function(res) {
                var data = res.data
                // 把 SessionId 和过期时间,放在内存中的全局对象和本地缓存里边
                app.globalData.sessionId =data.sessionId
                wx.setStorageSync('SESSIONID',data.sessionId)
                // 假设登录态保持1天
                var expiredTime = +new Date() +1*24*60*60*1000
                app.globalData.expiredTime =expiredTime
                wx.setStorageSync('EXPIREDTIME',expiredTime)
              }
            })
          }
        })
      }
    })

    在重新打开小程序的时候,我们把上一次存储的SessionId内容取出来,恢复到内存。

    代码清单  利用本地缓存,恢复用户登录态SessionId

    // app.js
    App({
      onLaunch: function(options) {
        var sessionId = wx.getStorageSync('SESSIONID')
        var expiredTime = wx.getStorageSync('EXPIREDTIME')
        var now = new Date()
        if (now - expiredTime <=1*24*60*60*1000) {
          this.globalData.sessionId = sessionId
          this.globalData.expiredTime = expiredTime
        }
      },
      globalData: {
        sessionId: null,
        expiredTime: 0
      }
    })

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 微信授权APP第三方登陆(Android)

    万次阅读 热门讨论 2017-09-13 14:43:01
    微信第三方登录 Android 微信原生登录

    前几天负责的程序说是要加入第三方登陆的功能,虽然现在有服务商集成了第三方登陆,但是平时所用的也就微信和QQ,就自己看文档写了,其中也遇到了一些问题,然后我把我做这个的流程贴出来,并附上对应的Demo,运行Demo前请将Android的SDK以及依赖包的版本升级到最新。

    1:首先如果要使用微信的第三方登陆功能,必须要有微信官方认证的微信开放平台开发者账号,这个需要300一年,当然,还有很多其他很好的功能。

    2:对你要接入第三方登陆的应用进行申请,申请通过之后,可以获取到关键的AppID和AppSecret,申请的时候有两个地方要注意,这里写图片描述

    应用包名是指在你的AndroidManifest文件下的package中的内容,

    这里写图片描述

    应用签名工具在微信开放平台中资源下载中的Android资源下下载,之后在你的手机上运行,输入你的应用包名即可得到。

    3:下面就是正式开始操作代码,将微信的开发工具包导入你项目的libs目录中。
    这里写图片描述

    4:在AndroidManifest.xm添加权限支持,代码如下。

        <uses-permission         android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    5:将你的应用程序注册到微信,只有这样你的程序启动后,微信才能响应你的程序,我是在重写Application的类中注册的,代码如下:

    public class App extends Application {
    
        public static final String WX_APPID = "wxb53411a37963b886";
        public static final String WX_APPSecret = "d72be30f31c81dcc507d8c08c0d700f8";
    
        private IWXAPI api;
    
        @Override
        public void onCreate() {
            super.onCreate();
            api = WXAPIFactory.createWXAPI(this, WX_APPID, true);
            api.registerApp(WX_APPID);
        }
    }

    6:在你的程序包下新建一个名为wxapi的包,并在下面新建一个名为WXEntryActivity的类,并实现IWXAPIEventHandler接口。其中微信发送给第三方应用的请求将会回调onReq方法,第三方应用发送到微信的请求的响应结果将回调nResp方法。在成功响应微信登陆请求后我会发送一个广播,并存储获得的code。code是获取access_token所必需的,具体可以参考微信的文档。代码如下:

    public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    
        private IWXAPI api;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            api = WXAPIFactory.createWXAPI(this, App.WX_APPID, false);
            //将你收到的intent和实现IWXAPIEventHandler接口的对象传递给handleIntent方法
            api.handleIntent(getIntent(), this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            api.handleIntent(intent, this);
            finish();
        }
    
        @Override
        public void onReq(BaseReq baseReq) {
    
        }
    
        @Override
        public void onResp(BaseResp baseResp) {
            String result = "";
            switch (baseResp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    String code = ((SendAuth.Resp) baseResp).code;
                    SharedPreferences WxSp = getApplicationContext().getSharedPreferences(PrefParams.spName, Context.MODE_PRIVATE);
                    SharedPreferences.Editor WxSpEditor = WxSp.edit();
                    WxSpEditor.putString(PrefParams.CODE,code);
                    WxSpEditor.apply();
                    Intent intent = new Intent();
                    intent.setAction("authlogin");
                    WXEntryActivity.this.sendBroadcast(intent);
                    finish();
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    result = "发送取消";
                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED:
                    result = "发送被拒绝";
                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                    finish();
                    break;
                default:
                    result = "发送返回";
                    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
    
                    finish();
                    break;
            }
        }
    }

    然后还需要在AndroidManifest中队新添加的类进行注册,并将exported属性设置为true(表示该Activity可以被其它程序调用)。

    7:微信授权流程如下:这是官网上看的
    这里写图片描述
    按照流程来,请求code,代码如下:

    private void weChatAuth() {
            if (api == null) {
                api = WXAPIFactory.createWXAPI(getActivity(), App.WX_APPID, true);
            }
            SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "wx_login_duzun";
            api.sendReq(req);
        }

    执行该操作之后会拉起微信打开授权登陆页面,然后你操作的结果会返回到我们第六步建立的WXEntryActivity类中,若同意请求则可以获取到code执行接下来的操作。

    8:通过code获取access_token,按下面的请求可以获取access_token

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

    这里的APPID和SECRET就是我们申请应用时获得的。
    正确返回如下:

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

    我是这样实现的

    public void getAccessToken(){
    
            SharedPreferences WX_Sp = getApplicationContext().getSharedPreferences(PrefParams.spName, Context.MODE_PRIVATE);
            String code = WX_Sp.getString(PrefParams.CODE, "");
             final SharedPreferences.Editor WX_SpEditor = WX_Sp.edit();
    
            String url  = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                    + App.WX_APPID
                    + "&secret="
                    + App.WX_APPSecret
                    + "&code="
                    + code
                    + "&grant_type=authorization_code";
            Utils.log("获取access_token的地址"+url);
            HttpUtil.sendHttpRequest(url, new HttpCallBackListener() {
                @Override
                public void onFinish(String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        String access_token = jsonObject.getString("access_token");
                        Utils.log("---------access_token---------"+access_token);
                        String openid = jsonObject.getString("openid");
                        Utils.log("---------open_id---------"+openid);
                        String refresh_token = jsonObject.getString("refresh_token");
                        if (!access_token.equals("")) {
                            WX_SpEditor.putString(PrefParams.ACCESS_TOKEN, access_token);
                            WX_SpEditor.apply();
                        }
                        if (!refresh_token.equals("")) {
                            WX_SpEditor.putString(PrefParams.REFRESH_TOKEN, refresh_token);
                            WX_SpEditor.apply();
                        }
                        if (!openid.equals("")) {
                            WX_SpEditor.putString(PrefParams.WXOPENID, openid);
                            WX_SpEditor.apply();
                            ThirdLoginWeChat(access_token, openid);
    
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                @Override
                public void onError(Exception e) {
                    Utils.showToast(LoginActivity.this, "通过code获取数据没有成功");
                }
            });
        }

    因为只是登陆而已,所以我没有请求refresh_token,也很简单,获取到access_token之后按照要求请求就可以了,

    9:最后一步就是获取你需要的第三方登陆的用户个人信息了
    请求说明

    http请求方式: GET
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
    可以获取到用户的昵称,性别,城市,头像等你需要的信息,我的请求代码如下:

    “`
    private void ThirdLoginWeChat(String access_token, String openid) {

        String url  = "https://api.weixin.qq.com/sns/userinfo?access_token="
                + access_token
                + "&openid="
                + openid;
    
        HttpUtil.sendHttpRequest(url, new HttpCallBackListener() {
            @Override
            public void onFinish(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    Utils.log(jsonObject.toString()+"-------获取个人信息---");
                    String nickName = jsonObject.getString("nickname");
                    String sex = jsonObject.getString("sex");
                    String province = jsonObject.getString("province");
                    String city = jsonObject.getString("city");
                    String country = jsonObject.getString("country");
                    String headimgurl = jsonObject.getString("headimgurl");
                    String privilege = jsonObject.getString("privilege");
                    String unionid = jsonObject.getString("unionid");
    
    
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onError(Exception e) {
    
            }
        });
    }```
    

    更详细的Demo里面都有,有什么不清楚的地方可以留言,当然鉴于我个人的初级水平,错误的地方希望加以斧正。感谢~

    demo链接

    demo演示图片:

    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • 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

    展开全文
  • 微信网页二维码授权登陆

    万次阅读 2018-07-24 16:00:28
    PHP网站应用开发 微信三方扫码登陆   开发示例下载地址 1.微信开放平台配置 授权域名 (微信开放平台https://open.weixin.qq.com/) 进入管理中心 -&gt; 网站应用-&gt;点击对应的公众号配置授权域名 审核...
  • 微信第三方登录接口

    万次阅读 2018-02-04 13:58:51
    随着手机微信的崛起,腾讯发布的微信联登确实很诱惑pc端的伙伴们,现在就说说在pc端用微信扫一扫实现微信第三方登陆的方式。  第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请) ...
  • 最近使用weexplus做了个app 用户需要的是可以使用第三方微信实现登录,于是我就去weexplus 官网了,发现还整有个wechat插件。于是直接就整合到应用里去了。接下来就开始了我的一路填坑之旅了… 一、插件不可用 ...
  • 微信网页版无法登录

    万次阅读 热门讨论 2018-05-15 10:46:16
    你可以通过Windows微信、Mac微信或者手机客户端微信登录导致微信无法登录解决方法:清除浏览器的history然后重新登录就可以了不过发现这个方法在每次登录前都要执行,否则问题还是会出现.目前还没有找到更好的解决...
  • 微信登录获取昵称乱码解决方法

    万次阅读 2016-04-14 12:05:28
    把获取的微信昵称,放到要转码的地方,就正常了。
  • 微信登陆无法拉起授权界面

    万次阅读 2016-04-20 12:55:44
    最近几天做微信登陆,我们的登陆页面是H5写的,点击微信登陆按钮,调用安卓的javascript接口,进而调用微信SDK进行登陆,但是我的手机经常拉不起来授权界面,烦恼了好久,原来是自己疏忽大意造成的,在微信开放平台...
  • 微信登录失败,10003

    千次阅读 2018-06-07 14:29:22
    1、微信端页面地址:2、3、
  • # 开发了一个页面h5的页面,想让其实现微信登录,求帮助。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • 微信授权登陆界面无法再次弹出,无法用户切换 一开始在项目中总是发现微信登录只在第一次给用户授权,后面微信登录后就不显示授权登录的界面。这样就导致微信用户无法切换,无法进行新用户的授权。查了很久才...
  • 清理微信浏览器网页缓存的办法

    万次阅读 2017-12-25 15:31:15
    微信开发是件非常蛋疼的事情,微信网页的缓存是更加蛋疼的东西,今天遇到的问题:一个页面在web开发工具上可以正常授权并获取到openid,放在手机上就死活不行,网上找来的办法如下: 使用微信内置的浏览器打开...
  • web 网页登录 微信授权

    千次阅读 2018-11-30 08:32:59
    接口步骤: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&amp;t=resource/res_list&amp;verify=1&amp;id=open1419316505&amp;token=&amp;lang=zh_CN ...
  • 注:要是系统原生桌面,360桌面、搜狗桌面都是不可以,都需要退出)在操作之前先不要登陆微信。 如果在使用桌面助手,先退出 按住Enter(回车键)不放,选中微信图标,快速点击鼠标左键 点击次数大于3次,速度越...
  • 1. 问题描述 我之前在用微信的时候,因为重置了一下手机,所以再次登录微信的时候,提示需要验证。...然后怎么也跳不过这个步骤。...1,首先,要选中微信登陆界面的三个点,然后选择找回密码。 2,然后选择获得...
  • 怎么用creator实现微信授权登入? 可以用anysdk吗? 求详解
  • mac电脑双开微信的方法

    万次阅读 2017-04-18 17:02:52
    很多时候为了工作和方便,需要双开微信,那么怎么在苹果电脑上双开微信呢,下面介绍一种方法; 1、按照正常方式先登录一个微信; 2、在应用程序里面找到微信这个应用   3、...
  • 今天微信开发者工具不显示二维码,很尬,找了好了方法,最满意的一个如下,如果解决了,记得给我点赞 电脑上无法登录微信的解决方法: 1、先退出电脑微信登录页面 2、按Win+E快捷键,打开资源管理器 3、在...
1 2 3 4 5 ... 20
收藏数 41,957
精华内容 16,782
关键字:

微信登陆