Android 集成微信第三方登陆

最近在项目中加入微信登录,以下是微信登录实现的步骤,希望给大家有所帮助。


第一步:


登录微信开放平台,点击下图中的“创建应用”:

技术分享


创建应用时需要签名,下载下图中签名工具:

技术分享



应用创建完毕后会得到两个值:AppID、AppSecret,这两个值保存好,后面会用到。


第二步:


下载微信的SDK,选择下图的Android开放工具包:

技术分享




将工具包下的  ----->技术分享导入你的项目工程中的-------->技术分享中。


第三步


在你的工程中创建一个包,记住你的包名格式必须是你工程AndroidManifest.xml中的package名+wxapi,如下图中的技术分享

最后包名: net.sourceforge.simcpux.wxapi


在这个包下新建一个WXEntryActivity类,并在这个类中定义下图中的回调方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class WXEntryActivity extends Activity implements IWXAPIEventHandler{  
  2.     private IWXAPI api;  
  3.     private BaseResp resp = null;  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         api = WXAPIFactory.createWXAPI(this, WX_APP_ID, false);  
  8.         api.handleIntent(getIntent(), this);  
  9.     }  
  10.       
  11.       
  12.   
  13.     // 微信发送请求到第三方应用时,会回调到该方法  
  14.     @Override  
  15.     public void onReq(BaseReq req) {  
  16.         finish();  
  17.     }  
  18.   
  19.     // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法  
  20.     @Override  
  21.     public void onResp(BaseResp resp) {  
  22.         String result = "";  
  23.         if (resp != null) {  
  24.             resp = resp;  
  25.         }  
  26.         switch(resp.errCode) {  
  27.             case BaseResp.ErrCode.ERR_OK:  
  28.                 result ="发送成功";  
  29.                 Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  30.                 finish();  
  31.                 break;  
  32.             case BaseResp.ErrCode.ERR_USER_CANCEL:  
  33.                 result = "发送取消";  
  34.                 Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  35.                 finish();  
  36.                 break;  
  37.             case BaseResp.ErrCode.ERR_AUTH_DENIED:  
  38.                 result = "发送被拒绝";  
  39.                 Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  40.                 finish();  
  41.                 break;  
  42.             default:  
  43.                 result = "发送返回";  
  44.                 Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  45.                 finish();  
  46.                 break;  
  47.         }  
  48.     }  
  49.   
  50.     @Override  
  51.     protected void onNewIntent(Intent intent) {  
  52.         super.onNewIntent(intent);  
  53.         setIntent(intent);  
  54.         api.handleIntent(intent, this);  
  55.         finish();  
  56.     }  
  57. }  

在以上方法中,当你登录微信时,出现授权界面时,点击授权后会回调onResp,会得到一个resp,通过这个resp能得到code,通过以下方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. (SendAuth.Resp) .code;  

获取code后,记住这个code后面有用。以上的WX_APP_ID是你创建应用时得到的 AppID。


之后在你项目登录界面的Activity中加入以下代码实现登录授权界面。当你登录授权后回到你的Activity后,会执行Activity的生命周期onResume(),因此建议你在以上WXEntryActivity这个类中将resp保存在全局变量中。

