unity探索者之安卓微信登录,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7666348.html
之前写了两篇关于微信分享的博客,其实微信登录、分享、支付博主是一起做的,可惜太忙,一直没时间补上剩下的登录和支付,现在总算是有点时间把这俩内容补上了,先说登录吧。
unity接入微信的登录流程相对分享而言要麻烦些,流程如下:
向微信发起授权 - 微信返回授权信息 - 发送Get请求获取用户信息 - 将openid等用户信息发送至服务器 - 服务器返回登录结果
1、向微信发起请求
/**
* 登录微信,为了工具的通用性,此处的state
* 从unity传入,目前传入的值为固定的"app_wechat"
* 正式使用建议改为随机数加session来校验
*/
public static void LoginWeChat(String state) {
// 发送授权登录信息,来获取code
SendAuth.Req req = new SendAuth.Req();
// 设置应用的作用域,获取个人信息
req.scope = "snsapi_userinfo";
req.state = state;
api.sendReq(req);
}
2、处理微信回调,方式和微信分享相同,具体参考http://www.cnblogs.com/unityExplorer/p/7574561.html
@Override
public void onResp(BaseResp resp) {
switch (resp.getType()){
case 1://授权
if(resp.errCode == BaseResp.ErrCode.ERR_OK){
WechatLogin.GetOpenId("APP_ID", "APP_SECRET",((SendAuth.Resp) resp).code);
}
break;
case 2://分享
UnityPlayer.UnitySendMessage("ShareManager", "WechatCallBack", "" + resp.errCode);
break;
}
finish();
}
3、授权成功后,拿到微信返回的code,然后向微信发送get请求,获取微信登录授权口令,也就是access_token,最后再使用获取到的access_token和openid向微信请求用户数据

