最近有个项目要集成微信第三方登录,而且要求用原生的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;
}
}
}
世界只因有你2017-06-23 09:17:06
问题是从WXEntryActivity 拿到的Code如何回传给MainActivity, 如果图方便的话通过Intent携带这个code, 返回给MainActivity就可以了, 在MainActivity中getIntent再取出这个code. 其次就是可以通过EventBus来解决, 不过有点得不偿失.
看着应该是Unity3D和android的通信问题吧? 网上解决方案蛮多的
伊谢尔伦2017-06-23 09:17:06
泻药。
没集成过微信登录,也没用过U3D,不敢妄下评论。
但是我有个疑问,微信SDK回传的code不应该是通过onActivityResult之类的回传的么?