Android 微信授权登陆
</pre>在公司实习做网页,需要做app的微信授权登陆,由于没有人做过android,有过有一点经验的我就瞬间转战android了,废话不多说,直接上干货。</h2><div><span style="white-space:pre"> </span> 看微信开放平台的微信授权接入指南其实一切都已经足够了,个人觉得微信的文档写得实在有点蛋疼,对于一个初做者的话,感觉有点迷茫,下面我就仔细分析一下过程吧。</div><div></div><div>1.在微信开放平台上申请appid。到管理中心->创建移动应用,微信上说一个周申请成功,一般只要一天就可以通过了。申请的时候,有两个东西可能会不好理解,一个是应用包名,如下图:</div><div><img src="https://img-blog.csdn.net/20150811164119404?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="600" height="200" alt="" /></div><div></div><div>或者也可以到AndroidManifest.xml文件中查看,具体位置如代码:</div><div></div><div><pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cm.senguo"android:versionCode="1"android:versionName="1.0" >
另外一个需要填写的是应用签名,这个官网上说了,有专门的签名生成工具,你可以先把自己的app安装到自己的手机,然后下载安装签名生成工具,即可根据包名生成相应的签名。填写好这些信息之后等待审核即可。
<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"/>
到这里,相关配置就基本上完成了,接下来就可以相关代码的处理了。
</pre><pre name="code" class="java">public class WXEntryActivity extends Activity implements IWXAPIEventHandler{// IWXAPI 是第三方app和微信进行通信的openapi接口public static IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(api==null){ / / 创建微信api对象,获取<span style="font-family: Arial, Helvetica, sans-serif;">IWXAPI 实例</span>api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);}// 根据在微信开放;平台注册的appid注册appapi.registerApp(Constants.APP_ID);
<strong> <span style="background-color: rgb(255, 255, 51);"> //我在做微信授权功能的时候就是因为下面这句话的位置没有放对,然后一直导致的结果是能够拉起微信授权的页面,但是一旦点击确定授权之后就什么都没有了,后来通过各种调试,才发现在 发送请求到微信之前就必须调用这个函数,目的是将<span style="color: rgb(34, 34, 34); font-family: 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Helvetica, Arial, Tahoma, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWX//API接口,所以必须在接下来的发送页面请求之前调用,切记。。。</span></span></strong>api.handleIntent(getIntent(),this);if (!api.isWXAppInstalled()){ //判断用户是否安装了微信客户端Toast.makeText(WXEntryActivity.this,"你还没有安装微信,请安装合适版本的微信",Toast.LENGTH_LONG).show();return;}//发送启动页面请求,我在实际做的时候又遇到了问题,我做了两个app,但是在使用<pre name="code" class="java">//req.openId=Constants.APP_ID;
//这句代码的时候发现了一个奇怪的现象,我这句话不能调用,找了半天发现问题在于我自动导入包的时候两个app导入的包不一样:
//其中一个是:
//import com.tencent.mm.sdk.constants.ConstantsAPI;
//import com.tencent.mm.sdk.modelbase.BaseReq;
//import com.tencent.mm.sdk.modelbase.BaseResp;
//import com.tencent.mm.sdk.modelmsg.SendAuth;
//import com.tencent.mm.sdk.modelmsg.SendAuth.Resp;
//另一个是:
//import com.cm.senguoadmin.Constants;
//import com.tencent.mm.sdk.openapi.BaseReq;
//import com.tencent.mm.sdk.openapi.BaseResp;
//import com.tencent.mm.sdk.openapi.ConstantsAPI;
//import com.tencent.mm.sdk.openapi.IWXAPI;
//你发现区别了吗?后来我在网上查到了有人也遇到过这种问题,因为最新的包并不需要这个openid,好吧,自己注意吧~
final SendAuth.Req req=new SendAuth.Req();req.openId=Constants.APP_ID;req.scope="snsapi_userinfo";req.state="carjob_wx_login";api.sendReq(req);
//到此,微信授权页面就可以拉起了}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}//下面的函数是微信授权的时候等待用户确认调用的,微信会自动调用,因此不需要自己显示调用@Overridepublic void onReq(BaseReq req) {switch (req.getType()) {case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:break;case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:break;
// 授权case ConstantsAPI.COMMAND_SENDAUTH:break;default:break;}}
//以下函数微信在授权成功后会自动调用,我们如果需要拉去微信信息的话,就可以在<span style="font-family: Arial, Helvetica, sans-serif;">case BaseResp.ErrCode.ERR_OK:后面添加代码</span>
@Overridepublic void onResp(BaseResp resp) {int result = 0;Bundle bundle=new Bundle();switch (resp.errCode) {case BaseResp.ErrCode.ERR_OK:result = R.string.errcode_success;resp.toBundle(bundle);Resp sp=new Resp(bundle);final String code=sp.code; //针对具体导入的包不同,这里会有所不同,我做的时候一个需要sp.code,但是一个却是sp.token,好吧,不过,虽然长相不一一样,但是//功能却是相同的
<strong style="background-color: rgb(255, 255, 51);">//不要以为现在你就已经大工告成了,下面的这个问题一定会让你欲哭无泪的,那就是android访问网路一定要新开线程,也就是说不能在主线程中进行访问网络或者画图等比较耗时的操作,一定要注意这个啊,我因为这个研究了一整天</strong>new Thread(){@Overridepublic void run(){
//这个函数是我封装的获取微信信息的函数,见后面的代码goToGetMsg(code);}}.start();this.finish();break;case BaseResp.ErrCode.ERR_USER_CANCEL:break;case BaseResp.ErrCode.ERR_AUTH_DENIED:break;case ConstantsAPI.COMMAND_SENDAUTH:break;default:result = R.string.errcode_unknown;break;}}
对于goToGetMsg(code)函数,主要就是根据code获取微信个人信息,具体分为两步:
通过code获取access_token
获取第一步的code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
APPID和SECRET都是注册app的时候获得的,此处不多说。
通过access_token调用接口
获取access_token后,进行接口调用,
httpUrl="https://api.weixin.qq.com/sns/userinfo?access_token="+ACCESS_TOKEN+"&openid="+OPENID;
到此,微信信息就可以获取了,然后可以对得到的返回数据进行处理,返回数据识json格式,具体处理过程此处步详细叙述了。最后,附上代码片段:
private void goToGetMsg(String code) {String result = null;// http地址URL url = null;HttpURLConnection connection = null;InputStreamReader in = null;try {url = new URL("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constants.APP_ID+"&secret="+Constants.APP_SECRET+"&code="+code+"&grant_type=authorization_code");connection = (HttpURLConnection) url.openConnection();in = new InputStreamReader(connection.getInputStream());BufferedReader bufferedReader = new BufferedReader(in);StringBuffer strBuffer = new StringBuffer();String line = null;while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line);}result = strBuffer.toString();Log.v("str",result);} catch (Exception e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();}if (in != null) {try {in.close();} catch (IOException e) {e.printStackTrace();}}}String ACCESS_TOKEN=null;String OPENID=null;try {JSONObject datajson=new JSONObject(result);ACCESS_TOKEN=datajson.getString("access_token");OPENID=datajson.getString("unionid");} catch (JSONException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}String httpUrl="https://api.weixin.qq.com/sns/userinfo?access_token="+ACCESS_TOKEN+"&openid="+OPENID;
// String httpUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constants.APP_ID+"&secret="+Constants.APP_SECRET+"&code="+code+"&grant_type=authorization_code";// HttpGet连接对象HttpGet httpRequest = new HttpGet(httpUrl);try {// 取得HttpClient对象HttpClient httpclient = new DefaultHttpClient();// 请求HttpClient,取得HttpResponseHttpResponse httpResponse = httpclient.execute(httpRequest);// 请求成功if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 取得返回的字符串String strResult = EntityUtils.toString(httpResponse.getEntity());JSONObject user;String unionid = null;String openid = null;String country=null;String province=null;String city=null;String headimgurl=null;String nickname=null;int sex=0;try {user=new JSONObject(strResult);unionid=user.getString("unionid");openid=user.getString("openid");country=user.getString("country");province=user.getString("province");city=user.getString("city");headimgurl=user.getString("headimgurl");nickname=user.getString("nickname");sex=user.getInt("sex");} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}String info="http://test123.senguo.cc/customer/weixinphoneadmin?openid="+openid+"&unionid="+unionid+"&country="+country+"&province="+province+"&city="+city+"&headimgurl="+headimgurl+"&nickname="+nickname+"&sex="+sex;finish();Intent intent=new Intent(WXEntryActivity.this,Senguo_admin.class);Bundle bundle=new Bundle();bundle.putCharSequence("URL", info);intent.putExtras(bundle);startActivity(intent);} else {Log.e("error","请求错误!");}} catch (ClientProtocolException e) {Log.e("duizhan",e.getMessage().toString());} catch (IOException e) {Log.e("duizhan",e.getMessage().toString());} catch (Exception e) {Log.e("duizhan",e.getMessage().toString());}}
总结:具体需要注意的东西在过程中都一一记录了,以前做android都没有涉及到种调用第三方api的内容,经过这次实践,最深的体会就是要仔细看相关api的文档。说点别的吧,这是我的第一篇博客,写得有点粗糙,以后慢慢改进吧,不过技术这种东西,干活为主吧。希望自己以后越走越好~~good luck
Android 微信授权登陆相关推荐
- 微信授权登陆接入第三方App(步骤总结)Android。
这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...
- 微信授权登陆接入第三方App(步骤总结)Android
微信授权登陆接入第三方App(步骤总结) 这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移 ...
- 微信授权登陆介入第三方APP
这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...
- 微信授权登陆【yixiyun】
1,引入相关依赖(主要是最后一个) <dependency><groupId>com.github.binarywang</groupId><artifact ...
- 如何实现自有App上的小程序第三方微信授权登陆?
对于微信小程序来说,有 OpenID 或 UnionID 作为唯一标识,微信授权登陆小程序账号是很容易实现的,但对于其他应用上的小程序来说(如支付宝.百度等),打通该登陆方式是比较麻烦的. 之前在Fi ...
- java 实现微信授权登陆
附官方文档地址:小程序登陆 | 微信开放文档 编码前准备工作:开发之前我们需要准备两个东西AppID和AppSecret,需要到微信开放平台(https://open.weixin.qq.com)注册 ...
- web pc端 微信授权登陆 实例详解
首先,看看微信官方文档,了解一下具体实现步骤 微信官方文档: 微信登陆开发指南 基本了解了微信登陆的流程后,然后我们再来一起踩坑 1.先去微信公众平台申请网站,appId,设置域名 2.调用微信地址生 ...
- 微信授权登陆界面无法再次弹出,无法用户切换
微信授权登陆界面无法再次弹出,无法用户切换 一开始在项目中总是发现微信登录只在第一次给用户授权,后面微信登录后就不显示授权登录的界面.这样就导致微信用户无法切换,无法进行新用户的授权.查了很久才找到解 ...
- uniapp微信公众号微信授权登陆实现
正常不需要支付的项目一般不需要做微信授权登陆,有业务需要的可以加,我这边项目中使用了微信支付功能所以需要搞个微信授权登陆 进入到登陆页面首先要执行 onLoad(options) {if (optio ...
- Oauth2.0 安全性(以微信授权登陆为例)
前言 用户 A 要使用微信账号登陆 Z 平台(www.z.com),一个黑客 H 想要把使用微信账号登陆 Z 平台的用户 A 转到恶意网站(www.h.com)来侵犯 A 的隐私 为什么要校验 red ...
最新文章
- Deep learning:二十二(linear decoder练习)
- python购物车实现的功能是什么_Python3实现购物车功能
- centos 编译内核至2.6.39.4
- php获取2次跳转之后的网址,爬虫:获取多次跳转后的页面url
- 私藏很久的几个优质技术公众号
- 一些比较舒服的rgb配色 (含rgb值,可参考)
- [javaweb]jsp+servlet+mysql购书网站
- 十年磨一剑,奋进新征程!麒麟信安在上交所科创板成功上市
- 在64位win10中开启64位ie浏览器的方法(IE11)
- cognos使用自定义函数_将单点登录添加到您的IBM Cognos 8自定义Java身份验证提供程序
- keras h5—darknet weights模型相互转换
- fx3u4ad一adp说明书_FX3U-4AD-PT-ADP用户手册FX3U-4AD-PT-ADP使用说明书 - 三菱
- 仿网易LOFTER视差滚动列表
- Java面试:数据库,Java,框架,前端技术。应有尽有
- QCC514x-QCC304x(headset)系列(入门篇)之1.1-QCC3044之基本介绍
- Linux驱动概念扫盲篇【转】
- LPC1768的P0.27,P0.28管脚作为GPIO口输出需要外接上拉电阻才能输出高电平
- 聚类(K-means)实现手写数字识别
- 涂鸦智能进击南美取暖器市场
- Linux中配置RAID磁盘阵列