微信新浪分享成功不走回调
检查微信回调WXEntryActivity是否是在包名路径下,
例如 包名是com.a.b(微信友盟开放平台),那么你这个activity应该放在com.a.b.wxapi文件夹下
包名为com.a.b ,这个activity放在com.a.b.view.wxapi文件夹下 导致微信回调失败(新浪同理)
友盟分享个人小坑
微信分享: -error:错误码:2003 错误信息:分享失败----权限验证失败,请检查你的签名以及该平台Appkey权限.
在确认签名无误已经已打包的情况下存在缓存问题,需要卸载微信以及你的APK从新安装
dispatchMessage(122),这个是用户在本手机已登录,之后又在另一台设备登录,本手机缓存微信已登录状态引起的~
解决方法:点击微信,让手机知道微信处于未登录状态即可
友盟第三方登陆
友盟分享成功后不需要导入任何包
友盟分享个人小坑
1、自定义分享面板中QQ空间分享(withTargetUrl)url会失败,但是单独用new ShareAction((Activity) context).setPlatform(SHARE_MEDIA.QZONE).withTargetUrl(url)就可以使用;
2、新浪微博分享(withTargetUrl)url会失败,.withText(url)也是可以的。
微信openid和UnionID (多公众号如何判断是否是同一人)区别
通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通过UnionID机制来在多公众号之间进行用户帐号互通。
1. 将多个公众号绑定到同一个微信开放平台(open.weixin.qq.com)帐号下,即同一个Union下
2. 通过获取用户基本信息接口中的UnionID来区分用户的唯一性,不过需要注意的是:公众号只有在被绑定到微信开放平台帐号下后,才会获取UnionID。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。换句话说, 同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。
注意两个不同的用户信息
在不同的公众账号下openid是不一样的,而他们的unionid却是一样的。其他的信息不具有唯一性,没有比较意义。但基本信息是一致的。
这样就知道了关注两个公众账号的其实是同一个人。
unionid意义:
对于拥有多个账号的企业来说,unionid可以帮助识别不同公众账号下的用户是否是同一个人。这样在不同账号下对该用户提供的服务可以连续起来了。
还可以去除重复关注的用户数,便于统计真实的关注用户总数。
要第三方登陆的话:
SHARE_MEDIA platform = SHARE_MEDIA.WEIXIN;
UMShareAPI mShareAPI = UMShareAPI.get(this);
mShareAPI.doOauthVerify(this, platform, umAuthListener);
//友盟第三方登陆回调
private UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map
data.toString()//返回的用户参数
}
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();
}
};
微信官方文档,哈哈:
获取用户个人信息(UnionID机制)
接口说明
此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。
请求说明
http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用凭证 |
openid | 是 | 普通用户的标识,对当前开发者帐号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
返回说明
正确的Json返回结果:
{
"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信息,以便以后在不同应用之间进行用户信息互通。
错误的Json返回示例:
{
"errcode":40003,"errmsg":"invalid openid"
}
支付宝登录:
private void setAliAuth() {
MDialog.Builder mDialog = new MDialog.Builder(mContext, "尚未授权,请先前往支付宝授权?");
mDialog.setPositiveButton("去授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Runnable authRunnable = new Runnable() {
@Override
public void run() {
// 构造AuthTask 对象
AuthTask authTask = new AuthTask(IDCardCreditActivity.this);
// 调用授权接口,获取授权结果
//后台生成
//authUrl="apiname=com.alipay.account.auth&app_id=你的APPID&app_name=mc&auth_type=AUTHACCOUNT
// &biz_type=openservice&method=alipay.open.auth.sdk.code.get&pid=你账号的PID&product_id=APP_FAST_LOGIN
// &scope=kuaijie&sign_type=RSA2&target_id=-8979618297616007166&sign=自己生成"
Map result = authTask.authV2(authUrl, true);
Message msg = new Message();
msg.what = SDK_AUTH_FLAG;
msg.obj = result;
mHandlerAli.sendMessage(msg);
}
};
// 必须异步调用
Thread authThread = new Thread(authRunnable);
authThread.start();
}
});
mDialog.create().show();
}
private static final int SDK_AUTH_FLAG = 3;
@SuppressLint("HandlerLeak")
private Handler mHandlerAli = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判断resultStatus 为“9000”且result_code
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
result = authResult.getResult();
MLog.e("授权成功\n" + String.format("authCode:%s", authResult.getResult()));
} else {
// 其他状态值则为授权失败
MyToast.showMessage("授权失败");
}
break;
}
}
}
};