public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = WXEntryActivity.class.getSimpleName();
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;//微信api对象
private String weixinCode;//token
private static String get_access_token = "";
// 获取第一步的code后,请求以下链接获取access_token
public 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";
public static void startActivity(Context context, Bundle bundle) {
Intent intent = new Intent(context, WXEntryActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtras(bundle);
context.startActivity(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.entry);
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID, false);
api.registerApp(Constants.WX_APP_ID);
api.handleIntent(getIntent(), this);
WXLogin();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
WXLogin();
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
Log.d(TAG, "onReq ,req.getType=" + req.getType());
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onResp ,resp=" + resp);
int result = 0;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.errcode_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
default:
result = R.string.errcode_unknown;
break;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
requestToken(resp);
}
/**
* 登录微信
*/
private void WXLogin() {
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "none";
api.sendReq(req);
}
private void requestToken(BaseResp resp)
{
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
// code返回
weixinCode = ((SendAuth.Resp)resp).token;
UpMiLog.d(TAG, "weixinCode or token=" + weixinCode);
/*
* 将你前面得到的AppID、AppSecret、code,拼接成URL
*/
Thread thread = null;
try
{
get_access_token = getCodeRequest(weixinCode);
thread=new Thread(downloadRun);
thread.start();
}catch (Exception e)
{
e.printStackTrace();
}
try {
thread.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 获取access_token的URL(微信)
* @param code 授权时,微信回调给的
* @return URL
*/
public static String getCodeRequest(String code) {
String result = null;
GetCodeRequest = GetCodeRequest.replace("APPID",
urlEnodeUTF8(Constants.WX_APP_ID));
GetCodeRequest = GetCodeRequest.replace("SECRET",
urlEnodeUTF8(Constants.WX_APP_SECRET));
GetCodeRequest = GetCodeRequest.replace("CODE",urlEnodeUTF8( code));
result = GetCodeRequest;
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() {
@Override
public void run() {
WXGetAccessToken();
}
};
/**
* 获取access_token等等的信息(微信)
*/
private void WXGetAccessToken(){
HttpClient get_access_token_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");
String get_user_info_url=getUserInfo(access_token,openid);
WXGetUserInfo(get_user_info_url);
} else {
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* 获取用户个人信息的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;
}
/**
* 获取微信用户个人信息
* @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");
UpMiLog.d(TAG,"openid=" + openid + " ,nickname=" + nickname + " ,headimgurl=" + headimgurl);
} else {
UpMiLog.d(TAG,"response.getStatusLine.getStatusCode not ok.");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}