(安卓下,微信登陆或分享需要正确配置包名,签名,appid才能够有效果)
安卓采用jni方式,这里给出java部分代码
注册到微信:
public static IWXAPI wxapi;
private static final String APP_ID = "这里写你的appid";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 注册到微信
wxapi = WXAPIFactory.createWXAPI(this, APP_ID, true);
wxapi.registerApp(APP_ID);
}
登陆方法:
// 登陆到微信
public static void WxLogin() {
Log.v("WeiChatLogin", "login-------------");
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "weichat_sdk_demo";
wxapi.sendReq(req);
}
WXEntryActivity类必须要在包名目录下,如:com.test.test.wxapi.WXEntryActivity
这里给出完整的代码:
package com.xxxxx.xxxx.wxapi;
import org.cocos2dx.cpp.AppActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
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;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("WeiChatLogin","WXEntryActivity onCreate ---------");
}
@Override
public void onReq(BaseReq req) {
// TODO Auto-generated method stub
Log.v("WeiChatLogin", "onReq++++++++++++");
}
@Override
public void onResp(BaseResp resp) {
Log.v("WeiChatLogin", "onResp-------------");
//Bundle bundle = new Bundle();
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 可用以下两种方法获得code
// resp.toBundle(bundle);
// Resp sp = new Resp(bundle);
// String code = sp.code;
// 或者
if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH)//登陆回调
{
Log.v("", "this is WXLogin callBack .... ");
String code = ((SendAuth.Resp) resp).code; // 这里的code就是接入指南里要拿到的code
Toast.makeText(this, "onResp------------- " + code, 6000).show();
//这里写获取到code之后的事件
} else if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX)//分享回调
{
Log.v("", "this is share callBack .... ");
}
finish();//必须要有,用于点击返回游戏的时候不会留在微信
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
Log.v("WeiChatLogin", "login----ERR_USER_CANCEL-");
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
Log.v("WeiChatLogin", "login----ERR_AUTH_DENIED-");
break;
default:
Log.v("WeiChatLogin", "login--unknown---");
break;
}
}
}
因为我们是服务器去获取access_token,故此这里给出网上客户端获取access_token的方法,不保证完全正常使用:
(官方文档规定:获取access_token需要使用get方法)
protected static final int RETURN_OPENID_ACCESSTOKEN = 0;// 返回openid,accessToken消息码
protected static final int RETURN_NICKNAME_UID = 1; // 返回昵称,uid消息码
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case RETURN_OPENID_ACCESSTOKEN:
Bundle bundle1 = (Bundle) msg.obj;
String accessToken = bundle1.getString("access_token");
String openId = bundle1.getString("open_id");
getUID(openId, accessToken);
break;
case RETURN_NICKNAME_UID:
Bundle bundle2 = (Bundle) msg.obj;
String nickname = bundle2.getString("nickname");
String uid = bundle2.getString("unionid");
textView.setText("uid:" + uid);
loginBtn.setText("昵称:" + nickname);
break;
default:
break;
}
};
};
/**
* 获取openid accessToken值用于后期操作
* @param code 请求码
*/
private void getResult(final String code) {
new Thread() {// 开启工作线程进行网络请求
public void run() {
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ APP_ID //这里替换成你的appid
+ "&secret="
+ APP_SECRET //这里替换成你的appsecret
+ "&code="
+ code
+ "&grant_type=authorization_code";
try {
JSONObject jsonObject = JsonUtils
.initSSLWithHttpClinet(path);// 请求https连接并得到json结果
if (null != jsonObject) {
String openid = jsonObject.getString("openid")
.toString().trim();
String access_token = jsonObject
.getString("access_token").toString().trim();
Log.i(TAG, "openid = " + openid);
Log.i(TAG, "access_token = " + access_token);
Message msg = handler.obtainMessage();
msg.what = RETURN_OPENID_ACCESSTOKEN;
Bundle bundle = new Bundle();
bundle.putString("openid", openid);
bundle.putString("access_token", access_token);
msg.obj = bundle;
handler.sendMessage(msg);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return;
};
}.start();
}
/**
* 获取用户唯一标识
* @param openId
* @param accessToken
*/
private void getUID(final String openId, final String accessToken) {
new Thread() {
@Override
public void run() {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ accessToken + "&openid=" + openId;
JSONObject jsonObject = null;
try {
jsonObject = JsonUtils.initSSLWithHttpClinet(path);
String nickname = jsonObject.getString("nickname");
String unionid = jsonObject.getString("unionid");
Log.i(TAG, "nickname = " + nickname);
Log.i(TAG, "unionid = " + unionid);
Message msg = handler.obtainMessage();
msg.what = RETURN_NICKNAME_UID;
Bundle bundle = new Bundle();
bundle.putString("nickname", nickname);
bundle.putString("unionid", unionid);
msg.obj = bundle;
handler.sendMessage(msg);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
};
}.start();
}
在AppController里面要做的:
注册到微信
//Register to weiChat
NSString* appID = @"你的微信appID";
[WXApi registerApp:appID withDescription:@"test"];
注册微信的回调
#pragma mark UMShare WeiChat
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
因为游戏使用C++写的,需要和OC交互,故此这里写了工具类:
WeiChatLogin.hpp
#ifndef WeiChatLogin_hpp
#define WeiChatLogin_hpp
#include "cocos2d.h"
USING_NS_CC;
class WeiChatLogin{
public:
static WeiChatLogin* getInstance();
void sendAuthReq();//这里是微信登录方法
private:
WeiChatLogin();
~WeiChatLogin();
static WeiChatLogin* m_wxLogin;
};
#endif /* WeiChatLogin_hpp */
WeiChatLogin.mm
include "WeiChatLogin.hpp"
#include "WXApiObject.h"
#include "WXApi.h"
WeiChatLogin* WeiChatLogin::m_wxLogin = nullptr;
WeiChatLogin::WeiChatLogin()
{
}
WeiChatLogin::~WeiChatLogin()
{
if (m_wxLogin) {
delete m_wxLogin;
}
m_wxLogin = nullptr;
}
WeiChatLogin* WeiChatLogin::getInstance()
{
if (!m_wxLogin) {
m_wxLogin = new WeiChatLogin();
}
return m_wxLogin;
}
void WeiChatLogin::sendAuthReq()
{
//构造sendAuthReq结构体
SendAuthReq* req = [[[SendAuthReq alloc] init] autorelease];
req.scope = @"snsapi_userinfo";
req.state = @"baibianwx";
[WXApi sendReq:req];
}
WXApiManager.h
#import
#import "WXApi.h"
@protocol WXApiManagerDelegate <NSObject>
@end
@interface WXApiManager : NSObject<WXApiDelegate>
@property (nonatomic, assign) id delegate;
+ (instancetype)sharedManager;
@end
WXApiManager.mm
#import "WXApiManager.h"
#include "WeiChatLogin.hpp"
#include "LoginSceneData.h"
@implementation WXApiManager
#pragma mark - LifeCycle
+(instancetype)sharedManager {
static dispatch_once_t onceToken;
static WXApiManager *instance;
dispatch_once(&onceToken, ^{
instance = [[WXApiManager alloc] init];
});
return instance;
}
- (void)dealloc {
self.delegate = nil;
[super dealloc];
}
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
NSLog(@"onResp-------");
if (WXSuccess == resp.errCode) {
switch (rep.type) /*这里用于区别回调类型*/ {
case 1://Login
NSLog(@"weiChatLogin WXSuccess ------ ");
s_WeiChatCode = [((SendAuthResp* )resp).code UTF8String];
b_isGetCode = true;
NSLog(@" s_WeiChatCode is : %s",s_WeiChatCode.c_str());
break;
case 0://share
NSLog(@"share WXSuccess ------ ");
break;
default:
break;
}
} else if (WXErrCodeUserCancel == resp.errCode){
NSLog(@"weiChatLogin WXErrCodeUserCancel ------");
} else if (WXErrCodeSentFail == resp.errCode){
NSLog(@"weiChatLogin WXErrCodeSentFail ------");
} else if (WXErrCodeAuthDeny == resp.errCode){
NSLog(@"LweiChatLogin WXErrCodeAuthDeny ------");
} else {
}
}
@end
LoginSceneData.h
#include
extern std::string s_WeiChatCode;
extern bool b_isGetCode;
要在游戏里面向服务器发送code的cpp中先定义 std::string s_WeiChatCode = “”; 然后就可以正常使用code.