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


第一步:


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



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




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


第二步:


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





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


第三步


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

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


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

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{private IWXAPI api;private BaseResp resp = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);api = WXAPIFactory.createWXAPI(this, WX_APP_ID, false);api.handleIntent(getIntent(), this);}// 微信发送请求到第三方应用时,会回调到该方法@Overridepublic void onReq(BaseReq req) {finish();}// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法@Overridepublic void onResp(BaseResp resp) {String result = "";if (resp != null) {resp = resp;}switch(resp.errCode) {case BaseResp.ErrCode.ERR_OK:result ="发送成功";Toast.makeText(this, result, Toast.LENGTH_LONG).show();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;}}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);finish();}}

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

(SendAuth.Resp) .code;

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


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

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

public class MainLoginTest extends Activity {public static IWXAPI WXapi;private String weixinCode;private final static int LOGIN_WHAT_INIT = 1;private static String get_access_token = "";// 获取第一步的code后,请求以下链接获取access_tokenpublic static String GetCodeRequest = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";//获取用户个人信息public static String GetUserInfo="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);}/** * 登录微信 */private void WXLogin() {WXapi = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);WXapi.registerApp(WX_APP_ID);SendAuth.Req req = new SendAuth.Req();req.scope = "snsapi_userinfo";req.state = "wechat_sdk_demo";WXapi.sendReq(req);}@Overrideprotected void onResume() {super.onResume();/* * resp是你保存在全局变量中的 */if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {// code返回weixinCode = ((SendAuth.Resp)resp).code;/* * 将你前面得到的AppID、AppSecret、code,拼接成URL */get_access_token = getCodeRequest(weixinCode);Thread thread=new Thread(downloadRun);thread.start();try {thread.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/** * 获取access_token的URL(微信) * @param code 授权时,微信回调给的 * @return URL */public static String getCodeRequest(String code) {String result = null;GetCodeRequest = GetCodeRequest.replace("APPID",urlEnodeUTF8(AppConstants.WX_APP_ID));GetCodeRequest = GetCodeRequest.replace("SECRET",urlEnodeUTF8(AppConstants.WX_APP_SECRET));GetCodeRequest = GetCodeRequest.replace("CODE",urlEnodeUTF8( code));result = GetCodeRequest;return result;}/** * 获取用户个人信息的URL(微信) * @param access_token 获取access_token时给的 * @param openid 获取access_token时给的 * @return URL */public static String getUserInfo(String access_token,String openid){String result = null;GetUserInfo = GetUserInfo.replace("ACCESS_TOKEN",urlEnodeUTF8(access_token));GetUserInfo = GetUserInfo.replace("OPENID",urlEnodeUTF8(openid));result = GetUserInfo;return result;}public static String urlEnodeUTF8(String str) {String result = str;try {result = URLEncoder.encode(str, "UTF-8");} catch (Exception e) {e.printStackTrace();}return result;}public  Runnable downloadRun = new Runnable() {@Overridepublic void run() {WXGetAccessToken();}};/** * 获取access_token等等的信息(微信) */private  void WXGetAccessToken(){HttpClient get_access_token_httpClient = new DefaultHttpClient();HttpClient get_user_info_httpClient = new DefaultHttpClient();String access_token="";String openid ="";try {HttpPost postMethod = new HttpPost(get_access_token);HttpResponse response = get_access_token_httpClient.execute(postMethod); // 执行POST方法if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {InputStream is = response.getEntity().getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is));String str = "";StringBuffer sb = new StringBuffer();while ((str = br.readLine()) != null) {sb.append(str);}is.close();String josn = sb.toString();JSONObject json1 = new JSONObject(josn);access_token = (String) json1.get("access_token");openid = (String) json1.get("openid");} else {}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}String get_user_info_url=getUserInfo(access_token,openid);WXGetUserInfo(get_user_info_url);}/** * 获取微信用户个人信息 * @param get_user_info_url 调用URL */private  void WXGetUserInfo(String get_user_info_url){HttpClient get_access_token_httpClient = new DefaultHttpClient();String openid="";String nickname="";String headimgurl="";try {HttpGet getMethod = new HttpGet(get_user_info_url);HttpResponse response = get_access_token_httpClient.execute(getMethod); // 执行GET方法if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {InputStream is = response.getEntity().getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is));String str = "";StringBuffer sb = new StringBuffer();while ((str = br.readLine()) != null) {sb.append(str);}is.close();String josn = sb.toString();JSONObject json1 = new JSONObject(josn);openid = (String) json1.get("openid");nickname = (String) json1.get("nickname");headimgurl=(String)json1.get("headimgurl");} else {}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}}

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



最后一步:

AndroidManifest中添加以下配置代码:

  <activity            android:name="net.sourceforge.simcpux.wxapi.WXEntryActivity"            android:configChanges="orientation|keyboardHidden"            android:exported="true"            android:launchMode="singleTop"            android:screenOrientation="portrait"            android:theme="@android:style/Theme.Translucent.NoTitleBar" >            <intent-filter>                <action android:name="android.intent.action.VIEW" >                </action>                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>


至此微信登录完毕





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


更多相关文章

  1. (转)Android* 应用性能调试
  2. Android原生网络库HttpURLConnection分析——HTTP部分
  3. Android异步操作 AsyncTask
  4. Android读取应用列表权限漏洞
  5. 【Android】获取本机电话号码
  6. Android动态加载第三方APK的View研究过程
  7. Android(安卓)自定义 View 基础之系统坐标系
  8. 增加改查――android数据库篇二
  9. Android获取并显示图片

随机推荐

  1. adnroid(10)(android下的单元测试)
  2. android之壁纸机制
  3. Android使用AsyncTask下载图片并显示进度
  4. Android(安卓)Tools
  5. Android(安卓)显示系统 --- Surface Flin
  6. Android中文API —— VideoView
  7. 下半年我想做的事
  8. Android(安卓)Studio导入Android平台源码
  9. android异步的几种方式
  10. android 编译模块