zoukankan      html  css  js  c++  java
  • android开发实现微信三方登录

    android开发实现微信三方登录

    标签: 微信开放平台三方登录微信开放平台android开发HttpClient
     分类:

    需要了解的知识:OATH2的简单机制。http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html这篇文章写得很清晰(谢谢作者)。

    基本流程(从微信官方文档截图):(说的很详细)

    自己理解:首先使用appId在手机客户端向微信开放平台发起请求---->返回code零时票据,让后客户端请求自己的服务器端(code作为参数)---->服务器使用code加上app ID河appSecret(不能放在客户端,容易泄露)向微信开放平台发起请求---->返回access_token。然后服务器端就可以根据access_token获取到授权用户的一些信息。

    下面是我的代码实现:

    第一部分:(客户端)

    第一个页面:

    /**

     * 发起请求的页面,只有一个按钮

     * @author ylh

     *

     */

    public class YlhActivity extends Activity {

    String APP_ID = "******";//改成你自己的APP_ID

    private IWXAPI api;

    private Button btn_sanfangLogin_activity_main;

    public static String uuid = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    btn_sanfangLogin_activity_main = (Button) findViewById(R.id.btn_sanfangLogin_activity_main);

    api = WXAPIFactory.createWXAPI(this, APP_ID);

    api.registerApp(APP_ID);

    btn_sanfangLogin_activity_main

    .setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    if (!api.isWXAppInstalled()) {

    Toast.makeText(YlhActivity.this, "未安装微信客户端,请先下载",

    Toast.LENGTH_LONG).show();

    return;

    }

    uuid = UUID.randomUUID().toString();

    final SendAuth.Req req = new SendAuth.Req();

    req.scope = "snsapi_userinfo";

    req.state = uuid;

    System.out.println("state: " + uuid);

    boolean b = api.sendReq(req);

    System.out.println(b);

    }

    });

    }

    }

    第二个页面:

    /**

     * 授权后,微信客户端调用的页面( Android:exported="true")

     * @author ylh

     *

     */

    public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    String APP_ID = "*****";//改成你自己的APP_ID

    private IWXAPI api;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    api = WXAPIFactory.createWXAPI(this, APP_ID);

    api.registerApp(APP_ID);

    api.handleIntent(getIntent(), this);

    }

    @Override

    public void onReq(BaseReq arg0) {

    System.out.println("onRep");

    }

    @Override

    public void onResp(BaseResp resp) {

    System.out.println("onResp");

    switch (resp.errCode) {

    case BaseResp.ErrCode.ERR_OK:

    System.out.println("成功");

    SendAuth.Resp response = (SendAuth.Resp) resp;

    System.out.println(response.state);

    if (response.state == null

    || !response.state.equals(YlhActivity.uuid))

    return;// 判断请求是否是我的应用的请求

    System.out.println(response.code);

    System.out.println(response.country);

    break;

    case BaseResp.ErrCode.ERR_USER_CANCEL:

    System.out.println("quxiao");

    break;

    case BaseResp.ErrCode.ERR_AUTH_DENIED:

    System.out.println("jujue");

    break;

    default:

    break;

    }

    }

    }

    第二部分:(服务器端,使用httpClient向微信开放平台发起请求,使用json-lib-2.4-jdk15.jar解析返回的结果)

    /**

    * 发起get请求的方法

    * @param urlAddress

    * @return

    */

    public static String doGet(String urlAddress) {

    String getUrl = urlAddress;

    HttpGet httpGet = new HttpGet(getUrl);

    HttpParams hp = httpGet.getParams();

    hp.getParameter("true");

    // hp.

    // httpGet.setp

    HttpClient hc = HttpClients.createDefault();

    try {

    HttpResponse ht = hc.execute(httpGet);

    if (ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

    HttpEntity he = ht.getEntity();

    InputStream is = he.getContent();

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    String response = "";

    String readLine = null;

    while ((readLine = br.readLine()) != null) {

    // response = br.readLine();

    response = response + readLine;

    }

    is.close();

    br.close();

    // String str = EntityUtils.toString(he);

    System.out.println(response);

    return response;

    } else {

    return "error";

    }

    } catch (ClientProtocolException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    return "exception";

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    return "exception";

    }

    }

    下面就调用:

    1. 使用客户端传来的code,加上app ID河appSecret(不能放在客户端,容易泄露)向微信开放平台发起请求

    doGet("https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code&appid=***********&secret=***********&code=***********");(***********的地方替换相应的参数)返回access_token和openid

    2. 使用上一步获得的access_token和openid向微信开放平台发起请求,获得用户信息

    String resp = doGet("https://api.weixin.qq.com/sns/userinfo?access_token=**********&openid=***********");

    JSONObject jObject = JSONObject.fromObject(resp);

    String openid = jObject.get("openid").toString();

    String nickname = jObject.get("nickname").toString();

    String sex = jObject.get("sex").toString();

    String language = jObject.get("language").toString();

    String city = jObject.get("city").toString();

    String province = jObject.get("province").toString();

    String country = jObject.get("country").toString();

    String headimgurl = jObject.get("headimgurl").toString();

    String privilege = jObject.get("privilege").toString();

    String unionid = jObject.get("unionid").toString();

    System.out.println(openid);

    System.out.println(nickname);

    System.out.println(sex);

    System.out.println(language);

    System.out.println(city);

    System.out.println(province);

    System.out.println(country);

    System.out.println(headimgurl);

    System.out.println(privilege);

    System.out.println(unionid);

    注:JSONObject使用的是json-lib-2.4-jdk15.jar解析,依赖的jar包有

    commons-beanuitls-1.7.0.jar、commons-collections-3.2.jar、commons-lang-2.4.jar、commons-logging-1.2.jar、ezmorph-1.0.4.jar、json-lib-2.4-jdk15.jar

  • 相关阅读:
    [Leetcode]847. Shortest Path Visiting All Nodes(BFS|DP)
    [Lintcode]Word Squares(DFS|字符串)
    [Lintcode]Inorder Successor in Binary Search Tree(DFS)
    xampp搭建discuz论坛
    Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
    网址备份
    java并发系列
    java创建多线程
    (转)深入理解Java内存模型之系列篇
    (转)Java并发编程:线程池的使用
  • 原文地址:https://www.cnblogs.com/dcxmaozi/p/7125089.html
Copyright © 2011-2022 走看看