搜索

首页  >  问答  >  正文

Android集成微信登录

最近有个项目要集成微信第三方登录,而且要求用原生的SDK,客户端是Unity3D开发,所以需要用Android Studio来做个plugin给U3D,网上找了些资料,自己琢磨了一下,有几个问题
1.拉起微信授权后,用户点击了登录,回到MainActivity,但是code却没有获取到,于是我在MainActivity里设置了个lock,还有在onResume方法里判断code是否已经返回了值,虽然能用,但是总觉得好别扭啊
2.这个工程要打成arr文件给u3d用,请问怎么把code传给U3D,后续的获取access_token这些工作都是服务器端完成。
下面是我写的代码,安卓下可以用,一切正常,能获取code,请教一下如何优化我的代码能在用户在微信授权里点完登录回到MainActivity后得到code,而且能打包成arr,u3D可以获取到,非常感谢,下面是我的代码

MainActivity

package com.mazingtec.hxddz;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.mazingtec.hxddz.wxapi.WXEntryActivity;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity implements View.OnClickListener {

    boolean lock = true;
    Button btnWeChat;
    public String code;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnWeChat = (Button) findViewById(R.id.btnWeChat);
        btnWeChat.setOnClickListener(this);
    }

    @Override
    protected  void onResume()
    {
        super.onResume();

        if(WXEntryActivity.isOK && lock)
        {
            lock = false;
            code = WXEntryActivity.CODE;
        }
    }

    private void GetCode()
    {
        IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, WXEntryActivity.APP_ID, true);
        iwxapi.registerApp(WXEntryActivity.APP_ID);

        if (iwxapi != null && iwxapi.isWXAppInstalled()) {
            SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "We_did_it";
            iwxapi.sendReq(req);
        } else
            Toast.makeText(this, "用户未安装微信", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v)
    {
        if(v == btnWeChat)
        {
            GetCode();
        }
    }
}

WXEntryActivity

package com.mazingtec.hxddz.wxapi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

/**
 * Created by wei on 2017/6/21.
 */

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    public static final String APP_ID = "wxopq239o809uqewfojoasidfj";
    private IWXAPI iwxapi;
    public static String CODE;
    public static boolean isOK = false;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        iwxapi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        iwxapi.handleIntent(this.getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent)
    {
        super.onNewIntent(intent);
        setIntent(intent);
        iwxapi.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp)
    {
        switch (baseResp.errCode)
        {
            case BaseResp.ErrCode.ERR_OK:
                //发送成功
                SendAuth.Resp sendResp = (SendAuth.Resp) baseResp;
                if (sendResp != null) {
                    CODE = sendResp.code;
                    isOK = true;
                }
                WXEntryActivity.this.finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                isOK = false;
                WXEntryActivity.this.finish();
                //发送取消
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                isOK = false;
                WXEntryActivity.this.finish();
                //发送被拒绝
                break;
            default:
                isOK = false;
                WXEntryActivity.this.finish();
                //发送返回
                break;
        }
    }
}
某草草某草草2737 天前1222

全部回复(2)我来回复

  • 世界只因有你

    世界只因有你2017-06-23 09:17:06

    1. 问题是从WXEntryActivity 拿到的Code如何回传给MainActivity, 如果图方便的话通过Intent携带这个code, 返回给MainActivity就可以了, 在MainActivity中getIntent再取出这个code. 其次就是可以通过EventBus来解决, 不过有点得不偿失.

    2. 看着应该是Unity3D和android的通信问题吧? 网上解决方案蛮多的

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-23 09:17:06

    泻药。
    没集成过微信登录,也没用过U3D,不敢妄下评论。
    但是我有个疑问,微信SDK回传的code不应该是通过onActivityResult之类的回传的么?

    回复
    0
  • 取消回复