cocos2dx3.15接入微信SDK實現登錄和分享android studio2.3.3,首先開始呢,我必須得吐槽一下網上的教程以及微信開放平臺官網,網上的教程主要是太老了代碼雖然都能用但是不完整有的東西已經改了,官網就不用說了,文檔垃圾,是很垃圾。參考作用幾乎等於沒有,唯一作用就是查看返回值以及一些參數有什麼用。嗯對的。沒話說。
現在開始教程:
第一步:
1
2
3
|
準備好你的APP_ID這個東西不解釋了。如果不知道請先去[微信開放平臺](https:
//open.weixin.qq.com/) 查看一下注冊你的應用程序。然後登錄功能是收費的,分享是免費的
下面是註冊應用程序的步驟:
打開微信開放平臺官網:
|
點擊創建應用,按照提示輸入好之後點擊下一步。:
填寫完了之後就提交審覈,一般的話審覈可能1-3天就好了
以安卓爲例子,簽名和包名必須要和你要接入的cocos項目的包名和簽名一致,對於簽名的獲取請看下圖:
打開 Android資源下載之後在右邊下滑找到:
下載安裝到手機上,我這裏用的模擬器,然後把你們要接入的cocos項目也打包好安裝的手機上之後打開之前安裝的簽名生成工具:
打開工具之後輸入你的包名:
這個就是簽名的獲取
應用註冊審覈通過之後開始下一步
第二步:
將你的cocos項目導入到android studio2.3.3,其他環境參照相應的教程導入項目,但是推薦用android studio方便,導入方法如下:
項目導入之後配置一下微信SDK的環境只需要一句話就可以了,但是前提是你電腦能夠聯網下載微信SDK:
1
|
把這一句話加上就行了:
'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
|
接下來就可以開始寫代碼了,首先是Java端的代碼,代碼比較簡單,我也不是很瞭解Java所以我就不逐行解釋了,基本上直接複製就可以使用了。
首先打開這個文件:
下面是java端的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
package
org.cocos2dx.cpp;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.os.Bundle;
import
android.util.Log;
import
android.widget.Toast;
import
com.qt.NiuBuTing.R;
import
com.qt.NiuBuTing.wxapi.WXEntryActivity;
import
com.tencent.mm.opensdk.modelmsg.SendAuth;
import
com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import
com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import
com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import
com.tencent.mm.opensdk.openapi.IWXAPI;
import
com.tencent.mm.opensdk.openapi.WXAPIFactory;
import
org.cocos2dx.lib.Cocos2dxActivity;
import
java.io.ByteArrayOutputStream;
public
class
AppActivity
extends
Cocos2dxActivity {
public
static
final
String TAG =
"NiuBuTing_Weixin_SDK"
;
public
static
final
String APP_ID =
"這裏填寫你的Appid"
;
public
static
IWXAPI api;
private
static
AppActivity instance =
null
;
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
instance =
this
;
// 註冊到微信
regToWx();
}
//註冊到微信
private
void
regToWx() {
//工廠模式創建微信api
api = WXAPIFactory.createWXAPI(
this
, APP_ID,
false
);
//註冊程序
api.registerApp(APP_ID);
}
//啓動微信
private
static
boolean
LaunchWX() {
boolean
ret =
false
;
if
(!api.isWXAppInstalled())
{
//判斷是否安裝微信
Toast.makeText(instance,
"沒有安裝微信,請先安裝微信!"
, Toast.LENGTH_LONG).show();
return
ret;
}
if
(api.openWXApp())
{
//判斷打開微信是否成功
Log.d(TAG,
"微信打開成功!"
);
ret =
true
;
}
else
{
Log.d(TAG,
"微信打開失敗!"
);
ret =
false
;
}
return
ret;
}
//將圖片解析成一個二進制數組
private
byte
[] bmpToByteArrar(
final
Bitmap bitmap,
final
boolean
isRecycle){
ByteArrayOutputStream outputStream =
new
ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,
100
, outputStream);
if
(isRecycle)
{
bitmap.recycle();
}
byte
[] result = outputStream.toByteArray();
try
{
outputStream.close();
}
catch
(Exception e)
{
e.printStackTrace();
}
return
result;
}
//微信登錄
public
static
void
WXLogin(){
Log.d(TAG,
"login-------------"
);
WXEntryActivity.ReqState =
0
;
final
SendAuth.Req req =
new
SendAuth.Req();
req.scope =
"snsapi_userinfo"
;
//這裏不能改
req.state =
"QTNiuBuTing"
;
//這裏改成你自己的數據
api.sendReq(req);
}
//分享到聊天窗口
public
static
void
WXShareMsgToFriends(
final
String userNickName,
final
String roomNum,
final
String inningsNum,
final
String peopleNum,
final
int
playType){
//這裏的參數是看你自己你需要的話就行,但是在cocos裏面調用這個方法的你也傳遞數值過來
String strPlayType =
"輪莊牛牛"
;
if
(playType ==
1
)
//2爲輪莊
{
strPlayType =
"搶莊牛牛"
;
}
WXEntryActivity.ReqState =
1
;
//封裝一個鏈接,點擊跳轉到指定網址
WXWebpageObject webpag =
new
WXWebpageObject();
//封裝遊戲圖標
Bitmap bitmap = BitmapFactory.decodeResource(instance.getResources(), R.mipmap.icon);
Bitmap thumb = Bitmap.createScaledBitmap(bitmap,
108
,
108
,
true
);
bitmap.recycle();
//封裝分享內容
WXMediaMessage msg =
new
WXMediaMessage(webpag);
msg.thumbData = instance.bmpToByteArrar(thumb,
true
);
msg.title =
"我是 "
+ userNickName;
//這個是標題
msg.description =
"["
+ strPlayType +
"]"
//這個是描述
+
" 房間號:"
+ roomNum +
"。"
+
" 局數:"
+ inningsNum +
"。"
+
" 人數:"
+ peopleNum +
"人。"
+
"約麼? 我在QT牛不停創建了房間,一起來玩一玩吧!"
;
//封裝請求
SendMessageToWX.Req req =
new
SendMessageToWX.Req();
req.transaction = buildTransaction(
"webpag"
);
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;
//發送請求
api.sendReq(req);
}
//生成一個微信唯一請求標識符
private
static
String buildTransaction(
final
String type) {
return
(type ==
null
) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
}
|
微信登錄請求和分享請求發送後還需要創建一個類提供給微信SDK回調,現在你需要新建一個包,包名必須爲wxapi,而且這個包必須要在cocos包名的目錄下,比如你包名是com.csn.cocosNew 那麼新建的這包就是com.csn.cocosNew.wxapi,然後在這個包下面新建一個WXEntryActivity類,類名也是必須這樣,沒辦法微信的要求,下面是創建的方法:
首先是創建包:
包名輸你自己的別輸我演示的這個,然後點擊OK
接下來是創建類:
類創建的時候在你剛纔新建的包名目錄下右鍵單擊就可以了
記得類名必須是WXEntryActivity!!! 其他的默認就行了
全部創建好之後文件結構是這樣的:
然後雙擊打開,開始寫回調:
下面是WXEntryActivity類裏面的完整代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package
你的項目包名.wxapi;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.util.Log;
import
android.widget.Toast;
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
org.cocos2dx.cpp.AppActivity;
import
org.cocos2dx.cpp.tools.JniHelper;
/**
* Created by Administrator on 2017/6/5.
*/
public
class
WXEntryActivity
extends
Activity
implements
IWXAPIEventHandler {
private
final
String TAG =
"NiuBuTing_Weixin_SDK"
;
public
static
int
ReqState = -
1
;
//0爲登錄, 1爲分享
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
AppActivity.api.handleIntent(
this
.getIntent(),
this
);
//如果沒回調onResp,八成是這句沒有寫
}
@Override
protected
void
onNewIntent(Intent intent) {
super
.onNewIntent(intent);
setIntent(intent);
AppActivity.api.handleIntent(intent,
this
);
}
// 微信發送請求到第三方應用時,會回調到該方法
@Override
public
void
onReq(BaseReq req) {
finish();
}
@Override
public
void
onResp(BaseResp resp) {
Log.d(TAG,
"onResp:"
);
switch
(resp.errCode) {
case
BaseResp.ErrCode.ERR_OK:
Log.d(TAG,
"請求成功"
);
if
(ReqState ==
0
)
//這個是自己加用於判斷是登錄還是分享,你們可以去掉判斷只要裏面的代碼就行了
{
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
JniHelper.onResp(sendResp.code);
//這個登錄了之後用於回調cocos端函數的映射代碼
Log.d(TAG, sendResp.code);
}
break
;
case
BaseResp.ErrCode.ERR_USER_CANCEL:
//發送取消
Toast.makeText(
this
,
"請求取消"
, Toast.LENGTH_LONG).show();
break
;
case
BaseResp.ErrCode.ERR_AUTH_DENIED:
//發送被拒絕
Toast.makeText(
this
,
"請求被拒絕"
, Toast.LENGTH_LONG).show();
break
;
default
:
//發送返回
Toast.makeText(
this
,
"請求返回"
, Toast.LENGTH_LONG).show();
break
;
}
ReqState = -
1
;
finish();
}
}
|
這裏是JniHelper這個類裏面的代碼。這裏面你們要自己創建一個,創建在那個包下面都無所謂:
我是創建在這兒:
下面是代碼
1
2
3
4
5
6
7
8
9
|
package
org.cocos2dx.cpp.tools;
/**
* Created by Administrator on 2017/6/5.
*/
public
class
JniHelper {
public
static
native
void
onResp(String code);
}
|
做完這些之後還需要添加相應的權限,在AndroidMainfest.xml文件裏面添加,下面附上我的文件,你們根據要求自己更改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<!--?xml version=
"1.0"
encoding=
"utf-8"
?-->
<manifest android:installlocation=
"auto"
package
=
"com.qt.NiuBuTing"
xmlns:android=
"https://schemas.android.com/apk/res/android"
>
<uses-feature android:glesversion=
"0x00020000"
>
<!--這些是微信必須的權限 -->
<uses-permission android:name=
"android.permission.INTERNET"
>
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE"
>
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
>
<uses-permission android:name=
"android.permission.READ_PHONE_STATE"
>
<uses-permission android:name=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
>
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
>
<!-- Tell Cocos2dxActivity the name of our .so -->
<meta-data android:name=
"android.app.lib_name"
android:value=
"MyGame"
>
<intent-filter>
<category android:name=
"android.intent.category.LAUNCHER"
>
</category></action></intent-filter>
</activity>
<!--註冊微信回調 WXEntryActivity -->
</activity></meta-data></application><meta-data android:name=
"android.app.lib_name"
android:value=
"MyGame"
><meta-data android:name=
"android.app.lib_name"
android:value=
"MyGame"
>
</meta-data></meta-data></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-feature></manifest>
|
以上步驟完成了之後就可以還可以在cocos裏面使用了。
下面開始說cocos裏面的使用,我的使用方法是新建一個類專門用訪問微信的是一個單例:
下面附上完整代碼,首先是.h文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#ifndef __WXAPIMANAGER_H__
#define __WXAPIMANAGER_H__
#include
"cocos2d.h"
#include
"network/HttpClient.h"
USING_NS_CC;
using namespace network;
typedef std::function<
void
(std::string> LastCallBack;
#
if
(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
//判斷是不是安卓環境
#include
"platform/android/jni/JniHelper.h"
#endif
typedef
enum
{
REQ_ERROR =
0
,
REQ_SUCCESS,
CMD_ACCESS_TOKEN,
CMD_USER_INFO,
DEFAULT
}reqTag;
class
WXAPIManager : Ref
{
public
:
static
WXAPIManager *getInstance();
//分享到好友
void
sendToFriend(
const
char
*userNickName,
const
char
*roomNum,
const
char
*inningsNum,
const
char
*peopleNum,
const
int
playType);
//微信登錄
void
loginWX();
public
:
static
WXAPIManager *_instance;
//http請求
void
WX_RequestHttp(
const
char
*url,
const
std::string &data);
//請求的回調
void
onResponse(HttpClient *client, HttpResponse *response);
//最終回調
void
onTheEndResponse(std::string &data);
private
:
WXAPIManager();
~WXAPIManager();
reqTag lastTag;
};
#endif
// __WXAPIMANAGER_H__</void(std::string>
|
接下來是.cpp的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|