{{ errorTipText }}
常规项目需要接入的接口:
定制项目接口(一般项目不需要):
游戏客户端启动后,必须先执行“初始化流程”,初始化完成后(收到初始化成功的回调事件后)才能执行登录流程。
注意,必须在初始化成功后才能调用其它功能接口。
请先准备好处理SDK回调事件的回调函数指针,然后依次调用初始化接口的3个函数,进行SDK初始化。
//初始化接口函数:intptr_t __stdcall SetGameEngineMessageListener(intptr_t initStructPtr);intptr_t __stdcall Ourpalm_Prepare(LPCTSTR jsonParams);intptr_t __stdcall Ourpalm_Init(LPCTSTR jsonParams);//回调接口typedef void (*fn_Ourpalm_Init_CallBack)(LPCTSTR jsonPtr, int len);
SDK初始化的过程,会连接SDK服务器,上传一些初始化信息,并获取此产品的一些配置参数、开关、token等。
初始化完成后,SDK会调用initStructPtr参数中的回调函数指,通知游戏客户端。
【功能接口】进程启动后首先需要调用的SDK函数,设置回调函数指针
函数原型(c++):
intptr_t __stdcall SetGameEngineMessageListener(intptr_t initStructPtr);
参数说明:
| 参数或返回值 | 意义 | 注解 |
|---|---|---|
| initStructPtr | ourpalm_sdk_init_params结构体的地址 | 包含所有回调函数的指针,用于sdk回调游戏程序的函数 |
| 返回值 | ourpalm_sdk_functions_v1_struct结构体的地址 | 包含sdk提供的所有接口函数的指针,游戏可以调用这些接口函数 |
注: 接口函数定义请查看”ourpalm_sdk_base_def.h”中的定义
【功能接口】进程启动后第二个需要调用的SDK函数,根据不同的游戏引擎和使用场景,传入扩展参数让SDK初始化环境。
函数原型(c++):
intptr_t __stdcall Ourpalm_Prepare(LPCTSTR jsonParams);
参数说明:
| 参数或返回值 | 意义 | 注解 |
|---|---|---|
| jsonParams | json字符串格式的扩展参数 | 必须为json字符串格式,默认值:”{}” |
| 返回值 | ourpalm_sdk_functions_v1_struct结构体的地址 | 包含sdk提供的所有接口函数的指针,游戏可以调用这些接口函数 |
jsonParams包含字段说明
| 字段key | 数量类型 | 字段类型和含义 | 注解 |
|---|---|---|---|
| gameType | 字符串 | 游戏类型 | 固定值 “1” |
| gameVer | 字符串 | 代码版本号 | 例如:”1.0” |
| gameResVer | 字符串 | 资源版本号 | 例如:”1.0” |
| PackageName | 字符串 | 包名/程序名 | 包名会包含在一些日志中,可以使用数字、字母和”.”,例如:”com.ourpalm.mu3” |
| disable_sdk_act_log | 整数 | 禁用sdk初始化打点日志 | (可选)安装器和启动器专用,只能是1 |
| persistentDataPath | 字符串 | 持久化存储路径 | (可选)默认是主动态库所在文件夹 |
| resourcePath | 字符串 | sdk配置文件和资源文件路径 | (可选)默认是主动态库所在文件夹 |
| GameWindowHwnd | 字符串 | 游戏主窗口句柄(整数值转换为字符串) | (可选)使用游戏引擎的API获取windows窗口句柄并传入sdk,以便sdk显示界面和WebView时能显示在游戏窗口前面 |
| cef_sub_process | 字符串 | webview子进程路径 | (废弃)UE4请传入UnrealCEFSubProcess.exe的完整路径 |
| CommandLine | 字符串 | 传入命令行参数 | (可选)用于在编辑器中模拟渠道传入命令行参数,方便调试渠道功能 |
| x_forwarded_for | 字符串 | 模拟用户IP地址 | (仅测试使用)测试SDK中和用户所在地区有关的功能时使用,例如: “5.147.48.38” |
【功能接口】进程启动后第三个需要调用的SDK函数
函数原型(c++):
intptr_t __stdcall Ourpalm_Init(LPCTSTR jsonParams)
参数说明:
| 参数或返回值 | 意义 | 注解 |
|---|---|---|
| jsonParams | json字符串格式的扩展参数 | 必须为json字符串格式,默认传:L”{}” |
| 返回值 | ourpalm_sdk_functions_v1_struct结构体的地址 | 包含sdk提供的所有接口函数的指针,游戏可以调用这些接口函数 |
jsonParams包含字段说明
| 字段key | 数量类型 | 字段类型和含义 | 注解 |
|---|---|---|---|
代码示例
c#示例
public static void SetCallbackListener(){IntPtr apiStructPtr = IntPtr.Zero;int initStructSize = Marshal.SizeOf<OurpalmSDKInitStruct>();OurpalmSDKInitStruct ourpalmSDKListener = new OurpalmSDKInitStruct(){InterfaceVersion = 1,Size = initStructSize,Ourpalm_GameLogCallback = LogMessageFromSDK,//新回调接口统一了安卓、IOS、PC回调的方式和数据结构,代替以上老回调接口。//如果使用此接口,则不要使用上面的PC版老回调接口Callback_SDK_Callback = Callback_SDK_Callback,};IntPtr initStructPtr = Marshal.AllocHGlobal(initStructSize);Marshal.StructureToPtr(ourpalmSDKListener, initStructPtr, false);apiStructPtr = SetGameEngineMessageListener(initStructPtr);if (apiStructPtr == IntPtr.Zero){Debug.Log("SetGameEngineMessageListener result null");}else if ((int)apiStructPtr < 0x1000){Debug.Log($"SetGameEngineMessageListener result {apiStructPtr}");}//释放Marshal.FreeHGlobal(initStructPtr);}Hashtable initParams = new Hashtable();initParams["gameVer"] = "1.0";initParams["gameResVer"] = "1.0";initParams["DevMode"] = DevMode ? 1 : 0;//1 测试环境模式,自动使用配置中初始化地址对应的测试环境初始化地址initParams["UseUnityWebview"] = "1";...string initParamStr = MiniJSON.jsonEncode(initParams);SetCallbackListener();Ourpalm_Prepare(initParamStr);Ourpalm_Init("{}");
c++示例
ourpalm_sdk_functions_v1_struct api = ourpalm_sdk_functions_v1_struct();fn_SetGameEngineMessageListener SetGameEngineMessageListener = (fn_SetGameEngineMessageListener)GetProcAddress(h_channels_dll_module, (LPCSTR)1); // 根据导出序号加载函数fn_Ourpalm_Prepare Ourpalm_Prepare = (fn_Ourpalm_Init)GetProcAddress(h_channels_dll_module, (LPCSTR)2); // 根据导出序号加载函数fn_Ourpalm_Init ourpalm_Init_Proc = (fn_Ourpalm_Init)GetProcAddress(h_channels_dll_module, (LPCSTR)3); // 根据导出序号加载函数fn_Ourpalm_OnApplicationQuit ourpalm_OnApplicationQuit = (fn_Ourpalm_OnApplicationQuit)(void*)GetProcAddress(h_channels_dll_module, (LPCSTR)4); // 根据导出序号加载函数if (nullptr == ourpalm_Init_Proc){Logs::Info("[OurpalmSDK] Ourpalm_Init GetProcAddress @1 Faild, channels_dll_name={}", filename);return 0;}for (int i = 0; i < sizeof(api) / sizeof(void*) - 1; i++){((void**)&api)[i + 1] = (void*)GetProcAddress(h_channels_dll_module, (LPCSTR)(i + 5));}api.Ourpalm_SetLogs(true);pOurpalm_OnApplicationQuit = ourpalm_OnApplicationQuit;ourpalm_sdk_init_params initStruct = ourpalm_sdk_init_params();initStruct.Size = sizeof(ourpalm_sdk_init_params);initStruct.InterfaceVersion = 1;initStruct.Ourpalm_GameLogCallback = Console_Ourpalm_GameLogCallback;initStruct.Callback_SDK_Callback = Console_Callback_SDK_Callback;//下面这些接口使用Callback_SDK_Callback实现,不再需要注册单独的回调函数//initStruct.Ourpalm_Init_CallBack = Console_Ourpalm_Init_CallBack;//initStruct.Ourpalm_PaymentCallBack = Console_Ourpalm_PaymentCallBack;//initStruct.Ourpalm_InitSuccess = Console_Ourpalm_InitSuccess;//initStruct.Ourpalm_InitFail = Console_Ourpalm_InitFail;//initStruct.Ourpalm_LoginSuccess = Console_Ourpalm_LoginSuccess;//initStruct.Ourpalm_SwitchingAccount = Console_Ourpalm_SwitchingAccount;//initStruct.Ourpalm_LoginFail = Console_Ourpalm_LoginFail;//initStruct.Ourpalm_LogoutSuccess = Console_Ourpalm_LogoutSuccess;//initStruct.Ourpalm_LogoutFail = Console_Ourpalm_LogoutFail;//initStruct.Ourpalm_ExitGameCallBack = Console_Ourpalm_ExitGame;//initStruct.Ourpalm_PayInventorySuccess = Console_Ourpalm_PayInventorySuccess;//initStruct.Ourpalm_Notify = Console_Ourpalm_Notify;//initStruct.Callback_LoginEx = Callback_LoginEx;//initStruct.Callback_Register = Callback_Register;//initStruct.Callback_IdentityAuthentication = Callback_IdentityAuthentication;//initStruct.Callback_GetPROTOCOL = Callback_GetPROTOCOL;//initStruct.Callback_ConfirmationProtocol = Callback_ConfirmationProtocol;//initStruct.Callback_ShowUI = Callback_ShowUI;SetGameEngineMessageListener((intptr_t)&initStruct);configor::wjson initParams;initParams[L"gameType"] = L"1";initParams[L"gameVer"] = L"1.0";initParams[L"gameResVer"] = L"1.0";//initParams[L"CommandLine"] = _T(R"(ZhenHongZhiRen.exe "--parameters={"uid":"97591765","sid":"1","token":"YkU05_29d8c3fea2f14f05bba9eb92466d2f33","channel_id":4377,"sign":"5d45ad41f0016e3e20c3f23a5e91d20e"}")");initParams[L"DevMode"] = 0;//开发者模式,测试环境initParams[L"API_Version"] = 1;//initParams[L"disable_sdk_act_log"] = 1;//initParams[L"x_forwarded_for"] = L"109.167.134.253"; //ru:109.167.134.253//cn:115.171.85.30//initParams[L"GameWindowHwnd"] = L"0x00950B52";//initParams[L"GameWindowHwnd"] = L"auto";//initParams[L"cef_sub_process"] = L"D:\\debug\\WindowsNoEditor\\Engine\\Binaries\\Win64\\UnrealCEFSubProcess.exe";//initParams[L"cef_path"] = L"D:\\debug\\WindowsNoEditor\\Engine\\Binaries\\ThirdParty\\CEF3\\Win64";//准备初始化Ourpalm_Prepare(initParams.dump().c_str());//初始化SDKintptr_t** pfuncs = (intptr_t**)ourpalm_Init_Proc(initParams.dump().c_str());if (pfuncs != nullptr){Logs::Info(L"[OurpalmSDK] Ourpalm_Init return length={},version={}", *(int*)pfuncs, ((fn_Ourpalm_GetVersion_Proc)(pfuncs[1]))());}else{return 0;}auto vs = v1->Ourpalm_GetVersion();auto serviceCode = v1->Ourpalm_Query_Data(L"9", L"");auto opid = (wchar_t*)v1->Ourpalm_Query_Data(DataHelper::itow((int)ESetDataType::opid).c_str(), L"");
游戏主窗口句柄获取方法
//UE4获取方法##if PLATFORM_WINDOWSTSharedPtr<FGenericWindow> NativeWindow = GEngine->GameViewport->GetWindow()->GetNativeWindow();auto Window = static_cast<FWindowsWindow*>(NativeWindow.Get());auto hWnd = Window->GetHWnd();##endif // #if PLATFORM_WINDOWS//Unity获取方法//调用Windows api查找窗口
【回调函数】游戏调用Ourpalm_Init后,SDK开始初始化,并在完成时调用此函数
注意:
? 几乎所有功能都必须在初始化完成后才能调用,否则会导致无效果、错误的结果、甚至是程序崩溃。
? 游戏项目应当检查返回的结果,判断是否成功。
? 特别的,有些时候我们需要显示用户协议和隐私协议,必须等用户确认后,再调用登陆接口(Ourpalm_Login)。
函数原型
void (*fn_Ourpalm_Init_CallBack)(LPCTSTR jsonPtr, int len);
参数说明
jsonPtr为json字符串,包含初始化是否成功,是否需要显示用户协议等参数,里面的字段如下表所示
| 字段 | 用途 | 注解 |
|---|---|---|
| success | 初始化结果 | 0为失败,1为成功 |
| desc | 结果描述 | |
| protocolSwitch | 是否开启了用户协议确认功能 | 0 关闭,1 开启. |
| channel | 代表渠道 | 比如:“feihuo”、“qqgame”、“360game” |
特别说明:如果protocolSwitch为”1”,开启用户协议确认功能,必须等用户确认后,再调用登陆接口(Ourpalm_Login)。
如有必要,还可增加其它和渠道相关的数据。
回调参数示例
{"success":"1","desc":"","protocolSwitch":"1","channel":"360game"}

1 手机游戏客户端会调用掌趣sdk进行sdk初始化操作
2 掌趣sdk向掌趣用户中心服务器发起登录/注册的请求
3 掌趣用户中心服务器向掌趣sdk返回token、用户信息等等
4 掌趣sdk向游戏客户端返回登录结果,包含token和用户相关信息
5 游戏客户端上传用户信息到游戏服务器
6 服务器根据token向掌趣用户中心服务器获取用户信息
7 掌趣用户中心服务器向游戏服务器返回用户信息
8 游戏服务器向游戏客户端返回登录结果
游戏客户端调用SDK的登录接口,SDK内部会根据具体情况显示登录界面,或者直接完成登录。
SDK会调用回调事件中的登录回调回调函数,如果成功会给与登录token和userid,或者失败则给与失败信息。
函数原型
int Ourpalm_Login(int type);
游戏客户端调用此接口,拉起当前产品渠道的登陆功能。此接口必须在Ourpalm_Init调用返回成功后再调用。
这可能会拉起渠道登陆界面(比如大多数国内的渠道),可能调起官网账号登陆界面,也可能是无UI无感知的“快速登录”。
参数说明
| 参数名 | 用途 | 注解 |
|---|---|---|
| type | 保留参数 | 固定传0 |
调用示例
Ourpalm_Login(0);
回调函数
//登录回调接口typedef void (*fn_Callback_LoginEx)(intptr_t handle, LPCTSTR json_str, int json_str_size);//下面是以前的登录回调接口,已废弃//tokenId 登陆sessionid,userInfo 掌趣账号void (*Ourpalm_LoginSuccess)(LPCTSTR tokenId, int tokenIdSize, LPCTSTR userInfo, int userInfoSize); //登陆成功回调//json内容为 {"code":"0","message":"失败","desc":""}void (*Ourpalm_LoginFail)(int code, LPCTSTR json, int jsonSize); //登陆失败回调
PC版sdk中,切换账号的执行和登录接口基本相同,也是通过登录回调事件通知账号和token数据。
void Ourpalm_SwitchAccount();
一般不需要使用。
int Ourpalm_Logout(int type);
获取协议内容接口。此接口必须在调用Ourpalm_Init接口后再调用,但可以不等待Ourpalm_Init的成功回调。
函数原型
intptr_t GetPROTOCOL(LPCTSTR json_str);
参数说明
| 参数名 | 用途 | 注解 |
|---|---|---|
| handle | 界面句柄 | 保留未用 |
| json_str | 参数集合 | 暂不需要,保持默认值”{}” |
调用示例
GetPROTOCOL(L"{}")
回调函数原型
void Callback_GetPROTOCOL(intptr_t handle, LPCTSTR json_str, int json_str_size);//回调函数,获取用户协议和隐私协议
handle参数可以忽略,不使用json_str返回结果示例:{"success":"1", "code":"0", "desc":"描述", "data":{"privacyAgreementContentVersion": 1,"userAgreementContentVersion": 1,"url": "https://gscservice.gamebean.net/sdkui/js/getUserAgreementContentProviderCdn.htm?pcode=1000***&v=2"}"ConfirmUserAgreementVer":"0","ConfirmPrivacyAgreementVer":"0",};success值为"1"表示成功,为"0"表示失败code为错误识别码,可能为数字,也可能为字符串类型形式,请按字符串处理desc为错误提示信息data中包含了协议的版本号和协议内容的获取地址,需要访问此地址获取具体的协议内容并显示ConfirmUserAgreementVer为用户之前已经确认同意的用户协议版本号ConfirmPrivacyAgreementVer为用户之前已经确认同意的隐私协议版本号
如果已经同意的协议和data中的协议版本号相同,则不需要主动弹窗显示
需要从“json_str”中返回的“url”,请求用户协议和隐私协议内容。
如果因为网络请求有延时,或者有其它原因,游戏项目也可以将内容放到自己的配置表中,而不使用此url联网获取内容,而只使用版本号。
访问url返回结果为json格式,格式如下所示
{"success": "0","reset": "1000","desc": "成功","data": {"userAgreementContent": "<P>欢迎使用北京掌趣科技股份有限公司(以下简称\"掌趣科技\"/\"本公司\")提供的游戏客户端软件产品(在本协议中简称为\"本软件产品\"),本协议是由服务使用人(以下称\"用户\")与掌趣科技就游戏客户端安装及使用所订立的协议。</P>......","privacyAgreementContent": "<h1 align=\"center\">掌趣科技隐私保护指引</h1>\n<p>更新日期:2019年11月25日</p>\n......"}}
签署用户协议和隐私协议,如果需要显示用户协议,则可使用此接口
函数原型
intptr_t ConfirmationProtocol(LPCTSTR json_str);
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| json_str | 参数集合 | 需包含用户确认同意的用户协议的版本号和隐私协议的版本号 |
调用示例
ConfirmationProtocol(L"{\"ConfirmUserAgreementVer\":\"1\", \"ConfirmPrivacyAgreementVer\":\"1\"}")
此函数无返回值,无回调通知。
因为很多功能和打点日志都需要常用的角色信息,特设置此接口,发送打点日志并将这几个常用数据保持到sdk中。
函数原型
void Ourpalm_SetGameInfo(int type, LPCTSTR json)
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| type | 调用时机 | 1 创建角色,2 进入游戏 |
| json | 游戏角色数据 | 包含角色名、角色id、服务器id,服务器名、角色等级、角色vip等级等 |
代码示例
//创建角色Dictionary<string,string> userInof = new Dictionary<string, string>();userInof.Add("roleID", "380135439");userInof.Add("roleName", "淡然之温文");userInof.Add("serverID", "270028");userInof.Add("gameServerName", "荣耀28");userInof.Add("rolelv", "1");userInof.Add("balance", "0");userInof.Add("partyName", "无帮派");userInof.Add("vip", "VIP0");userInof.Add("roleviplv", "0");userInof.Add("roleCTime", PlatSDKMgr.GetCreateRoleTime());string json = MUJson.jsonEncode(userInof);OurpalmSDKApi.API.Ourpalm_SetGameInfo(1, json);//进入游戏Hashtable userInof = new Hashtable();userInof.Add("appName", "奇迹S");userInof.Add("platuid", "Ourpalm0100010000000000000000000000000328587723");userInof.Add("roleID", "380135439");userInof.Add("roleName", "淡然之温文");userInof.Add("rolelv", "35");userInof.Add("serverID", "270028");userInof.Add("gameServerName", "荣耀28");userInof.Add("lv", "35");userInof.Add("balance", "0");userInof.Add("partyName", "");userInof.Add("vip", "VIP0");userInof.Add("roleviplv", "0");userInof.Add("roleCTime", PlatSDKMgr.GetCreateRoleTime());string json = MUJson.jsonEncode(userInof);OurpalmSDKApi.API.Ourpalm_SetGameInfo(2, json);
此接口用于发送游戏自定义日志,以及自定义的广告打点日志
函数原型
void Ourpalm_SendGameInfoLog(LPCTSTR logID, LPCTSTR logKey, LPCTSTR json);
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| logID | 日志id | 由平台定义,游戏自定义为”1003” |
| logKey | 日志关键字 | 游戏自定义为”role-act” |
| json | 日志内容 | json格式字符串,Hashtable序列化而来。根据具体用途自定义包含哪些字段 |
注意事项
- 这些参数值和结构,由平台定义,研发需按平台要求的结构传。- 注意1,确保启动游戏的时候正常调用了PCSDK初始化方法后,再调用发日志接口;启动游戏时调用的PCSDK初始化方法有别于安装时调用的方法,无须设置 disable_sdk_act_log 这个参数。- 注意2,actId 为事件ID,只支持字母,数字,下划线命名,不支持中文。- 注意3,actName 为事件名称,支持中文。- 注意4,detail 为需要随本次发生事件一并记录的额外信息,可以是普通字符串,也可以是json字符串,不要包含竖线 | ,总长度不要超过 1000 个字符。
代码示例
//发送安装器打点日志-->开始安装Hashtable userInof = new Hashtable();userInof.Add("roleLevel", ""); //固定写死userInof.Add("roleVipLevel", ""); //固定写死userInof.Add("actId", "installer_filename"); //固定写死userInof.Add("actName", "安装包文件名"); //固定写死userInof.Add("detail", "xadf2ssd"); //传入真正的安装包文件名string json = MUJson.jsonEncode(userInof);OurpalmSDKApi.API.Ourpalm_SendGameInfoLog("1003", "role-act", json);//发送游戏日志-->登陆场景加载成功Hashtable userInof = new Hashtable();userInof.Add("roleLevel", "0");userInof.Add("roleVipLevel", "0");userInof.Add("actId", "LoginSceneLoaded");userInof.Add("actName", "登陆场景加载成功");userInof.Add("detail", "begin");string json = MUJson.jsonEncode(userInof);OurpalmSDKApi.API.Ourpalm_SendGameInfoLog("1003", "role-act", json);

1 base sdk向掌趣计费中心发起支付请求;
2 掌趣计费中心生成订单号,并向base sdk返回支付结果;
3 掌趣计费中心通知游戏服务器发货;
4 游戏服务器发送虚拟物品至玩家手机游戏客户端;
5 游戏服务器向计费中心返回发货结果;
调用自有支付功能或者第三方SDK的支付功能,实现游戏中的道具购买。
注意:对该接口中的商品名称和商品数量2个参数具体说明,如游戏中所卖商品在游戏界面显示为“100元宝”,当调用支付接口时,商品名称请传“元宝”,商品数量请传“100”,切记不可商品名称传“100元宝”,商品数量传“1”。
/*调用自有支付功能或者第三方SDK的支付功能,实现游戏中的道具购买。注意:如游戏中所卖商品在游戏界面显示为“100元宝”,当调用支付接口时,商品名称请传“元宝”,商品数量请传“100”如游戏中所卖商品在游戏界面显示为“月卡“,当调用支付接口时,商品名称请传“月卡”,商品数量请传“1”如游戏中所卖“月卡”有多个,当调用支付接口时,商品名称建议传入月卡的金额。例如“30元月卡”、“50元月卡”等等,商品数量请传“1”礼包类与月卡同理,请在商品名称尽量传入礼包对应的价格,例如:“30元礼包”,“50元礼包,商品数量请传“1”。注意:掌趣官网包中支付宝等sdk支付方式,需要进行打包处理才可以支持。*/public static void Ourpalm_Pay(string propId, string chargeCash, string currencyType, string propName, string propCount,string propDes, string Gameurl, string jsonExtendParams);
注:比旧版本新增的 userId、serverId、roleId等参数
| 参数名称 | 重要性 | 类型 | 说明 |
|---|---|---|---|
| propId | 必须 | String | 游戏自定义的道具ID 必传。 |
| chargeCash | 必须 | String | 道具价格,单位为分。 |
| currencyType | 必须 | String | 货币类型(1人民币2美元3日元4港币5英镑6新加坡币7越南盾8台币9韩元) |
| propName | 必须 | String | 道具名称 |
| propCount | 必须 | String | 道具数量 |
| propDes | 必须 | String | 道具描述 |
| Gameurl | 必须 | String | 游戏发放道具服务器地址,用户支付成功后掌趣计费中心会回调此地址告知游戏进行道具发放。 |
| jsonExtendParams.userId | 必须 | String | 掌趣SDK登录成功后返回的userId |
| jsonExtendParams.roleId | 必须 | String | 玩家角色id |
| jsonExtendParams.rolelv | 必须 | String | 角色等级,请传数字,如游戏中无角色等级可以传null |
| jsonExtendParams.serverId | 必须 | String | 玩家登录的游戏服id |
| jsonExtendParams.gameServerName | 必须 | String | 玩家登录的游戏服务器名 |
| jsonExtendParams.roleviplv | 必须 | String | 角色VIP等级,请传数字,如游戏中无角色VIP等级可以传null |
| jsonExtendParams.Params | 可选 | String | 游戏自定义数据,支付成功后,计费中心会将此字段数据回传给游戏服务器。 |
| jsonExtendParams.purchaseinfo | 可选 | String | 买量BI要求的自定义数据,json字符串,需要携带礼包ID等。格式:”{\”package_id\”:\”1001\”}” |
string propId = productId; //商品IDstring chargeCash = amount; //价格(以分为单位)string propName = "商品名称";string propCount = "1";string propDes = "商品描述";string Gameurl = "回调地址";string Params = "我是扩展参数";string rolelv = "100";string roleviplv = "8";Hashtable extendParams = new Hashtable();extendParams["serverID"] = "1";extendParams["roleID"] = "1000000";extendParams["rolelv"] = rolelv;extendParams["roleviplv"] = roleviplv;extendParams["roleName"] = "角色无名";extendParams["gameServerName"] = "游戏服名";extendParams["Params"] = Params;//礼包ID的含义由项目和买量BI协商确定,sdk只做转发extendParams["purchaseinfo"] = "{\"package_id\":\"礼包ID\"}";var jsonParams = ToolsUtils.MiniJSON.jsonEncode(extendParams);OurpalmSDKAgent.Ourpalm_Pay(propId, chargeCash, currencyType, propName, propCount, propDes, Gameurl, jsonParams);
| 参数名称 | key-类型 | 说明 |
|---|---|---|
| MethodName | “Ourpalm_PaymentCallBack” | 回调函数名 |
| jsonParams.success | string | 成功:”1”,失败:”0” |
| jsonParams.code | string | 错误码 |
| jsonParams.ssid | string | 掌趣计费中心生成的订单号,如支付失败或者用户取消支付时可能返回为空。 |
| jsonParams.channelOrderId | string | 渠道订单号 |
| jsonParams.pdid | string | 游戏传入的商品id |
回调示例接口
//支付成功public static System.Action<string> EventPaymentSuccess;//支付失败public static System.Action<string> EventPaymentFail;
“下单成功”表示当前订单已经成功提交,但用户是否进行支付,以计费中心服务器的通知为准。 下单成功代表支付流程结束。下单成功回调触发以后不会在有支付成功和支付失败的回调,游戏需要根据服务器通知为准。
| 参数名称 | key-类型 | 说明 |
|---|---|---|
| MethodName | “Callback_Ourpalm_Pay_Order” | 回调函数名 |
| jsonParams.success | string | 成功:”1”,失败:”0” |
| jsonParams.code | string | 错误码 |
| jsonParams.ssid | string | 掌趣计费中心生成的订单号,如支付失败或者用户取消支付时可能返回为空。 |
| jsonParams.channelOrderId | string | 渠道订单号 |
| jsonParams.pdid | string | 游戏传入的商品id |
回调示例接口
// 下单成功public static System.Action<string> EventPaymentOrderSuccess;
*注:1、Android端和iOS端返回错误码不一致。2、Android返回参数key为小写{String ssid, String pbid},iOS端返回json中的key为小驼峰{ “desc”:成功描述,”propId”:”道具ID”,”reset”:”120”,”ssId”:”订单号}
兑换礼包码
CP接入礼包码功能时,由SDK来直接提示错误提示语。
/// <summary>/// 礼包码兑换/// 此接口中需要的服务器和角色数据,必须提前使用SetGameInfo接口提供这些数据/// </summary>void Ourpalm_GiftExchange(LPCTSTR GiftCode, LPCTSTR url, LPCTSTR extendParams); //礼包码兑换接口
| 参数名称 | 重要性 | 类型 | 说明 |
|---|---|---|---|
| GiftCode | 必须 | String | 礼包码 |
| url | 必须 | String | 游戏发货服务器地址 |
| extendParams | 可选 | String | 透传参数,成功回调内,将会返回此参数 |
//Ourpalm_GiftExchange("用户输入的礼包码","游戏发货服务器地址","透传参数");Ourpalm_GiftExchange(L"84K82JAUT4Q39M", L"https://hi-login-test.tmskapp.com/pay/ourpalmlibaomazhuanfa.php?param=giftCode", L"dd");
| key | key-类型 | |
|---|---|---|
| MethodName | “Callback_GiftExchange” | 回调函数名 |
| jsonParams.success | string | 成功:”1”,失败:”0” |
| jsonParams.code | string | 错误码 |
| jsonParams.packageId | string | 礼包码 |
| jsonParams.extendParams | string | 透传参数 |
【功能接口】提供给项目调用的扩展函数 (用于一些第三方渠道的特殊功能,扩展参数内容按具体功能约定)
注意:此接口如需返回数据给调用者,会调用游戏提供的Callback_Channel_Spreads回调函数。
函数原型(c++):
void Ourpalm_Channel_Spreads(LPCTSTR key, LPCTSTR jsonExtendParams);
key为字符串类型
jsonExtendParams为json格式字符串,包含功能所需的参数
如果是使用第三方的Web页面充值的方式,则sdk无法在充值成功后调用充值成功的回调通知.
如果游戏内通过直接显示二维码的方式让玩家充值(比如国内顺网渠道),可在窗口显示期间每隔几秒调用此接口,查询支付是否完成或失败,以便关闭充值界面.
key=“ChargeQueryOrderState”
jsonExtendParams必须为json格式,并包含以下参数
| orderId | “0122023032123591600300” | 字符串类型,掌趣订单号 |
|---|---|---|
例如:
Ourpalm_Channel_Spreads("ChargeQueryOrderState", LR"({"orderId":"0122023032123591600300"})");
sdk通过回调方法通知结果:
Callback_ChargeQueryOrderState,param={"code":"21000","desc":"成功","orderId":"0122023032123591600300","orderStatus":"1","success":"1"}
sdk会在初始化时尝试查找当前执行进程的主窗口,并记录下来。必须在初始化时找到了主窗口,才可以用此功能
key=“set_window_show”
jsonExtendParams必须为json格式,并包含以下参数
| show | 可选值“0”或“1” | “0”表示隐藏窗口,“1”表示显示窗口 |
|---|---|---|
例如:
Ourpalm_Channel_Spreads("set_window_show","{\"show\":\"1\"}");
sdk会在初始化时尝试查找当前执行进程的主窗口,并记录下来。必须在初始化时找到了主窗口,才可以用此功能
key=“set_window_topmost”
jsonExtendParams必须为json格式,并包含以下参数
| topmost | 可选值“0”或“1” | “0”表示隐藏窗口,“1”表示显示窗口 |
|---|---|---|
例如:Ourpalm_Channel_Spreads("set_window_topmost","{\"topmost\":\"1\"}");
key=“send_qqgame_cmd”
jsonExtendParams必须为json格式,参考QQ大厅接入文档(https://open.qqgame.qq.com/wiki/24/35/46/52/52.html)
例如:
Ourpalm_Channel_Spreads("send_qqgame_cmd","{\"cmd\":\"open_web\",\"caption\":\"窗口标题\",\"url\":\"https://qqgame.qq.com\",\"width\":1440,\"height\":900}");
key=“get_qqgame_params”
cmdJson为json格式的字符串,可传空json对象”{}”
调用方式:
Ourpalm_Channel_Spreads("get_qqgame_params","{}");
返回结果
{"openid":"######","openkey":"######","pf":"######","pfkey":"######"}
key=“show_bind_mobile”
cmdJson为json格式的字符串,可传空json对象”{}”
调用方式:
Ourpalm_Channel_Spreads("show_bind_mobile","{}");
此调用会以回调方式让游戏打开webview页面
Callback_ShowUI(0, "{\"usage\":\"ui_webview\"}...")
key=“get_account_bind_list”
用于查询快速登录账号的绑定邮箱账号和绑定第三方登陆账号的信息。
调用方式:
Ourpalm_Channel_Spreads("get_account_bind_list","{}");
返回结果:
【回调函数】sdk用此回调函数,通知客户端扩展功能的消息,或者Ourpalm_Channel_Spreads(需要回调通知的调用)的调用结果。
函数原型
void (*fn_Callback_Channel_Spreads)(LPCTSTR key, int keySize, LPCTSTR cmdJson, int cmdJsonSize)
key=“receive_qqgame_cmd”
cmdJson为json格式的字符串,参考QQ大厅接入文档(https://open.qqgame.qq.com/wiki/24/35/46/52/52.html)
客户端会收到回调
//老板键,显示/隐藏窗口Callback_Channel_Spreads("receive_qqgame_cmd","{\"cmd\":\"boss_key\", \"show\":0}");//控制游戏前端显示Callback_Channel_Spreads("receive_qqgame_cmd","{\"cmd\":\"bring_to_top\"}");
可支持账号密码注册
此接口在初始化成功后才能使用。
函数原型
intptr_t Ourpalm_Register(LPCTSTR json_str);
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| json_str | 参数集合 | 包含登陆方式、登陆用户名、用户密码 |
调用示例
Ourpalm_Register(L"{\"loginType\":\"0\", \"loginName\":\"liteng001\", \"userPwd\":\"a123456\"}")
回调函数原型
void Callback_Register(intptr_t handle, LPCTSTR json_str, int json_str_size);//回调函数,签署用户协议和隐私协议
handle参数可以忽略,不使用json_str返回结果示例: "{\"success\":\"1\", \"code\":\"0\", \"desc\":\"登录失败\"}";success 值为"1"表示成功,为"0"表示失败code 为错误识别码,可能为数字,也可能为字符串类型形式,请按字符串处理desc 为错误提示信息
可支持账号密码登陆,或其它交互式登陆方式
函数原型
intptr_t Ourpalm_LoginEx(LPCTSTR json_str);
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| json_str | 参数集合 | 包含登陆方式、登陆用户名、用户密码 |
调用示例
Ourpalm_LoginEx("{\"loginType\":\"0\", \"loginName\":\"liteng001\", \"userPwd\":\"a123456\"}")
回调函数原型
void Callback_LoginEx(intptr_t handle, LPCTSTR json_str, int json_str_size);//回调函数,登陆接口(扩展),可支持账号密码登陆,或其它交互式登陆方式
handle参数可以忽略,不使用json_str返回结果示例: {"success":"1", "code":"0", "desc":"登录失败", "token":"登录token", "userinfo":"userid", "identityAuth":"0", "forceIdentityAuthBindSwitch":"0"}success 值为"1"表示成功,为"0"表示失败code 为错误识别码,可能为数字,也可能为字符串类型形式,请按字符串处理desc 为错误提示信息token 为登录token,userinfo 为掌趣账号userididentityAuth 为是否已完成实名认证,"0"未完成验证,"1"已验证。forceIdentityAuthBindSwitch 是否强制实名认证,"1"强制实名。
提示: 如果forceIdentityAuthBindSwitch为”1”,且identityAuth为”0”,需要显示实名认证界面。
提交身份认证信息,如真实姓名,身份证号等
注意:
函数原型
intptr_t IdentityAuthentication(LPCTSTR json_str);
函数原型
| 参数名 | 用途 | 注解 |
|---|---|---|
| json_str | 参数集合 | 包含证件类型、真实姓名、身份证号 |
调用示例
IdentityAuthentication(L"{\"idType\":\"0\", \"realName\":\"王小帅\", \"idNum\":\"350725199608270516\"}")
回调函数原型
void Callback_IdentityAuthentication(intptr_t handle, LPCTSTR json_str, int json_str_size);//回调函数,提交身份认证信息,如真实姓名,身份证号等
handle参数可以忽略,不使用json_str返回结果示例: "{\"success\":\"1\", \"code\":\"0\", \"desc\":\"描述\"}";success值为"1"表示成功,为"0"表示失败code为错误识别码,可能为数字,也可能为字符串类型形式,请按字符串处理desc为错误提示信息
和手机版应用不同,PC上的登录、支付、以及程序的界面等,经常使用网页来实现,所以需要依赖浏览器或者程序内置WebView组件。
以下流程可能会需要使用webview来显示页面。
当需要登录时,SDK会用“Callback_ShowUI”回调通知,告诉游戏程序需要用webview显示登录页面。
海外支付通常使用web页面来实现。
国内渠道支付方式更多,除了用web页面,还有其它方式。比如直接显示付款二维码来让用户支付等。
用户中心界面给用户提供绑定其它登录方式、设置账号和密码等功能。
我们使用基于网页的AIHelp,提供客服功能。
【回调事件】Callback_ShowUI
sdk用此回调事件,通知客户端显示UI界面。界面类型和参数在json_str中提供。
回调参数说明
| key | key-类型 | |
|---|---|---|
| MethodName | “Callback_GiftExchange” | 回调函数名 |
| jsonParams.usage | string | 界面类型,主要有”webview_pay”、L”webview_ui_show_url”、”webview_ui_user_close”等 |
| jsonParams.url | string | (可选)需要打开的页面URL |
| jsonParams.hwnd | string | (可选)sdk生成的伪窗口句柄,用于通知sdk关闭窗口时使用 |
| jsonParams.hide_close_btn | string | (可选)是否需要隐藏关闭窗口的按钮,禁止用户手动关闭(只能程序逻辑关闭) |
| jsonParams.window_width | int | (可选)窗口客户区的最小宽度,如果是0则全屏显示或自定义大小 |
| jsonParams.window_height | int | (可选)窗口客户区的最小高度,如果是0则全屏显示或自定义大小 |
回调示例
打开支付UI的json_str:{"url":"https://mu3.fingerfun.com/t2/363/6423.html?orderId=0612022110822494414400&pCode=20000063310143000003101430031014300002411¤cyType=2&gamePropId=100992&price=99&goodsName=propName&language=en_gb","usage":"webview_pay"}打开登陆UI的json_str:{"usage":"ui_ourpalm_login","switchaccount":"0"}打开防沉迷提示的json_str:{"usage":"ui_anti_addiction","limit_code":"0","limit_desc":"提示内容"}
回调方法实现示例
void Callback_ShowUI(intptr_t handle, LPCTSTR json_str, int json_str_size){configor::wjson uiParams = configor::wjson::parse(json_str);std::wstring usage;std::wstring url;uiParams.try_get_string(L"usage", usage);if (usage == L"webview_pay"){//使用游戏内置的webview打开支付页面std::wstring url;uiParams.try_get_string(L"url", url);configor::wjson windowParamJson;windowParamJson[L"cef_browser"] = L"1"; //是否使用sdk提供的webview,不传此值则用系统默认浏览器打开网页windowParamJson[L"window_width"] = 872; //窗口宽度windowParamJson[L"window_height"] = 768; //窗口高度windowParamJson[L"GameWindowHwnd"] = L"0x00950B52"; //(可选参数)如果传入游戏窗口的HWND,则webview窗口可以自动保持在浏览器窗前面v1->Open_Web_Browser(url.c_str(), windowParamJson.dump().c_str(), L"");}if (usage == L"ui_webview" || usage == L"webview_ui_show_url"){//使用游戏内置的webview打开页面//飞火渠道使用此界面,显示实名认证/手机号绑定/支付页面//如果window_width和window_height为大于0的值,则创建的webview床头需要此大小的web客户区//如果hide_close_btn存在且为"1",则隐藏关闭按钮,不能主动关闭.用于身份验证等强制执行的页面.//以下是uiParams中的携带的数据std::wstring url, hide_close_btn, hwnd, headerJson;int window_width, window_height;uiParams.try_get_string(L"url", url);uiParams.try_get_string(L"hwnd", hwnd);uiParams.try_get_string(L"hide_close_btn", hide_close_btn);uiParams.try_get_string(L"headerJson", headerJson);uiParams.try_get_int(L"window_width", window_width);uiParams.try_get_int(L"window_height", window_height);#if false//如果调用者自己有内置WebView,可以使用自己的WebView打开url// ...#else//如果调用者没有webview组件,可以调用sdk的接口,使用sdk提供的webview组件打开urlconfigor::wjson windowParamJson;windowParamJson[L"cef_browser"] = L"1";windowParamJson[L"hwnd"] = hwnd;windowParamJson[L"window_width"] = window_width;windowParamJson[L"window_height"] = window_height;windowParamJson[L"hide_close_btn"] = hide_close_btn;windowParamJson[L"headerJson"] = headerJson;//windowParamJson[L"ie_browser"] = L"1";v1->Open_Web_Browser(url.c_str(), windowParamJson.dump().c_str(), L"");#endif}if (usage == L"webview_ui_user_close"){//通知调用者,由调用者提供的webview页面需要关闭.可能是页面功能触发自动关闭,也可能是用户在页面上操作关闭//以下是uiParams中的携带的数据std::wstring url, hide_close_btn, hwnd;uiParams.try_get_string(L"hwnd", hwnd);//这里调用sdk的接口,通知sdk此页面关闭了.configor::wjson windowParamJson;windowParamJson[L"cef_browser_close"] = L"1";windowParamJson[L"hwnd"] = hwnd;//windowParamJson[L"ie_browser"] = L"1";v1->Open_Web_Browser(url.c_str(), windowParamJson.dump().c_str(), L"");//下面加入代码,调用者关闭自己的WebView窗口//...}if (usage == L"webview_ui_closed_notify"){//通知调用者,由sdk提供的webview窗口被用户关闭了//以下是uiParams中的携带的数据std::wstring hwnd;uiParams.try_get_string(L"hwnd", hwnd);//这里调用sdk的接口,通知sdk此页面关闭了.configor::wjson windowParamJson;windowParamJson[L"cef_browser_close"] = L"1";windowParamJson[L"hwnd"] = hwnd;//windowParamJson[L"ie_browser"] = L"1";v1->Open_Web_Browser(L"", windowParamJson.dump().c_str(), L"");}}
注1:”webview_ui_user_close”回调事件的含义是:通过“webview_ui_show_url”通知打开的界面需要关闭时,sdk通知游戏程序,关闭“hwnd”所指的webview界面。如果这个窗口有关联“hwnd”,游戏程序需要调用Open_Web_Browser接口,并传递参数”cef_browser_close”=“1”。
注2:“webview_ui_closed_notify”回调事件的含义是:游戏程序调用Open_Web_Browser接口打开的webview界面,被关闭了。如果这个窗口有关联“hwnd”,游戏程序需要调用Open_Web_Browser接口,并传递参数”cef_browser_close”=“1”。
【功能接口】提供给游戏项目,可以用来打开给定网址的网页,默认使用系统默认浏览器,通过参数控制可使用sdk的WebView来打开网页。
函数原型(c++):
void Open_Web_Browser(LPCTSTR url, LPCTSTR windowParamJson, LPCTSTR httpHeaderJson);
参数说明:
| 参数名 | 类型 | 用途 |
|---|---|---|
| url | 字符串 | 为要打开的网址 |
| windowParamJson | json格式字符串 | 如果用sdk的web view,可以置顶窗口大小等参数 |
| httpHeaderJson | json格式字符串 | 保留参数,以后功能扩展使用 |
调用示例
//使用系统默认浏览器打开网页调用示例:Open_Web_Browser(L"www.baidu.com", L"{}", L"{}");//使用sdk的webview浏览器打开网页调用示例:configor::wjson windowParamJson;windowParamJson[L"cef_browser"] = L"1"; //是否使用sdk提供的webview,传0则用系统默认浏览器打开网页windowParamJson[L"window_width"] = 872; //窗口宽度windowParamJson[L"window_height"] = 768; //窗口高度windowParamJson[L"GameWindowHwnd"] = L"0x00950B52"; //(可选参数)如果传入游戏窗口的HWND,则webview窗口可以自动保持在浏览器窗前面v1->Open_Web_Browser("www.baidu.com", windowParamJson.dump().c_str(), L"");
| 状态码 | 说明 |
|---|---|
| -1 | 未知错误 |
| -2 | SDK联网URL错误 |
| -3 | 第三方登陆验证返回失败 |
| -4 | 支付失败,未知错误 |
| -5 | 无网络 |
| 0 | 初始化失败 |
| 10 | 登陆错误,未知错误 |
| 11 | 登陆取消 |
| 12 | 登陆数据错误,账号或密码为空 |
| 13 | 登陆验证失败 |
| 14 | 登陆验证参数错误 |
| 15 | 获取系统用户名错误 |
| 16 | 单机隐式登录失败 |
| 20 | 注册失败,未知错误 |
| 21 | 注册失败,验证错误 |
| 22 | 注册数据错误,账号或密码为空 |
| 30 | 修改密码错误 |
| 31 | 修改密码错误,用户id或者密码为null或者格式错误 |
| 32 | 修改密码错误,参数错误 |
| 33 | 找回密码错误,参数错误 |
| 40 | 绑定用户信息错误 |
| 41 | 绑定用户信息错误,验证错误 |
| 42 | 绑定用户信息错误,参数错误 |
| 43 | 接口所需参数传递为空或者格式不正确 |
| 100 | 支付相关参数错误 |
| 101 | 支付成功 |
| 102 | 支付失败 |
| 103 | 支付取消 |
| 104 | 下单成功 |
| 105 | 下单失败 |
| 106 | 解析支付协议失败 |
| 107 | 当前支付方式不可用 |
| 205 | 账号封停 |
| 300 | 官网支付webview页面报错 |
| 状态码 | 说明 |
|---|---|
| 21134 | roleId格式不正确 |
| 21137 | gameServerId格式不正确 |
| 21143 | gameServerId在平台没有启用 |
| 21146 | 请求报文头格式不正确 |
| 21147 | 手机平台ID格式不正确 |
| 21148 | 设备名称格式不正确 |
| 21149 | 设备系统版本号格式不正确 |
| 21150 | 设备分辨率格式不正确 |
| 21151 | 设备UDID格式不正确 |
| 21152 | 运营商格式不正确 |
| 21153 | 设备厂商格式不正确 |
| 21185 | 激活码不得为空 |
| 21186 | 发货失败 |
| 21187 | 激活码不存在或不可用 |
| 21188 | 激活码已过期 |
| 21189 | 激活码未领取 |
| 21190 | 激活码已使用 |
| 21191 | 该用户已兑换过激活码 |
| 21192 | 该设备已兑换过激活码 |
| 21193 | 活动暂停中 |
| 21194 | 激活码已经用完 |
| 21195 | 网络异常 |
| 21196 | 服务内部错误 |
| 21197 | 传入的激活码有错误 |
| 21198 | 传入的礼包ID有错误 |
| 21199 | 用户未登录 |
| 21200 | 兑换超过用户最大限制 |
| 21201 | 游戏产品有误 |
| 21202 | 策略关系不存在 |
| 21203 | 联运渠道或推广渠道有误 |
| 21204 | 推广渠道有误 |
| 21205 | 机型组有误 |
| 21206 | 语言有误 |
| 21207 | 逻辑服策略不存在 |
| 21208 | 逻辑服有误 |
| 21227 | 用户每天兑换次数超出上限 |
| 21228 | 用户每周兑换次数超出上限 |
| 21229 | 用户每月兑换次数超出上限 |
| 23157 | 礼包码未到生效时间 |
| 23158 | 失败 |
在MIS中的货币有总共十种,货币ID是没有限定位数的纯自增值
| 货币ID | 货币名 | 币单位 |
|---|---|---|
| 1 | 人民币 | 分 |
| 2 | 美元 | 美分 |
| 3 | 日元 | 円 |
| 4 | 港币 | 分 |
| 5 | 英镑 | 便士 |
| 6 | 新加坡币 | 分 |
| 7 | 越南盾 | 盾 |
| 8 | 台币 | 元 |
| 9 | 韩元 | 分 |
| 10 | 泰铢 | 萨当 |
| 14 | 马来西亚林令吉 | 分 |
| 17 | 菲律宾币 | 仙 |
| 19 | 印尼卢比 | 卢比 |
| 21 | 柬埔寨瑞尔 | 瑞尔 |
| 122 | 缅甸元 | 分 |
防沉迷相关提示和错误信息
| code | limit_code | limit_desc |
|---|---|---|
| 01010054 | 输入的身份证号码格式有误 | |
| 01010066 | 每日最多进行5次实名验证,请明天再试 | |
| 01010067 | 实名信息认证失败; | |
| 01010069 | under_age_login_not_in_period | 本游戏仅在周五、周六、周日及法定节假日20-21点对未成年人提供游戏服务;调休工作日不提供未成年人游戏服务; |
| 01010068 | realname_info_authing | 实名信息认证中,认证通过后方可进入游戏! |
| user_realname_auth_failed | 根据国家相关规定,用户需进行实名认证,请输入您的姓名及身份证号码进行身份确认 | |
| 01010068 | 实名信息认证中,认证通过后方可进入游戏! |