版权声明:本文为原创文章,转载请声明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探索者之安卓微信登录,非第三方插件的更多相关文章

  1. unity探索者之支付宝支付,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405044.html 支付宝的sdk接入方式和微信支付比较类似,大部分的工作也基本 ...

  2. unity探索者之iOS微信登录、分享

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8405700.html iOS接入微信的SDK相对于安卓要麻烦一点,除了核心功能代码 ...

  3. unity探索者之微信分享所有流程,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...

  4. unity探索者之微信支付,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8404604.html 相比微信的登录和分享功能,微信支付sdk的接入显得相当简单, ...

  5. Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)

    最近因为公司的项目需要添加一些实用性的功能,需要添加第三方登录及分享,采用的是Mob的SDK,可以先到其官网下载对应的SDK 点击这里,为了方便后期进行数据统计和分析,所以可以先添加一个应用,添加成功 ...

  6. Android集成第三方微信登录

    第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...

  7. 混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125

    最近项目需要做微信登录,于是利用HTML5+ API Reference的OAuth模块管理客户端的用户登录授权验证功能,允许应用访问第三方平台的资源.(链接:https://www.dcloud.i ...

  8. 详解如何进行第三方App接入微信登录

    微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...

  9. 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇

    第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...

随机推荐

  1. python爬虫入门(3)----- scrapy

    scrapy 简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络 ...

  2. DJANGO-天天生鲜项目从0到1-003-用户模块-登录

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. Promise对象 异步编程

    Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是 ...

  4. PHP中interface的用处

    确实,PHP 接口是有它的目的的.   它们是契约,是给其他开发人员的说明手册.然而,还是很难理解接口有什么用.   基础 接口是抽象的类,无法直接实例化,但是可被实现.   这是一个基本的例 int ...

  5. pdfmake.js使用及其源码分析

    公司项目在需要将页面的文本导出成DPF,和支持打印时,一直没有做过这样的功能,花了一点时间将其做了出来,并且本着开源的思想和技术分享的目的,将自己的编码经验分享给大家,希望对大家有用. 现在是有一个文 ...

  6. 修改alpine Linux的Docker容器的时区

    适用对象 使用 Alpine Linux 发行版的 Docker 镜像容器. 仅仅适用于没有安装uclibc的系统. 修改步骤 进入容器命令行 # docker exec -it container_ ...

  7. SpringBoot2 整合MinIO中间件,实现文件便捷管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.MinIO简介 1.基础描述 MinIO是一个开源的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...

  8. VulnHub靶场学习_HA: Pandavas

    HA: Pandavas Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-pandavas,487/ 背景: Pandavas are the warr ...

  9. Day15_用户注册

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  10. Calibre LVS BOX 详细用法

    https://www.cnblogs.com/yeungchie/ LVS BOX的使用对于后端的团队协作起到非常便利的作用. 通过在lvs rules file添加BOX的相关语句可以达到这个目的 ...