1.创建应用
2.进入应用详情,填写应用的签名与包名
注意:
- 1.应用签名需要通过下载APK,进行生成
https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk
填写应用相关的包名,得到相关签名
- 2.这里必须要填写,否则导致后期调用接口出错。
3.回到应用进行相关的代码配置
- 首先要判断当前是否安装了微信APP
- 通过OAuth2.0进行授权,跳转到微信进行登录得到code
- 通过code参数加上AppID和AppSecret等,通过API换取access_token;
- 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作
4.调用接口的流程
- 移动授权微信登录
Android平台应用授权登录接入代码示例(请参考Android接入指南):
// send oauth request
Final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
- 授权登录之后,进行回调根据code获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 | 说明 |
---|---|
appid | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
sercet | 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 |
code | 填写第一步获取的code参数 |
grant_type | 填authorization_code |
返回说明
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
unionid | 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段 |
- 刷新access_token有效期
1.access_token过期,则进行通过refresh_token进行刷新操作
2.access_token未过期,重新调用接口,access_token不会改变,有效期会有所变动
注意: refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
请求方法
获取第一步的code后,请求以下链接进行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_token |
refresh_token | 填写通过access_token获取到的refresh_token参数 |
返回说明
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
- 检验授权凭证(access_token)是否有效
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
参数 | 说明 |
---|---|
access_token | 调用接口凭证 |
openid | 普通用户标识,对该公众帐号唯一 |
返回说明
{
"errcode":0,"errmsg":"ok"
}
- 根据access_token调用接口,获取用户个人信息(UnionID机制)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 | 说明 |
---|---|
access_token | 调用凭证 |
openid | 普通用户的标识,对当前开发者帐号唯一 |
lang | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
返回说明
{
"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"
}
参数 | 说明 |
---|---|
openid | 普通用户的标识,对当前开发者帐号唯一 |
nickname | 普通用户昵称 |
sex | 普通用户性别,1为男性,2为女性 |
province | 普通用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
privilege | 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) |
unionid | 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 |
建议:
开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。
- 同时需要注意的代码块
- 1.要在Androidminfiest.xml配置
AppID:相当于包名(package)
<activity
android:name="AppID.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="com.jifenzhi.android"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
- 2.需要将WXEntryActivity放到路径名AppID.wxapi.WXEntryActivity包下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, HttpsManager.WEIXIN_APP_ID, false);
try {
Intent intent = getIntent();
api.handleIntent(intent, this);
} catch (Exception e) {
e.printStackTrace();
}
}
@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:
// goToGetMsg();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
// goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
finish();
}
@Override
public void onResp(BaseResp resp) {
int result = 0;
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
SendAuth.Resp authResp = (SendAuth.Resp) resp;
final String code = authResp.code;
Observable.just(new HashMapNull())
.concatMap((Function<HashMapNull, ObservableSource<?>>) hashMapNull -> {
hashMapNull.put("code", code);
hashMapNull.put("grant_type", "authorization_code");
hashMapNull.put("appid", WEIXIN_APP_ID);
hashMapNull.put("secret", WEIXIN_APP_SECRET);
return HttpsManager.getInstance().apiService.getWxAccessToken("https://api.weixin.qq.com/sns/oauth2/access_token", hashMapNull);
})
.compose(RxHelper.observableIO2Main(this))
.subscribe(new BaseObserver<Object>() {
@Override
public void onBaseNext(Object data) {
WeiXinTokenModel weiXinTokenModel = (WeiXinTokenModel) data;
Intent intent = new Intent(WXEntryActivity.this, LoginActivity.class);
intent.putExtra("weiXinTokenModel", weiXinTokenModel);
startActivity(intent);
}
@Override
public void onBaseError(String message) {
}
});
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
case BaseResp.ErrCode.ERR_UNSUPPORT:
result = R.string.errcode_unsupported;
break;
default:
result = R.string.errcode_unknown;
break;
}
finish();
}
}
- 3.当应用进行授权登录之后,应用进行回调通过WXEntryActivity类得到code值,并通过code请求接口得到access_token,再通过access_token与openid,请求用户信息接口得到用户信息,并将其保存下来