东学西读
关注微信号,发送demo获取github上的demo吧!
现在利用第三方平台登录APP已经是很普通的方式,现在记一下利用微信登录APP的过程。
上面的图片是描述使用微信登录的过程:
2、APP使用申请得的APPID与微信联系
3、微信平台会向APP发送一个code
4、APP利用获得的code和APPID、secrect向微信平台获取access_token、openid
5、APP使用获取得的access_token、openid获取用户的基本信息,如昵称、性别、国家等。
具体做法
第一步:获取APPID和secrect
在微信开发平台创建应用,填写APP的包名和签名(签名不是SHA1,要使用第三方工具安装到手机输入APP的包名获取),审核通过后会有APPID和secrect.
第二步:环境集成
从微信官网下载SDK集成到项目libs中,并在包名路径下创建名为xwapi的文件夹
第三步:在wxapi内创建WXEntryActivity
在wxapi内创建WXEntryActivity,并implements IWXAPIeventhandler,
在manifest中加入Android:exported="true",如
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"></activity>
第四步:在有微信登录的Activity加入接口信息
在有微信登录的Activity加入接口信息,一般都是在weclome界面或login界面,加入。如:
public class MainActivity extends AppCompatActivity {public static IWXAPI api;
private String WXAPP_ID="";//申请到的APPID
@Override
protected void onCreate(Bundle savedinstanceState) {
super.onCreate(savedInstanceState);
setcontentView(R.layout.activity_main);
api= WXAPIFactory.createWXAPI(this,WXAPP_ID,true);
final SendAuth.Req req = new SendAuth.Req();
req.scope="snsapi_userinfo";
req.state="none";
api.sendReq(req);
//
}
}
第五步:在WXEntryActivity实现对接功能
第四步与微信通信之后,会弹出一个授权窗口,提醒用户是否使用微信登录APP,点击确定之后微信会回调WXEntryActivity中的onResp方法,把code传为BaseResp传过来,我们就可以用这个code一步步获取accesstoken,再获取用户信息。如:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
// IWXAPI 是第三方app和微信通信的openapi接口
//private IWXAPI api;
private static final int RETURN_MSG_TYPE_LOGIN = 1;
private static final int RETURN_MSG_TYPE_SHARE = 2;
private String code;
private String tokenJson;//access_token串
private boolean accesss_token_effective;//access_token是否有效
private String openId;//openId
private String refresh_token;
private String access_token="";
private String unionid;
private String userInfoJson;//用户信息json串
private String WXAPP_ID="";//申请到的APPID
private String WXAppSecret="";//申请到的Secret
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_wxentry);
MainActivity.api.handleintent(getIntent(), this);
}
@Override
public void onReq(BaseReq req) {
toast.maketext(this, "onReq方法被调用!", Toast.LENGTH_LONG).show();
switch (req.getType()) {
case constantsAPI.commaND_GETmessage_FROM_WX:
goToGetMsg();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
//goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}
private void goToGetMsg() {
Intent intent = new Intent(this, MainActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
finish();
}
@Override
public void onResp(BaseResp baseResp) {
Toast.makeText(this, "onResp方法被调用!", Toast.LENGTH_LONG).show();
int result = 0;
//String id=baseResp.openId;
Log.e("ERRORCode", "结果---" + baseResp.errCode);
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
switch (baseResp.getType()) {
case RETURN_MSG_TYPE_LOGIN:
//拿到了微信返回的code,立马再去请求access_token
code = ((SendAuth.Resp) baseResp).code;
Log.e("ErrorCode", "code---" + code);
getAccess_token(code);
//获取用户信息
getUserInfo();
break;
case RETURN_MSG_TYPE_SHARE:
//AppData.showToast("微信分享成功");
Toast.makeText(this, "微信分享成功", Toast.LENGTH_LONG).show();
finish();
break;
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
break;
case BaseResp.ErrCode.ERR_AUTH_denied:
break;
default:
break;
}
}
/**
* 通过code获取access_token
* @param code
* @return
*/
private String getAccess_token(String code) {
final String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WXAPP_ID + "&secret=" +WXAppSecret +
"&code=" + code + "&grant_type=authorization_code";
new Thread(new Runnable() {
@Override
public void run() {
String result =getURLresponse(url);
tokenJson = result;
Log.e("tokenJson", "tokenJson====" + tokenJson);
try {
jsonobject jsonObject = new JSONObject(result);
access_token = jsonObject.getString("access_token");
refresh_token = jsonObject.getString("refresh_token");
openId = jsonObject.getString("openid");
unionid = jsonObject.getString("unionid");
Log.e("access_token", "access_token====" + access_token);
Thread.currentThread().sleep(1000);//毫秒
} catch (JSONException ex) {
ex.printstacktrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}).start();
return tokenJson;
}
/**
* 由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查
* 判断token是否有效
*
* @param access_token
* @param openId
* @return
*/
private boolean checkToken(String access_token, String openId) {
final String url = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + openId;
new Thread(new Runnable() {
@Override
public void run() {
String result = getURLResponse(url);
try {
JSONObject jsonObject = new JSONObject(result);
if (jsonObject.getString("errcode").equals("0")) {
//返回0表示accesss_token有效
accesss_token_effective=true;
}else if(jsonObject.getString("errcode").equals("40003")){
//返回40003表示accesss_token无效
accesss_token_effective=false;
}
} catch (JSONException ex) {
ex.printStackTrace();
}
}
}).start();
return accesss_token_effective;
}
/**
* 刷新重新获取accesss_token
* @return
*/
private String getRefresh_token(){
final String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+WXAPP_ID+"&grant_type=refresh_token&refresh_token="+refresh_token;
new Thread(new Runnable() {
@Override
public void run() {
String result = getURLResponse(url);
try {
JSONObject jsonObject = new JSONObject(result);
access_token=jsonObject.getString("access_token");
} catch (JSONException ex) {
ex.printStackTrace();
}
}
}).start();
return access_token;
}
private String getUserInfo() {
//access_token为空,延时500毫秒,再回调自己,等上个线程获取access_token为空
//此处还应该判断
if (access_token.equals("")) {
Timer timer=new Timer();//实例化Timer类
timer.schedule(new TimerTask(){
public void run(){
System.out.println("退出");
this.cancel();}},500);//五百毫秒
getUserInfo();
} else {
final String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openId;
new Thread(new Runnable() {
@Override
public void run() {
String result = getURLResponse(url);
userInfoJson = result;
//打出用户信息
Log.e("userInfo", "userInfo====" + userInfoJson);
}
}).start();
}
return userInfoJson;
}
/**
* 获取指定URL的响应字符串
* @param urlString
* @return
*/
public String getURLResponse(String urlString){
HttpURLConnection conn = null; //连接对象
InputStream is = null;
String resultData = "";
try {
URL url = new URL(urlString); //URL对象
conn = (HttpURLConnection)url.openConnection(); //使用URL打开一个链接
conn.setDoInput(true); //允许输入流,即允许下载
conn.setDoOutput(true); //允许输出流,即允许上传
conn.setUsecaches(false); //不使用缓冲
conn.setrequestMethod("GET"); //使用get请求
is = conn.getInputStream(); //获取输入流,此时才真正建立链接
inputstreamreader isr = new InputStreamReader(is);
BufferedReader bufferReader = new BufferedReader(isr);
String inputLine = "";
while((inputLine = bufferReader.readLine()) != null){
resultData += inputLine + "\n";
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn != null){
conn.disconnect();
}
}
return resultData;
}
}
文章最后发布于: 2016-05-14 18:52:32
相关阅读
本文是【浅析微信支付】系列文章的第九篇,主要讲解商户下载对账单接口和资金账单接口的实现和一些注意事项。 浅析微信支付系列已
微信好友删除怎么找回?年轻人有时候就是比较任性,动不动拉黑删除好友,然后事后又后悔想重新加回来,何必呢?虽然小编就是这样所以研究了
微信天天用,但以下10个超好用的技巧和微信十大潜规则,你不一定都知道!东胜资讯集团总裁安东胜告诉你信十个技巧和十大潜规则。一、
微信是我们日常生活使用频率很高的社交APP,还有许多像微信支付、微信朋友圈、微信小程序等等实用的功能,它不止用于生活上也用在工
微信删除的语音聊天记录怎么恢复?有人问我微信数据删除了还怎么还原啊?今天我在网上查找了一下,居然那么多人都在询问微信聊天记录怎