zoukankan      html  css  js  c++  java
  • 微信授权登录,关于调不起授权页面,无法响应回调方法,获取不到code 详解

    前期准备工作:申请AppId,下载资源包jar、文档等。

    微信授权登录步骤:

    1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;(第1步官方文档写得很模糊分散,做微信授权登录的时候遇到很多问题,现在总结记录下来)

    2. 通过code参数加上AppID和AppSecret等,通过API换取access_token,openid;

    3. 通过access_token和openid进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    注意:

      1.想要正常调起微信授权登录页面,应用包名和签名必须是和申请AppId时上传的应用保持一致,否则无法调起微信授权登录页面。Debug签名是无法调起微信授权登录页面的。

          2.想要接收微信返回值,也就是响应回调方法,必须做到以下3步操作:

          a.新建一个包:应用包名.wxapi(应用包名必须是你申请AppId时应用的包名),在wxapi目录下新建WXEntryActivity类,该类继承自Activity,并在manifest文件里面配置WXEntryActivity时,加上exported属性,设置为true

          b.实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

          c.在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图

              该代码写在onCreate方法里,请把AppId替换成你自己的AppId

           当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

           WXEntryActivity无需设置界面,通过onResp(BaseResp resp)拿到返回的resp,resq的类型是com.tencent.mm.sdk.modelmsg.SendAuth$Resp,强转成SendAuth.Resp,就能通过resq.code拿到code,把code发送给后台服务器,后台通过code就能拿到access_token和oppenid,通过access_token和oppenid就能拿到用户信息进行注册登录了,然后把信息再返回给前端应用,整个授权登录就OK了。

     

    第一步:请求CODE移动应用微信授权登录

    SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "wechat_sdk_demo_test";
    api.sendReq(req);

    注:请求CODE这段代码写在点击微信登录的Activity(或Fragment或View)里边。不能写在WXEntryActivity,否则无法响应WXEntryActivity的回调方法。

    第二步和第三步由后台服务器来做,实现用户注册登录再返回给前端应用。这样就实现了微信授权登录。

     

    F.A.Q

    1. 什么是授权临时票据(code)?

    答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。

    WXEntryActivity类代码如下(ConstantApi.APP_ID_WX为APP_ID )
    public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    
        private static final String TAG = "WXEntryActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            IWXAPI api = WXAPIFactory.createWXAPI(this, ConstantApi.APP_ID_WX, true);
            api.handleIntent(getIntent(), this);
        }
    
        @Override
        public void onReq(BaseReq req) {
            Log.e(TAG, "onReq...");
        }
    
        @Override
        public void onResp(BaseResp resp) {
            Log.e(TAG, "onResp...");
            String code = null;
            switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK://用户同意,只有这种情况的时候code是有效的
                code = ((SendAuth.Resp) resp).code;
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
    
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
    
                break;
    
            default://发送返回
    
                break;
            }
            finish();
        }
  • 相关阅读:
    页面整体布局思路
    CSS3转换、过渡、动画效果及css盒子模型
    CSS随笔
    CSS基础,认识css样式
    HTML基础表单
    HTML基础
    java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433
    There is no Action mapped for namespace / and action name accredit.
    myeclipse开启后卡死、building workspace缓慢 问题解决
    you need to upgrade the working copy first
  • 原文地址:https://www.cnblogs.com/andy2simple/p/4160004.html
Copyright © 2011-2022 走看看