搜尋

首頁  >  問答  >  主體

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;
        }
    }
}
某草草某草草2701 天前1201

全部回覆(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
  • 取消回覆