集成第三方虽然有第三方的,但是第三方集成兼容问题,以及不太好修改。等问题。所以这篇是写给需要集成微信登录的。我尽可能详细,方便大家一次完成,减少时间成本。
如果比较啰嗦的地方,请不要介意,跳过即可。
1.第一大步:
第一步:获得对应参数。检查环境
登录微信开发平台:https://open.weixin.qq.com/
第二步:
获得Appid(必须),Appsecret(必须) ,保存。
public class API {
public static String WX_APPID=”wx2821e7a6a3ada08a”;
public static String WX_AppSecret=”938e1df7698342bdf2dde5031c658213”;
}
第三步:(非必需,如果获得Code后请求微信服务器,报错appid错误,检查这步)
应用签名不能有冒号,用命令行工具生成的MD5会有冒号。最好用微信签名生成工具。
配置基本完成了。
工具资源地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=d914a1d0def9667e020392cfd4462fe7bdd72db0&lang=zh_CN
第二大步:实现授权,获得code
第一步:配置库
Android Stuoid:
在build.gradle 下配置:
compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’
Eclipse,见微信开发平台的Android接入指南
第二步:配置权限
第三步:在Application 的 onCreate()注册。我用工具类封装一遍。后面有资源供给大家下载。
@Override
public void onCreate() {
super.onCreate();
LoginTools.initLoginTools(this);
}
public class LoginTools {
public static IWXAPI mWxApi;
public static void initLoginTools(Application mContext){
//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
mWxApi = WXAPIFactory.createWXAPI(mContext, API.WX_APPID, false);
// 将该app注册到微信
mWxApi.registerApp(API.WX_APPID);
}
}
第四步:调起微信授权登录界面,
public static void wxLogin(Context mContext) {
if (!mWxApi.isWXAppInstalled()) {
Tools.toast(mContext,”你还没有安装微信!”);
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
req.state = “diandi_wx_login”;
mWxApi.sendReq(req);
}
第五步:在包名目录下新建一个名字为wxapi的包,并在wxapi包下新建一个
Activity,名字为:WXEntryActivity 。在,对应xml中加上, android:exported=”true”
注意:1。不是Java类,是需要在xml配置的
Activity, 2.不是 WXPayEntryActivity,这个是用于微信支付的,不是微信登录。
特别注意: 1.是继承 Activity, 最好不是其他父类不然有可能收不到回调。
第六步:实现 implements IWXAPIEventHandler ,并且重写onNewIntent(Intent intent),
在OnonCreate ,调用handleIntent。
Activity代码:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//如果没回调onResp,八成是这句没有写LoginTools.handleIntent(getIntent(), this);
}@Override
protected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);if (!LoginTools.handleIntent(getIntent(), this)) {finish();}
}@Override
public void onReq(BaseReq baseReq) {
}@Override
public void onResp(BaseResp baseResp) {
}
}
LoginTools代码:
public static boolean handleIntent(Intent intent, IWXAPIEventHandler var2){
if (intent==null){
return false;
}
return mWxApi.handleIntent(intent,var2);
}
第三大步: 根据code,获得登录信息。经过上面,已经实现拉起微信。下面就是获得用户信息,
希望就在眼前。
第一步,判断code是佛正常。
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
//成功获得回调。
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) baseResp).code;
break;//失败。返回值为-6,检查下,第一大步的,第三步。 default:break;
}
}
第二步,根据Code请求微信的服务器,获得token。
public static void geyUserInfo(BaseResp baseResp){
//1. get请求。 2.这里的请求方式可以多变,可以手动去拼接 get的参数。 我这里是封装的请求。
// grant_type的值固定为 :authorization_code
// get的请求完整地址格式为为:
/*
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的APPID&secret=你的SECRET&code=你的CODE&grant_type=authorization_code
*/
String code = ((SendAuth.Resp) baseResp).code;
String url ="https://api.weixin.qq.com/sns/oauth2/access_token";
RequestParams params = new RequestParams();
//grant_type
params.put("grant_type","authorization_code");
params.put("code",code);
params.put("appid", API.WX_APPID);
params.put("secret",API.WX_AppSecret);
MyHttp.Get(url, params, new TextHandler() {@Overridepublic void onSuccess(int header, Object response) {}@Overridepublic void onFailure(Throwable error) {}
});
}
第三步:
得到或者解析返回的数据。
正确:
{
“access_token”:”ACCESS_TOKEN”,
“expires_in”:7200,
“refresh_token”:”REFRESH_TOKEN”,
“openid”:”OPENID”,
“scope”:”SCOPE”,
“unionid”:”o6_bmasdasdsad6_2sgVt7hMZOPfL”
}
错误:
{“errcode”:40029,”errmsg”:”invalid code”}
如果返回的数据的appid,secretid错误,那么看下你请求服务器的完整地址。不要把我那串完整地址,当url,然后还在后面拼接参数。我就是犯过这个错误。找了半天。。。至于其他你只能自行解决。
第四步,最后一步了,用 openid,access_token,去请求用户信息。跟上面一样,get请求。
Url为: https://api.weixin.qq.com/sns/userinfo
String code = ((SendAuth.Resp) baseResp).code;
String url =”https://api.weixin.qq.com/sns/userinfo”;
RequestParams params = new RequestParams();
//grant_type
params.put(“openid”,“上面获取的openid”);
params.put(“access_token”,“access_token”);
MyHttp.Get(url, params, new TextHandler() {
@Override
public void onSuccess(int header, Object response) {
}@Overridepublic void onFailure(Throwable error) {}
});
}
/*
正确的返回
*/
{
“openid”:”OPENID”,
“nickname”:”NICKNAME”,
“sex”:1,
“province”:”PROVINCE”,
“city”:”CITY”,
“country”:”COUNTRY”,
“headimgurl”: “http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0“,
“privilege”:[
“PRIVILEGE1”,
“PRIVILEGE2”
],
“unionid”: ” o6_bmasdasdsad6_2sgVt7hMZOPfL”
}
/*
错误的返回
*/
{
“errcode”:40003,”errmsg”:”invalid openid”
}
第五步,请求自己服务器的授权登录接口,然后自行解决后续跳转等等。。
完。
工具类代码:
public class LoginTools {
public static IWXAPI mWxApi;
public static void initLoginTools(Application application){//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。mWxApi = WXAPIFactory.createWXAPI(application, API.WX_APPID, false);// 将该app注册到微信mWxApi.registerApp(API.WX_APPID);
}public static void wxLogin(Context mContext) {if (!mWxApi.isWXAppInstalled()) {Tools.toast(mContext,"你还没有安装微信!");return;}final SendAuth.Req req = new SendAuth.Req();req.scope = "snsapi_userinfo";req.state = "diandi_wx_login";mWxApi.sendReq(req);
}public static boolean handleIntent(Intent intent, IWXAPIEventHandler var2){if (intent==null){return false;}return mWxApi.handleIntent(intent,var2);
}public static void geyUserInfo(String code){//1. get请求。 2.这里的请求方式可以多变,可以手动去拼接 get的参数。 我这里是封装的请求。// grant_type的值固定为 :authorization_code// get的请求完整地址格式为为:/*https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的APPID&secret=你的SECRET&code=你的CODE&grant_type=authorization_code*/String url ="https://api.weixin.qq.com/sns/oauth2/access_token";RequestParams params = new RequestParams();//grant_typeparams.put("grant_type","authorization_code");params.put("code",code);params.put("appid", API.WX_APPID);params.put("secret",API.WX_AppSecret);MyHttp.Get(url, params, new TextHandler() {@Overridepublic void onSuccess(int header, Object response) {//请求成功!//成功后JSONObject jsonObject = JSONObject.parseObject(response.toString());String openid = jsonObject.getString("openid");String access_token = jsonObject.getString("access_token");//请求用户信息,代码在上面第4部。需要自己的网络请求方式,//我就忽略不写了。RequestWXInfo(openid,access_token);}@Overridepublic void onFailure(Throwable error) {//请求失败!}});
}
}
最后,里面我涉及到的工具类,我就发代码的方式。就不上传了。至于有什么
不足的欢迎评论,如果遇到了bug了请百度解决,我收到你的消息时估计都好几天了,如果你能等,就评论吧。