微信登录及注意事项
2017-01-04 17:04
429 查看
直接上登录核心代码
***
demo 地址 http://download.csdn.net/detail/u013134722/9728876
// 1,WXEntryActivity这个类要写在 youpackagename.wxapi 这个包下
2 ,每次测试要用keystore 打包测试
3,注册微信登录平台时,提供的应用签名一定要是 ,用keystore打包安装的apk得到的应用签名 ,(获取签名软件 gensignsture.apk)
<activity
android:name="包名.wxapi.WXEntryActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoDisplay" />
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private final static String APP_ID = " "; // 微信平台AppId
// 微信登录id,SECRET
private final static String APP_SECRET = " "; // 微信平台SECRET
private static Activity mContext;
private static IWXAPI mApi;
private static int mIsLogin = 1;// 0微信分享,1微信登录
String infoStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("after", "WXEntryActivity.onCreate。。。");
super.onCreate(savedInstanceState);
if (mApi != null) {
mApi.handleIntent(getIntent(), this);
Log.e("after", "mApi.handleIntent(getIntent(), this);");
}
Log.e("after", "oncreate");
}
@Override
protected void onDestroy() {
super.onDestroy();
mContext = null;
}
@Override
protected void onNewIntent(Intent intent) {
Log.d(WXEntryActivity.class.getSimpleName(),
"WXEntryActivity.onNewIntent。。。");
super.onNewIntent(intent);
setIntent(intent);
if (mApi != null)
mApi.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
Log.d(WXEntryActivity.class.getSimpleName(),
"WXEntryActivity.onReq => type " + req.getType()
+ " <=> transaction " + req.transaction);
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
Log.e("after", "onResp 微信回调");
if (mContext == null)
return;
String result = "";
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:// (用户同意)
result = "R.string.errcode_success";
if (mIsLogin == 1) {
result = "用户同意";
}
// UIUtil.showMessageText(this, result);
Log.e("after", "用户同意");
// 用户同意授权,对数据进行处理
if (mIsLogin == 1) {// 登录
SendAuth.Resp re = (SendAuth.Resp) resp;
// int expireDate = re.expireDate;// 过期时间
// int errCode = re.errCode;// 错误码
// String errStr = re.errStr;// 错误描述
// String state = re.state; // 状态
String token = re.token;// 应该是类似code
// Log.e("after", "getcode" + token);
// s使用code换取taken
//
final String getAccess_tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ token
+ "&grant_type=authorization_code";
// 分两次与腾讯服务器交互,第一次根据返回的 re.token和自己申请的 秘钥 获取 接入 凭证
// access_token,第二次通过这个凭证连接服务器获取用户数据
// 分两个线程演示
/**
* Thread one
*/
new Thread(new Runnable() {
@Override
public void run() {
getHttpData(getAccess_tokenUrl,
new GetWeixinDataListener() {
@Override
public void getDataOK(String strResult) {
// TODO Auto-generated method stub
JSONObject obj1 = null;
try {
obj1 = new JSONObject(strResult);
String access_token = obj1
.getString("access_token");
String openid = obj1
.getString("openid");
infoStr = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
Log.i("after",
"获取地址 infoStr "
+ infoStr);
/**
* 获取takeon之后获取用户信息 Thread two
*/
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated
// method stub
getHttpData(
infoStr,
new GetWeixinDataListener() {
@Override
public void getDataOK(
final String strResult) {
Log.i("after",
"获取数据 "
+ strResult);
// 在主线程操作UI线程
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(
mContext,
"huqude 数据 "
+ strResult,
1)
.show();
}
});
//根据需要解析获取的数据
JSONObject obj2;
try {
obj2 = new JSONObject(
strResult);
String nickname = obj2
.getString("nickname");
int sex = obj2
.getInt("sex");
String headimgurl = obj2
.getString("headimgurl");
String unionid = obj2
.getString("unionid");
String gender = "未知";
if (sex == 1) {
gender = "男";
} else if (sex == 2) {
gender = "女";
} else {
gender = "未知";
}
Log.i("after",
"获取数据 "
+ nickname
+ "性别 "
+ gender);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}).start();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}).start();
// 获取用户信息
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:// 用户取消)
result = "用户取消";
Log.e("after", "用户取消)");
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:// (用户拒绝授权)
result = "用户拒绝授权";
Log.e("after", "用户拒绝授权)");
break;
default:
result = "默认错误";
Log.e("after", "默认错误)");
break;
}
Toast.makeText(this, "" + result, 0).show();
finish();
}
/**
* 初始化微信
*
* @param mContext
*/
public static void initWXEntry(Context mContext) {
if (mApi == null) {
mApi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);
mApi.registerApp(APP_ID);
}
}
/**
* 微信分享 (这里仅提供一个分享网页的示例,其它请参看官网示例代码)
*
* @param flag
* (0:分享到好友,1:分享到朋友圈)
*/
private static WeChatLoginListener mLoginListener;
public static void login(Activity context, WeChatLoginListener loginListener) {
mLoginListener = loginListener;
mContext = context;
mIsLogin = 1;
if (!mApi.isWXAppInstalled()) {
mLoginListener.loginError("您尚未安装微信");
return;
}
if (!mApi.isWXAppSupportAPI()) {
mLoginListener.loginError("请安装最新版本的微信");
return;
}
// 弹出界面
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "none";
boolean flag = mApi.sendReq(req);
Log.e("after", "调用登录++是否成功" + flag);
}
public interface WeChatLoginListener {
public void loginSuccess(String uuid, String nickname, String photo,
String gender);
public void loginError(String errorMessage);
public void loginCancel();
}
/**
* 将流装成string
*
* @param inputStream
* @return
* @throws Exception
*/
public static String streamUtils(InputStream inputStream) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
return byteArrayOutputStream.toString();
}
/**
* 与腾讯服务器连接获取用户信息
*
* @param strURL
* @param mListener
*/
public void getHttpData(String strURL, GetWeixinDataListener mListener) {
HttpURLConnection connection = null;
try {
URL url = new URL(strURL);
connection = (HttpURLConnection) url.openConnection();
// 设置请求方法,默认是GET
connection.setRequestMethod("GET");
// 设置字符集
connection.setRequestProperty("Charset", "UTF-8");
// 设置文件类型
connection.setRequestProperty("Content-Type",
"text/xml; charset=UTF-8");
// 设置请求参数,可通过Servlet的getHeader()获取
connection.setRequestProperty("Cookie",
"AppName=" + URLEncoder.encode("你好", "UTF-8"));
// 设置自定义参数
connection.setRequestProperty("MyProperty", "this is me!");
if (connection.getResponseCode() == 200) {
InputStream is = connection.getInputStream();
String result = "";
try {
result = streamUtils(is);
mListener.getDataOK(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
/**
* 获取微信数据之后回调
*
* @author zyh
*
*/
public interface GetWeixinDataListener {
void getDataOK(String strResult);
}
}
***
demo 地址 http://download.csdn.net/detail/u013134722/9728876
// 1,WXEntryActivity这个类要写在 youpackagename.wxapi 这个包下
2 ,每次测试要用keystore 打包测试
3,注册微信登录平台时,提供的应用签名一定要是 ,用keystore打包安装的apk得到的应用签名 ,(获取签名软件 gensignsture.apk)
<activity
android:name="包名.wxapi.WXEntryActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoDisplay" />
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private final static String APP_ID = " "; // 微信平台AppId
// 微信登录id,SECRET
private final static String APP_SECRET = " "; // 微信平台SECRET
private static Activity mContext;
private static IWXAPI mApi;
private static int mIsLogin = 1;// 0微信分享,1微信登录
String infoStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("after", "WXEntryActivity.onCreate。。。");
super.onCreate(savedInstanceState);
if (mApi != null) {
mApi.handleIntent(getIntent(), this);
Log.e("after", "mApi.handleIntent(getIntent(), this);");
}
Log.e("after", "oncreate");
}
@Override
protected void onDestroy() {
super.onDestroy();
mContext = null;
}
@Override
protected void onNewIntent(Intent intent) {
Log.d(WXEntryActivity.class.getSimpleName(),
"WXEntryActivity.onNewIntent。。。");
super.onNewIntent(intent);
setIntent(intent);
if (mApi != null)
mApi.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
Log.d(WXEntryActivity.class.getSimpleName(),
"WXEntryActivity.onReq => type " + req.getType()
+ " <=> transaction " + req.transaction);
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
Log.e("after", "onResp 微信回调");
if (mContext == null)
return;
String result = "";
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:// (用户同意)
result = "R.string.errcode_success";
if (mIsLogin == 1) {
result = "用户同意";
}
// UIUtil.showMessageText(this, result);
Log.e("after", "用户同意");
// 用户同意授权,对数据进行处理
if (mIsLogin == 1) {// 登录
SendAuth.Resp re = (SendAuth.Resp) resp;
// int expireDate = re.expireDate;// 过期时间
// int errCode = re.errCode;// 错误码
// String errStr = re.errStr;// 错误描述
// String state = re.state; // 状态
String token = re.token;// 应该是类似code
// Log.e("after", "getcode" + token);
// s使用code换取taken
//
final String getAccess_tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ token
+ "&grant_type=authorization_code";
// 分两次与腾讯服务器交互,第一次根据返回的 re.token和自己申请的 秘钥 获取 接入 凭证
// access_token,第二次通过这个凭证连接服务器获取用户数据
// 分两个线程演示
/**
* Thread one
*/
new Thread(new Runnable() {
@Override
public void run() {
getHttpData(getAccess_tokenUrl,
new GetWeixinDataListener() {
@Override
public void getDataOK(String strResult) {
// TODO Auto-generated method stub
JSONObject obj1 = null;
try {
obj1 = new JSONObject(strResult);
String access_token = obj1
.getString("access_token");
String openid = obj1
.getString("openid");
infoStr = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
Log.i("after",
"获取地址 infoStr "
+ infoStr);
/**
* 获取takeon之后获取用户信息 Thread two
*/
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated
// method stub
getHttpData(
infoStr,
new GetWeixinDataListener() {
@Override
public void getDataOK(
final String strResult) {
Log.i("after",
"获取数据 "
+ strResult);
// 在主线程操作UI线程
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(
mContext,
"huqude 数据 "
+ strResult,
1)
.show();
}
});
//根据需要解析获取的数据
JSONObject obj2;
try {
obj2 = new JSONObject(
strResult);
String nickname = obj2
.getString("nickname");
int sex = obj2
.getInt("sex");
String headimgurl = obj2
.getString("headimgurl");
String unionid = obj2
.getString("unionid");
String gender = "未知";
if (sex == 1) {
gender = "男";
} else if (sex == 2) {
gender = "女";
} else {
gender = "未知";
}
Log.i("after",
"获取数据 "
+ nickname
+ "性别 "
+ gender);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}).start();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}).start();
// 获取用户信息
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:// 用户取消)
result = "用户取消";
Log.e("after", "用户取消)");
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:// (用户拒绝授权)
result = "用户拒绝授权";
Log.e("after", "用户拒绝授权)");
break;
default:
result = "默认错误";
Log.e("after", "默认错误)");
break;
}
Toast.makeText(this, "" + result, 0).show();
finish();
}
/**
* 初始化微信
*
* @param mContext
*/
public static void initWXEntry(Context mContext) {
if (mApi == null) {
mApi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);
mApi.registerApp(APP_ID);
}
}
/**
* 微信分享 (这里仅提供一个分享网页的示例,其它请参看官网示例代码)
*
* @param flag
* (0:分享到好友,1:分享到朋友圈)
*/
private static WeChatLoginListener mLoginListener;
public static void login(Activity context, WeChatLoginListener loginListener) {
mLoginListener = loginListener;
mContext = context;
mIsLogin = 1;
if (!mApi.isWXAppInstalled()) {
mLoginListener.loginError("您尚未安装微信");
return;
}
if (!mApi.isWXAppSupportAPI()) {
mLoginListener.loginError("请安装最新版本的微信");
return;
}
// 弹出界面
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "none";
boolean flag = mApi.sendReq(req);
Log.e("after", "调用登录++是否成功" + flag);
}
public interface WeChatLoginListener {
public void loginSuccess(String uuid, String nickname, String photo,
String gender);
public void loginError(String errorMessage);
public void loginCancel();
}
/**
* 将流装成string
*
* @param inputStream
* @return
* @throws Exception
*/
public static String streamUtils(InputStream inputStream) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
return byteArrayOutputStream.toString();
}
/**
* 与腾讯服务器连接获取用户信息
*
* @param strURL
* @param mListener
*/
public void getHttpData(String strURL, GetWeixinDataListener mListener) {
HttpURLConnection connection = null;
try {
URL url = new URL(strURL);
connection = (HttpURLConnection) url.openConnection();
// 设置请求方法,默认是GET
connection.setRequestMethod("GET");
// 设置字符集
connection.setRequestProperty("Charset", "UTF-8");
// 设置文件类型
connection.setRequestProperty("Content-Type",
"text/xml; charset=UTF-8");
// 设置请求参数,可通过Servlet的getHeader()获取
connection.setRequestProperty("Cookie",
"AppName=" + URLEncoder.encode("你好", "UTF-8"));
// 设置自定义参数
connection.setRequestProperty("MyProperty", "this is me!");
if (connection.getResponseCode() == 200) {
InputStream is = connection.getInputStream();
String result = "";
try {
result = streamUtils(is);
mListener.getDataOK(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
/**
* 获取微信数据之后回调
*
* @author zyh
*
*/
public interface GetWeixinDataListener {
void getDataOK(String strResult);
}
}
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析