// 获取微信登录授权口令
public static void GetOpenId(String appId, String appSecret, String code) {
SendGet("https://api.weixin.qq.com/sns/oauth2/access_token","appid=" + appId +
"&secret=" + appSecret+
"&code=" + code +
"&grant_type=authorization_code",1);
} //发送Get请求获取用户信息
private static void GetUserInfo(String access_token, String openid) {
SendGet("https://api.weixin.qq.com/sns/userinfo","access_token=" + access_token +"&openid=" + openid, 2);
} private static void SendGet(final String url, final String param, final int type) {
//创建异步的Get请求
AsyncTask<Object, Object, String> task = new AsyncTask<Object, Object, String>() {
@Override
protected String doInBackground(Object... params) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
} @Override
protected void onPostExecute(String info) {
switch (type) {
case 1:
try {
JSONObject jsStr = new JSONObject(info);
access_token = jsStr.getString("access_token");
String openId = jsStr.getString("openid");
GetUserInfo(access_token, openId);
} catch (Exception e) {
UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "LoginCallBack", "");
}
break;
case 2:
try {
JSONObject jsStr2 = new JSONObject(info);
jsStr2.put("access_token",access_token);
UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "LoginCallBack", jsStr2.toString());
} catch (Exception e) {
UnityPlayer.UnitySendMessage("ThirdPartySdkManager", "LoginCallBack", "");
}
break;
}
}
};
task.execute();
}
4、处理用户信息并登录
/// <summary> 微信登录回调 </summary>
public void LoginCallBack(string callBackInfo)
{
//openid 普通用户的标识,对当前开发者帐号唯一
//nickname 普通用户昵称
//sex 普通用户性别,1为男性,2为女性
//province 普通用户个人资料填写的省份
//city 普通用户个人资料填写的城市
//country 国家,如中国为CN
//headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
//privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
//unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。多app数据互通保存该值
//access_token 用户当前临时token值,自主添加的值
if (!string.IsNullOrEmpty(callBackInfo))
{
JsonData jd = JsonMapper.ToObject(callBackInfo);
if (!string.IsNullOrEmpty(jd.TryGetString("errcode")))
{
TipManager.Instance.OpenTip(TipType.SimpleTip, "登录失败,请重新授权");
LoadingNode.CloseLoadingNode();
return;
}
LoginPage lp = PageManager.Instance.GetPage<LoginPage>();
lp.Login(jd.TryGetString("unionid"), jd.TryGetString("openid"), jd.TryGetString("access_token"), jd.TryGetString("nickname")
, int.Parse(jd.TryGetString("sex")), jd.TryGetString("headimgurl"));
}
else
TipManager.Instance.OpenTip(TipType.SimpleTip, "登录失败,请重新授权");
}
在实际项目中,处于安全性考虑,可能会有将获取用户信息的步骤放到服务端上的需求,对于这种情况,只要将第3步的第二个阶段和第4步解析去掉,直接将code发送给服务端就好
unity探索者之安卓微信登录,非第三方插件的更多相关文章
- unity探索者之支付宝支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...
- unity探索者之iOS微信登录、分享
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405700.html iOS接入微信的SDK相对于安卓要麻烦一点,除了核心功能代码 ...
- unity探索者之微信分享所有流程,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...
- unity探索者之微信支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8404604.html 相比微信的登录和分享功能,微信支付sdk的接入显得相当简单, ...
- Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)
最近因为公司的项目需要添加一些实用性的功能,需要添加第三方登录及分享,采用的是Mob的SDK,可以先到其官网下载对应的SDK 点击这里,为了方便后期进行数据统计和分析,所以可以先添加一个应用,添加成功 ...
- Android集成第三方微信登录
第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...
- 混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125
最近项目需要做微信登录,于是利用HTML5+ API Reference的OAuth模块管理客户端的用户登录授权验证功能,允许应用访问第三方平台的资源.(链接:https://www.dcloud.i ...
- 详解如何进行第三方App接入微信登录
微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...
- 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...
随机推荐
- 题解 洛谷 P4632 【[APIO2018] New Home 新家】
首先考虑可以用二分答案来解决询问,可以二分一个长度\(len\),若在区间\([x-len,x+len]\)内包含了所有\(k\)种的商店,那么这个\(len\)就是合法的,可以通过二分来求其最小值. ...
- 商品表(spu)、规格表(sku)设计
1. 先做一下专业术语解释:spu和sku 这里拿iphone6s举例,它身上有很多的属性和值, 比如: 毛重: 420.00 g 产地: 中国大陆 容量: 16G, 64G, 128G 颜色: 银, ...
- Git日常操作指南
git status git add . git commit -m "注释" git stash # 每次 push 前 git pull --rebase // 如果有冲突,解 ...
- 还不懂mysql的undo log和mvcc?算我输!
最近一直没啥时间写点东西,坚持分享真的好难,也不知道该分享点啥,正好有人要问我这些东西,所以腾出点时间,写一下这个主题.同样本篇可以给读者承诺,听不懂或者没收获算我输,哈哈! 众所周知,mysql中读 ...
- Android中Activity的启动模式和使用场景
一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...
- 什么是 A/B 测试?
1.什么是A/B 测试?有什么用? 做过App功能设计的读者朋友可能经常会面临多个设计方案的选择,例如某个按钮是用蓝色还是黄色,是放左边还是放右边. 传统的解决方法通常是集体讨论表决,或者由某位专家或 ...
- PHP mt_getrandmax() 函数
实例 返回通过调用 mt_rand() 函数显示的随机数的最大可能值: <?phpecho(mt_getrandmax()); ?>高佣联盟 www.cgewang.com 定义和用法 m ...
- luogu P4887 模板 莫队二次离线 莫队 离线
LINK:模板莫队二次离线 很早以前学的知识点 不过 很久了忘了. 考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个. 不 ...
- Spring学习总结(6)-@Component和@ComponentScan注解
参考文档:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/core.html#beans-ste ...
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
本文是精讲RestTemplate第2篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 RestTemplate只是对其他的HTTP客 ...