今天写微信登录的时候,参照官方文档上面写,个人感觉官方文档写的不够详细明确,绕了好多弯,这里按照我自己的思路做一个笔记,不见得是最好的方法,但能够实现,如果新手看到,或许能给点提示!
第一步,集成最新SDK到APP
由于我这边客户那边出现点问题,先做的微信支付然后才做的微信登录,所以在导包之前查看下自己是否使用过微信平台的其他功能,如果有的话,不需要再次集成(这句只针对新手)
这里给大家提供文章发表的时候最新的sdk下载链接,下载的时候最好看下发表时间
第二步,注册微信到微信
// APP_ID 替换为你的应用从官方网站申请到的合法appId
public static final String APP_ID = "你申请的appid";
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this, APP_ID, false);
api.registerApp(APP_ID);
这个方法可以写在Application中,也可以写在调用之前,具体看个人的需求吧
第三步,在包名目录下创建文件夹wxapi,然后在此目录下新建WXEntryActivity.Java文件
这里需要注意的是文件名直接规定名,文件夹一定是包名目录下直接建立
第四步,接入微信登录需要以下权限,这些权限在官方文档中有提示
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第五步,配置WXEntryActivity
<activity android:name=".wxapi.WXEntryActivity"//这里也是一次检验的机会,注意自己这么写的时候是否报红
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="你申请的appid" />
</intent-filter>
</activity>
第六步,WXEntryActivity写法,直接上代码吧
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
public static final String APP_ID = "你申请的appid";
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
// 通过WXAPIFactory工厂,获取IWXAPI的实例
api = WXAPIFactory.createWXAPI(this,APP_ID, false);
api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) baseResp).code; //即为所需的code
getToken(code);
break;
}
}
private void getToken(String code) {
RequestParams params = null;
//?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
params = new RequestParams(Urls.WeixinGetToken);
params.addQueryStringParameter("appid",Constants.APP_ID);
params.addQueryStringParameter("secret","官方位置在appid下面,可以重置的,具体代码后面有提示");
params.addQueryStringParameter("code",code);
params.addQueryStringParameter("grant_type","authorization_code");//固定写法
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
String access_token = "";//接口调用凭证。
String expires_in = "";//access_token接口调用凭证超时时间,单位(秒)。
String refresh_token= "";//用户刷新access_token。
String openid = "";//授权用户唯一标识。
String scope = "";//用户授权的作用域,使用逗号(,)分隔
String unionid = "";//当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。
try {
JSONObject job = new JSONObject(result);
access_token = job.getString("access_token");
expires_in = job.getString("expires_in");
refresh_token = job.getString("refresh_token");
openid = job.getString("openid");
scope = job.getString("scope");
unionid = job.getString("unionid");
} catch (JSONException e) {
e.printStackTrace();
}
if(!openid.equals("")){
Log.i("codeeeeee",access_token+"---"+openid+"---"+expires_in+refresh_token+scope+unionid);
//这个位置调用你们后台给的登录接口,别忘了登录成功之后finish()当前activity,不然会停留在空白页
setLogin(access_token,openid);
}else{
Toast.makeText(WXEntryActivity.this,"请检查您的code值",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
Paste_Image.png
secret的位置
第七步,设置跳转
weixin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
}
});
题外,判断access_token是否过期
我这里都是登录一次就记录标识的,下次自动登录,所以对access_token没有做判断,下面附加access_token判断给需要的小伙伴。
- 检查access_token是否有效
由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查,接口为: [https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID](https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID)
传入的参数为accesss_token和openid。
access_token有效时返回的json是:
{ "errcode":0,"errmsg":"ok"}
失效时的返回数据为:
{ "errcode":40003,"errmsg":"invalid openid"}
如果access_token有效,则跳过下一步,失效时需要刷新或续期access_token。
- 刷新accessToken
刷新或续期access_token
接口说明 access_token是调用授权关系接口的调用凭证
由于access_token有效期(目前为2个小时)较短
当access_token超时后,可以使用refresh_token进行刷新
access_token刷新结果有两种:
1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。 refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
接口为: [https://api.weixin.qq.com/sns/oauth2/refresh_token?
appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN](https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN) 参数说明:
appid:应用唯一标识grant_type:固定值,填refresh_tokenrefresh_token:填写前面获取到的refresh_token的值
返回的json数据有:
access_token:接口调用凭证expires_in:access_token接口调用凭证超时时间,单位(秒)refresh_token:用户刷新access_tokenopenid:授权用户唯一标识scope:用户授权的作用域,使用逗号(,)分隔
本文只是对微信的简单集成,发帖时间是好用的,我尽量保证看帖当前时间好用,如不好用希望有人提示下,我更新
二维码.jpg推荐下本人的微信公众号,本博客及其他方面的消息会定期同步到公众号上面!
网友评论