相信很多公司的app都有一个功能就是使用微信作为第三方登录,可以去掉中间注册app等繁琐的步骤。 这个问题困扰了我两天。 今天终于弄好了。恕我才疏学浅,微信的开发文档写得不够详细,因此我花了很多时间在此。 废话少说。
step 1:
注册微信开发者,创建app应用,配置相关信息。
記住你的appId 和secret 有用。
step 2. 接入sdk 网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
打开如下图:
那么 step1中的签名如何获取就是这个签名工具那获取的。
step 3. 也是在step中的资源下载那里,下载相关的android开发包,将之放进你的项目中,如何放,这里不细说。
step4. 登录代码:
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = LoginActivity.class.getSimpleName();
private Context mContext;
private Button btnLogin;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mContext = LoginActivity.this;
initViews();
}
private void initViews() {
btnLogin = (Button)findViewById(R.id.btn_login);
btnLogin.setOnClickLis....
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.rel_wechat:
starActivityForResult(new Intent(this, WXEntryActivity.class), 0); // 我在WXEntryActivity注册微信
break;
}
}
}
step 5. 在你的项目新建一个包, 如下图
注意 : c 必須是wxapi这个文件夹, d必须是WXEntryActivity这个名称。 据说是微信规定的。另外,WXEntryActivity这个类,在step2中下载的sample里有这个类。
在WXEntActivity里,如下:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private String weixin_login_url = Constant.ZHJ + "tapp/passport/login_third_party"; // 这个是我公司app自个的登录接口,需要携带微信信息的
/*----------------- 微信登录相关 ----------------*/
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
private String access_token = "";
private String openid = "";
private String unionid = "";
private String nickName = "";
private String icon_url = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.entry);
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, Constant.WEIXIN_APP_ID, false);
api.registerApp(Constant.WEIXIN_APP_ID);
SendAuth.Req req = new SendAuth.Req();
req. scope = "snsapi_userinfo";
req. state = "wechat_sdk_demo_test";
api.sendReq(req);//执行完毕这句话之后,会在WXEntryActivity回调
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
// 微信发送请求到第三方应用时,会回调到该方法
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
finish();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
finish();
break;
default:
break;
}
}
// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 成功
if(resp instanceof SendAuth.Resp){
SendAuth.Resp newResp = (SendAuth.Resp) resp;
//获取微信传回的code
String code = newResp.code;
getWXData(code);
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
System.out.println("-------------b");
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
System.out.println("-------------c");
finish();
break;
default:
System.out.println("-------------d");
finish();
break;
}
}
private void getWXData(String code){
final OKHttpUtil okHttpUtil = new OKHttpUtil();
// 这里的app_id app_secret 都是我们在申请账号时就生成的。 详情看step 1和2
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constant.WEIXIN_APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code";
okHttpUtil.get(url, new OKHttpUtil.BaseCallBack() {
@Override
public void onSuccess(Response response, String json) {
try {
JSONObject obj = new JSONObject(json);
access_token = obj.getString("access_token");
openid = obj.getString("openid");
getToken(okHttpUtil, access_token, openid);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFail(Request request, IOException e) {
}
@Override
public void onError(Response response, int code) {
}
});
}
//我目的是想获取微信用户的参数 用户名, 头像等信息。
private void getToken(OKHttpUtil okHttpUtil, String access_token, String openid){
String url_string = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid;
okHttpUtil.get(url_string, new OKHttpUtil.BaseCallBack() {
@Override
public void onSuccess(Response response, String json) {
try {
JSONObject object = new JSONObject(json);
nickName = object.getString("nickname");
icon_url = object.getString("headimgurl");
unionid = object.getString("unionid");
weixinLogin(icon_url,nickName,unionid); // 自个方法是我公司app登录携带微信用户信息登录的接口。
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFail(Request request, IOException e) {
}
@Override
public void onError(Response response, int code) {
}
});
}
private void weixinLogin(String head_url, String nick, String id){
OKHttpUtil okHttpUtil = new OKHttpUtil();
HashMap<String, String> params = new HashMap<String, String>();
params.put("kind", "weixin");
params.put("icon", head_url);
params.put("nickname", nick);
params.put("account", id);
okHttpUtil.post(weixin_login_url, params, new OKHttpUtil.BaseCallBack() {
@Override
public void onSuccess(Response response, String json) {
System.out.println("--登录成功json-- " +json);
String headPicUrl = "";
String userName = "";
String mark ="";
String token = "";
String userid = "";
String cityname = "";
try {
JSONObject object = new JSONObject(json);
if(object.getInt("error_code")==0){
//微信登录成功
JSONObject data = object.getJSONObject("data");
headPicUrl = data.getString("icon");
userName = data.getString("name");
mark = data.getString("mark");
token = data.getString("token");
userid = data.getString("uid");
cityname = data.getString("cityname");
SharedPreferences saveInfo = getSharedPreferences("User_Info_SP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = saveInfo.edit();
editor.putString("user_name", userName);
editor.putString("head_pic_url", headPicUrl);
editor.putString("mark", mark);
editor.putString("user_id", userid);
editor.putString("token", token);
editor.putString("city_name", cityname);
editor.commit();
setResult(Constant.WEIXIN_LOGIN_RESULTCODE);
finish();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFail(Request request, IOException e) {
}
@Override
public void onError(Response response, int code) {
}
});
}
}