在登录的Activity中添加以下方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainLoginTest extends Activity {  
  2.     public static IWXAPI WXapi;  
  3.     private String weixinCode;  
  4.     private final static int LOGIN_WHAT_INIT = 1;  
  5.     private static String get_access_token = "";  
  6.     // 获取第一步的code后,请求以下链接获取access_token  
  7.     public static String GetCodeRequest = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";  
  8.     //获取用户个人信息  
  9.     public static String GetUserInfo="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";  
  10.       
  11.       
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         // TODO Auto-generated method stub  
  15.         super.onCreate(savedInstanceState);  
  16.     }  
  17.       
  18.     /** 
  19.      * 登录微信 
  20.      */  
  21.     private void WXLogin() {  
  22.         WXapi = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);  
  23.         WXapi.registerApp(WX_APP_ID);  
  24.         SendAuth.Req req = new SendAuth.Req();  
  25.         req.scope = "snsapi_userinfo";  
  26.         req.state = "wechat_sdk_demo";  
  27.         WXapi.sendReq(req);  
  28.   
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onResume() {  
  33.         super.onResume();  
  34.             /* 
  35.              * resp是你保存在全局变量中的 
  36.              */  
  37.             if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {  
  38.                 // code返回  
  39.                 weixinCode = ((SendAuth.Resp)resp).code;  
  40.                 /* 
  41.                  * 将你前面得到的AppID、AppSecret、code,拼接成URL 
  42.                  */  
  43.                 get_access_token = getCodeRequest(weixinCode);  
  44.                 Thread thread=new Thread(downloadRun);  
  45.                 thread.start();  
  46.                 try {  
  47.                     thread.join();  
  48.                 } catch (InterruptedException e) {  
  49.                     // TODO Auto-generated catch block  
  50.                     e.printStackTrace();  
  51.                 }  
  52.             }             
  53.     }  
  54.     /** 
  55.      * 获取access_token的URL(微信) 
  56.      * @param code 授权时,微信回调给的 
  57.      * @return URL 
  58.      */  
  59.     public static String getCodeRequest(String code) {  
  60.         String result = null;  
  61.         GetCodeRequest = GetCodeRequest.replace("APPID",  
  62.                 urlEnodeUTF8(AppConstants.WX_APP_ID));  
  63.         GetCodeRequest = GetCodeRequest.replace("SECRET",  
  64.                 urlEnodeUTF8(AppConstants.WX_APP_SECRET));  
  65.         GetCodeRequest = GetCodeRequest.replace("CODE",urlEnodeUTF8( code));  
  66.         result = GetCodeRequest;  
  67.         return result;  
  68.     }  
  69.     /** 
  70.      * 获取用户个人信息的URL(微信) 
  71.      * @param access_token 获取access_token时给的 
  72.      * @param openid 获取access_token时给的 
  73.      * @return URL 
  74.      */  
  75.     public static String getUserInfo(String access_token,String openid){  
  76.         String result = null;  
  77.         GetUserInfo = GetUserInfo.replace("ACCESS_TOKEN",  
  78.                 urlEnodeUTF8(access_token));  
  79.         GetUserInfo = GetUserInfo.replace("OPENID",  
  80.                 urlEnodeUTF8(openid));  
  81.         result = GetUserInfo;  
  82.         return result;  
  83.     }  
  84.     public static String urlEnodeUTF8(String str) {  
  85.         String result = str;  
  86.         try {  
  87.             result = URLEncoder.encode(str, "UTF-8");  
  88.         } catch (Exception e) {  
  89.             e.printStackTrace();  
  90.         }  
  91.         return result;  
  92.     }  
  93.     public  Runnable downloadRun = new Runnable() {  
  94.   
  95.         @Override  
  96.         public void run() {  
  97.             WXGetAccessToken();  
  98.               
  99.         }  
  100.     };  
  101.       
  102.     /** 
  103.      * 获取access_token等等的信息(微信) 
  104.      */  
  105.     private  void WXGetAccessToken(){  
  106.         HttpClient get_access_token_httpClient = new DefaultHttpClient();  
  107.         HttpClient get_user_info_httpClient = new DefaultHttpClient();  
  108.         String access_token="";  
  109.         String openid ="";  
  110.         try {  
  111.             HttpPost postMethod = new HttpPost(get_access_token);  
  112.             HttpResponse response = get_access_token_httpClient.execute(postMethod); // 执行POST方法  
  113.             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
  114.                 InputStream is = response.getEntity().getContent();  
  115.                 BufferedReader br = new BufferedReader(  
  116.                         new InputStreamReader(is));  
  117.                 String str = "";  
  118.                 StringBuffer sb = new StringBuffer();  
  119.                 while ((str = br.readLine()) != null) {  
  120.                     sb.append(str);  
  121.                 }  
  122.                 is.close();  
  123.                 String josn = sb.toString();  
  124.                 JSONObject json1 = new JSONObject(josn);  
  125.                 access_token = (String) json1.get("access_token");  
  126.                 openid = (String) json1.get("openid");  
  127.               
  128.                   
  129.             } else {  
  130.             }  
  131.         } catch (UnsupportedEncodingException e) {  
  132.             e.printStackTrace();  
  133.         } catch (ClientProtocolException e) {  
  134.             e.printStackTrace();  
  135.         } catch (IOException e) {  
  136.             e.printStackTrace();  
  137.         } catch (JSONException e) {  
  138.             e.printStackTrace();  
  139.         }  
  140.           
  141.         String get_user_info_url=getUserInfo(access_token,openid);  
  142.         WXGetUserInfo(get_user_info_url);  
  143.     }  
  144.       
  145.     /** 
  146.      * 获取微信用户个人信息 
  147.      * @param get_user_info_url 调用URL 
  148.      */  
  149.         private  void WXGetUserInfo(String get_user_info_url){  
  150.             HttpClient get_access_token_httpClient = new DefaultHttpClient();  
  151.             String openid="";  
  152.             String nickname="";  
  153.             String headimgurl="";  
  154.             try {  
  155.                 HttpGet getMethod = new HttpGet(get_user_info_url);  
  156.                 HttpResponse response = get_access_token_httpClient.execute(getMethod); // 执行GET方法  
  157.                 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
  158.                     InputStream is = response.getEntity().getContent();  
  159.                     BufferedReader br = new BufferedReader(  
  160.                             new InputStreamReader(is));  
  161.                     String str = "";  
  162.                     StringBuffer sb = new StringBuffer();  
  163.                     while ((str = br.readLine()) != null) {  
  164.                         sb.append(str);  
  165.                     }  
  166.                     is.close();  
  167.                     String josn = sb.toString();  
  168.                     JSONObject json1 = new JSONObject(josn);  
  169.                     openid = (String) json1.get("openid");  
  170.                     nickname = (String) json1.get("nickname");  
  171.                     headimgurl=(String)json1.get("headimgurl");  
  172.                       
  173.                 } else {  
  174.                 }  
  175.             } catch (UnsupportedEncodingException e) {  
  176.                 e.printStackTrace();  
  177.             } catch (ClientProtocolException e) {  
  178.                 e.printStackTrace();  
  179.             } catch (IOException e) {  
  180.                 e.printStackTrace();  
  181.             } catch (JSONException e) {  
  182.                 e.printStackTrace();  
  183.             }  
  184.               
  185.         }  
  186. }  

根据以上程序,可以获取用户信息、code、openid、access_token



最后一步:

AndroidManifest中添加以下配置代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <activity  
  2.           android:name="net.sourceforge.simcpux.wxapi.WXEntryActivity"  
  3.           android:configChanges="orientation|keyboardHidden"  
  4.           android:exported="true"  
  5.           android:launchMode="singleTop"  
  6.           android:screenOrientation="portrait"  
  7.           android:theme="@android:style/Theme.Translucent.NoTitleBar" >  
  8.           <intent-filter>  
  9.               <action android:name="android.intent.action.VIEW" >  
  10.               </action>  
  11.   
  12.               <category android:name="android.intent.category.LAUNCHER" />  
  13.           </intent-filter>  
  14.       </activity>  


至此微信登录完毕





转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/44041241

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值