1. 接入流程
本文檔主要介紹了 聯想PC游戲SDK接入流程、聯想游戲提供的功能、接入注意事項等。
1.1. 接入方式
1. 聯想游戲SDK2.1版本支持“賬號+防沉迷+支付”接入方式;
a. 聯想提供賬號注冊、登錄等能力
b. 聯想提供防沉迷服務
c. 聯想提供游戲內支付
1.2. 對接流程
1. cp的游戲接入主要流程包括:
a. 聯系聯想運營,提供游戲和公司信息,獲取cpid、游戲id、登錄key(用于登錄和防沉迷校驗)、支付key(僅用于支付)
b. 簽訂合同
c. 接入聯想游戲SDK
d. 提包測試、提供物料、上線運營等;
1.3. SDK下載地址
鏈接: https://lecloud.lenovo.com/share/37a7r4fRuzjNta1EE
提取碼:ep4b
2. 接入說明
2.1. 登陸接入
2.1.1. 登錄物料準備
設計圖準備
CP需提供以下物料至聯想游戲運營
1. 游戲背景圖,尺寸350*400
2. 游戲LOGO,尺寸106*48
3. 游戲官網地址
登錄原型如下:
備案號準備
CP需要向國家新聞出版署申請備案號,并且在版署防沉迷后臺與聯想游戲防沉迷備案信息綁定。聯想游戲防沉迷備案信息:
公司名稱:北京神奇工場科技有限公司
統一社會信用代碼:91110108318338204D
2.1.2.?登錄流程說明
a) 集成聯想網游 SDK,登錄取得token
b) 將獲取到的 token 傳遞到游戲服務器
c) 通過【獲取用戶信息接口】驗證 token的有效性,同時獲取用戶的唯一 ID
2.2. 支付接入
2.2.1. 支付模式說明
聯想SDK支持兩種支付接入,可任選其中一種進行接入,兩者的區別如下:
模式一:接入支付h5
聯想游戲SDK僅提供支付H5頁面,CP需要將支付相關參數拼接至支付url地址后,并自行開發頁面容器展示該url。
模式二:直接調起SDK
聯想游戲SDK提供支付頁面,CP僅需要將相關參數上傳,調用聯想游戲SDK。
2.2.2. 模式一接入說明
2.2.2.1. 支付流程說明
2.2.2.2. 準備頁面容器
1. 聯想PC游戲SDK提供游戲內支付頁面,支持用戶直接在游戲內支付。使用該支付頁時,游戲CP需要提供:
a. 頁面容器:提供526px*398px的頁面容器,在游戲內拉起web頁;
b. 窗口標題欄:由游戲提供,下圖為建議標準樣式,接入資料zip包中附帶標準素材;
2.2.2.3. 拼接參數至支付頁url
接口說明
cp方拉起聯想支付頁URL時需要攜帶以下參數:(所有參數都需要進行urlEncode編碼)
請求參數 | ||||
url | https://hd.lenovomm.com/front-wdsdk/pay/index.html | |||
接口協議 | HTTP[S] GET | |||
請求參數 | 參數名 | 參數類型 | 是否必填 | 說明 |
partner | CPID | string | *是 | 由聯想運營提供 |
notifyUrl | 異步通知地址 | string | *是 | CP方提供 |
outTradeNo | 訂單號 | string | 否 | 雙方對賬使用,如未傳訂單號,會生成唯一訂單號,后續對賬以聯想訂單號為準。 |
appId | 游戲id | int | *是 | 由聯想運營提供(gameId) |
totalFee | 指定金額 | int | 否 | 最小為1元,精確到小數點后2位。不傳則用戶可自定義充值金額 |
subject | 商品名稱 | string | *是 | 商品的名稱,例:月卡、元寶、鉆石等(需要URL編碼) |
account | 用戶賬號 | string | *是 | 用戶賬號,需要脫敏 |
extraCommonParam | 透傳參數json格式 | json | 否 | cp業務透傳參數 |
server | 區服名稱 | string | *是 | 區服名稱(需要URL編碼) |
role | 角色名稱 | string | *是 | 角色名稱(需要URL編碼) |
bizid | 游戲備案號 | string | *是 | 游戲備案號 |
tgt | 用戶登錄成功時返回的TGT | string | *是 | 用戶唯一標識 |
sign | 使用支付參數生成的驗簽字符串 | string | *是 | 參考7.1.4簽名備注 |
sign_type | 簽名類型 | string | *是 | 簽名類型固定值RSA2 |
2.2.3. 模式二接入說明
2.2.3.1. 支付流程說明
2.2.3.2. 傳參說明
cp方拉起聯想SDK時需要傳遞以下參數:
請求參數 | 參數名 | 參數類型 | 是否必填 | 說明 |
notifyUrl | 異步通知地址 | string | *是 | CP方提供 |
outTradeNo | 訂單號 | string | 否 | 雙方對賬使用,如未傳訂單號,會生成唯一訂單號,后續對賬以聯想訂單號為準。 |
totalFee | 指定金額 | int | 否 | 最小為1元,精確到小數點后2位。不傳則用戶可自定義充值金額 |
subject | 商品名稱 | string | *是 | 商品的名稱,例:月卡、元寶、鉆石等 |
extraCommonParam | 透傳參數json格式 | json | 否 | cp業務透傳參數 |
server | 區服名稱 | string | 否 | 區服名稱 |
role | 角色名稱 | string | 否 | 角色名稱 |
2.3. 防沉迷
2.3.1. 防沉迷流程說明
1. 聯想PC游戲SDK提供防沉迷的接入能力,其中用戶登陸時的實名校驗、實名認證、未成年游戲限制均已包含在登陸的流程內,無需CP接入和二次開發。用戶支付時的實名校驗和消費限制包含在支付的流程內,無需CP接入和二次開發。
2. 但針對游戲內未成年用戶時長超出國家游戲時長規定的場景,游戲SDK不提供直接踢出游戲的能力,而是提供一個【用戶防沉迷接口】,可查詢用戶在當前時間是否可玩游戲,CP需要通過調用接口輪詢用戶在當前時間是否可玩游戲,若不可玩游戲,需要將用戶踢出。
3. 聯想端游SDK API介紹
3.1. 登陸的調用方式
1. 端游SDK以dll形式提供,名稱為PCGameSDK.dll,可使用動態或靜態加載方式使用該dll。ludp.dll為PCGameSDK.dll提供功能支持,并配有相關導入庫和頭文件PCGameSDK.lib,PCGameSdk.h。
2. PCGameSDK.dll使用說明:
a) 接口使用說明:
i. PCGameSDK.dll,ludp.dll需放在調用該dll的exe同級目錄下。
ii. 調用LGSDKInit,該接口用來設置回調,用于接收SDK返回的數據。參數為LGSDKCallBack callback,其中
typedef bool(*LGSDKCallBack)(wchar_t* in_param);
接口返回說明 :
錯誤碼 | 說明 |
true | 成功 |
false | 失敗 |
iii. 調用LGSDKLogin,該接口用來彈出登錄窗口。傳入參數為json字符串,如下:
?調起登錄器參數:
參數 | 說明 |
cpid | 聯想游戲運營分配 |
appid | 游戲id,聯想游戲運營分配 |
bizid | 游戲備案碼,CP向國家新聞出版署申請 |
Key | 聯想游戲運營分配 |
登陸成功后回傳參數:
參數 | 說明 |
TGT | 發起支付時攜帶,作為用戶標識 |
Token | 用戶token,結合Realm查詢聯想用戶id作為用戶唯一標識 |
Age | 用戶年齡,防沉迷時攜帶 |
?接口返回說明 :
錯誤碼 | 說明 |
0 | 成功 |
10 | 初始化接口未調用 |
20 | 登錄窗已存在 |
30 | 參數錯誤 |
b) 接口調用時機:
CP啟動時應首先調用LGSDKInit,LGSDKLogin接口,彈出登錄框,登錄成功以后,再走CP 后續流程。
c) 接口調用示例代碼:
std::wstring strParam =
L"{\"appid\":\"此處替換成appid\",
\"cpid\":\"此處替換成cpid\",
\"bizid\":\"此處替換成bizid\",
\"key\":\"此處替換成key \"}";
int nSize = strParam.size();
bool bRet = LGSDKInit(SDKCallBackFunAsync);
wchar_t *pwszBuffer = new wchar_t[nSize + 1];
ZeroMemory(pwszBuffer, nSize + 1);
tcscpy_s(pwszBuffer, nSize + 1, strParam.c_str());
int statusCode = LGSDKLogin(pwszBuffer);
delete[] pwszBuffer;
pwszBuffer = nullptr;
return 0;
其中回調函數可以接收到SDK返回的數據,數據格式為json。
bool CTest::SDKCallBackFunAsync(wchar_t* in_param)
{if (in_param == nullptr)return false;::MessageBox(NULL, in_param, L"提示信息", MB_OK);return true;
}
3.2. 支付的調用方式
1.支付接口定義:
extern "C" ?PCGAME_SDK_API int LGSDKPay(wchar_t* in_param);
入參:json格式 具體key值定義結構參考 2.2.3.2
返回說明:0- 成功 , 30-參數錯誤
2使用說明:用戶登錄成功后才能調用該接口 ?
3接口調用示例:
std::wstring strPayContent = L"{\"notifyUrl\":\"https://api.game.com\", \
\"subject\" : \"1元禮包",\"totalFee\" : 1}";
int nRet = LGSDKPay((wchar_t*)strPayContent.c_str());
4. 服務端API介紹
4.1. 服務端獲取用戶信息接口
1. 請求地址https://auth.lenovomm.com/game-ms-id-auth-core/api/a ccount/identify
2. 請求類型:POST
3. Content-type: application/json
4. 參數(json字符串)
名稱 | 字段 | 是否必填 | 說明 |
標識 | realm | Y | 固定值,傳pcgame.lenovomm.com |
token | lpsust | Y | |
當前時間戳毫秒值 | timestamp | Y | |
隨機字符串 | nonce | Y | |
游戲id | appId | Y | |
簽名 | sign | Y | 請看7.1.4簽名備注 |
簽名類型 | sign_type | Y | 默認值RSA2 |
5. 返回值格式
{
?"code": 10000, ? ?//10000表示正常,非10000表示業務異常
?"data": {}, ? ?//返回的數據
?"message": "string" ?//錯誤提示信息
}
6. http狀態碼:
200-成功
400-缺少參數
401-簽名錯誤
500-業務異常
4.2. 服務端支付通知接口
接口說明
用于通知用戶支付狀態。
請求參數
url | 游戲方接收支付通知URL (即下單時傳遞的notifyUrl參數) | |||
接口協議 | HTTP[S] (POST) | |||
請求參數 | 參數名 | 參數類型 | 是否必填 | 說明 |
sign | 簽名 | string | *是 | 支付通知回調簽名,參加下方簽名規則 |
outTradeNo | 商戶網站唯一訂單號 | string | *是 | 商戶系統內部訂單號,同一商戶下唯一 |
subject | 商品名稱 | string | *是 | 商品的名稱,例:月卡、元寶、鉆石等 |
body | 商品描述 | string | 否 | 對一筆交易的具體描述信息 |
tradeNo | 支付寶、微信交易號 | string | 否 | 該交易在支付寶、微信系統中的交易流水號 |
tradeStatus | 交易狀態 | string | 否 | 支付狀態,TRADE_SUCCESS ——交易成功,其他值為失敗狀態 |
totalFee | 交易金額 | number | 否 | 該筆訂單的資金總額,單位為元,精確到小數點后兩位。 |
extraCommonParam | 公用回傳參數 | string | *是 | 用于商戶回傳參數,該值不能包含“=”、“&”等特殊字符。如果用戶請求時傳遞了該參數,則支付通知接口會回傳該參數。 |
通知接口返回
1. ?HTTP狀態碼為200,表明調用成功。其他狀態為失敗。
2. ?接口返回“success”,則代表交易成功,返回其他值則代表通知失敗。
3. ?針對通知失敗的訂單,會定時發起重試請求。
支付簽名規則
1. ?參數排序
所有請求參數剔除sign以及值為空的參數,按照參數字母升序排
2.參數拼接
將排序后的參數與其對應值,按照參數=參數值的格式,并用“&”字符將其拼接成串,在最后追加上支付key。
3. 對拼接后字符串做MD5并轉小寫。
4. 支付key
支付接口中所用的key與登錄接口的key不同,請注意區分
支付簽名示例
支付key :2ppfQCHMWid1
明文字符串:outTradeNo=465215151893&partner=208810156864&subject=game &totalFee=102ppfQCHMWid1
加密字符串:1bbdebc58f85e8b6f83797109ce76d89
4.3. 服務端用戶防沉迷接口
調用方法:
1. 請求路徑https://vb.lenovomm.com/game-ms-user-identify-core/api/underagegamepreventaddiction
2. 請求類型:POST
3. Content-type: application/json
4. Header參數
名稱 | 字段 | 是否必填 | 說明 |
標識 | realm | Y | 固定值,傳pcgame.lenovomm.com(不參與簽名) |
lpsust | token | Y | (不參與簽名) |
5. body參數(json字符串)
名稱 | 字段 | 是否必填 | 說明 |
當前時間戳毫秒值 | timestamp | Y | |
隨機字符串 | nonce | Y | |
游戲id | appId | Y | |
簽名 | sign | Y | 請看7.1.4備注 |
簽名類型 | sign_type | Y | 默認值RSA2 |
年齡 | age | Y |
6. 返回值格式
{
?"code": 10000, //10000表示正常,非10000表示業務異常
?"data": {
? ?"preventAddictionMsg": "限制登錄提示信息",
? ?"preventAddictionType": 1-不限制登錄,2限制登錄
?},
?"message": "Success"
}
7. http狀態碼:
200-成功
400-缺少參數
401-簽名錯誤
500-業務異常
5. SDK版本更新日志
5.1. V2.1.0內容變更
變更項 | 接入說明 |
1、登錄頁置頂展示,且滿足登錄窗口拖動 | 游戲登錄頁置頂在windows頁面最頂層 |
2、獲取用戶信息接口新增返回年齡 | 返回參數新增年齡字段 |
3、收銀臺支付封裝,可直接調起聯想SDK完成支付流程 | V2.1.0新增內容,V2.0.0可滿足支付的情況下,無需更新 |
6. 接入注意事項
登錄key和支付key不同,請區分使用
7. 其他說明
7.1. 安裝包提供
1. 安裝包需要同時提供2種形式:
a. 整包:需要將所需資源全部打包到一個安裝程序中,安裝過程無需下載額外資源;
b. 下載器:提供游戲下載器,安裝時通過下載器下載游戲資源;
7.2. 游戲的更新
1. 更新資源小于1G的版本更新在游戲內完成,無需向聯想游戲提供游戲更新包;
2. 更新資源大于1G的版本更新時,除游戲內更新外,還需要重新向聯想游戲提供安裝包,并提供版本更新說明;
3. 下載器如有更新,需要重新提供安裝包;
7.3. 游戲數據
1. 游戲方需要提供游戲數據,包含:游戲安裝完成數、游戲激活數、游戲卸載數、用戶游戲局數分布、用戶購買道具信息分布;
2. 建議以后臺形式提供;
7.4. 簽名備注
開發者需要自行實現簽名,簽名過程如下:
1.篩選并排序
獲取所有請求參數,不包括字節類型參數,如文件,字節流,不包括請求路徑中占位符的值,剔除sign字段,剔除值為空的參數,并按照第一個字符的鍵值ASCII碼遞增排序(字母升序排序),如果遇到相同字符則按照第二個字符的鍵值ASCII碼遞增排序,以此類推。
2.拼接
將排序后的參數與其對應值,組合成“參數=參數值”的格式,并且把這些參數用&字符連接起來,此時生成的字符串為待簽名字符串。
3.簽名
使用各自語言對應的SHA256WithRSA(對應sign_type為RSA2)或SHA1WithRSA(對應sign_type為RSA)簽名函數利用開發者私鑰對待簽名字符串進行簽名,并進行Base64編碼。
4.拼接參數
將生成的簽名賦值給sign參數,拼接到請求參數中,再將每個參數做urlencode(utf-8編碼)后發起請求即可。 注: 請求類型為:application/x-www-form-urlencoded才需要編碼,application/json 不用編碼
示例:
一、簽名準備
1. 原始內容: 【classifyCode=PC&v=&sign_type=RSA2&appId=20201028】
2. 簽名私鑰: 【MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQClcxcmpvWF8l0rjHtqmqCGXnzqnADYh3yirMlOVW+F8A+BboJfrOiyddwjLnNhwa02bSLu8jKdJ5QDLTKLvgQdQsEQviO9h22nu6ouFEfBT4rbxlc83B3vT1FZaT00DAHlATKDCARbjrQ0EEr57bkWX2SSKFEEOBCA06KwituJk/fGi6oNAD+e/KMxfPgdjzM2fwul2YxV1zHCSc/Xc7EBjjY/0tk/+/TehIBoE0zEpyzUXLVKt71i8qw0ygiRFO1Q3NTKT+Ht4ouK34827QvMpTQ/I0MGbdAtjZDLY6SNi1EoHp3X9xdr1kvP8XAggTiHG5lmL3EK62vTcbsA9KjzAgMBAAECggEBAJCNNH3tw3frICILVEz4miWr6kHkWQzVmzxZ8GvDU3PXIQT5s2i6HnjFZrdKPz76w0ZZJftUmooZ6US5OX9EXj3ec+YX6gwOhezVlsM5rtOjlnOcH94phvHt/+o5e2K81u7pE+PNnlkMHj+auJcSbvKwF6NnHBmujiSwQ2UxfMv+lwaazrTu/FFPFCMGtYkxeqC9Iwe9qJAQURCgE4lgzMuM2rUZqAPhZ298+c/lbovNWtV9tGb8jdiKprpUDuvYnJ4JHkUq5+V7WCtESzBUZVrXv0wkie2RJkN/OsirtwYFk+0MjX1sH4ciJFhY9atPfD1dZYBhhZezAQQuOU4ja1kCgYEA0Ia0Zo9z1GnWQbSyrdYwj9CgSm/fiZSU1nhVqmMJp3GWb9R42nMRcNk9Op4spreENCK1r55BZzmCMs4KIj9oiJz0ckczUgWoRHFUDwd5qWoMdCWlnJuQeFabd6bPxZRmXShIhIy1NQbk2lzIq4bpWKgEQ2TKSDaQ8S2JZj3q890CgYEAyx3M0pndOrpqyKYaJIJKsb+jX4NUSmFTzlWtASGKNG2MQeWwAHKkWi2GEv2g2w/XijNUL4FCkGwCT0o4v1HXRrs5LWRXislFHMDHAIdwrSWM5bouPesXDe67tC5hTmu8UhGsUfemB086uUgkqwZv23x0m9ZvHcfogN3FQS6faw8CgYBl6qB7S/uhwsSsQoPeAMSlVaMyHnGTzaHdHN1JtLQAObz8FU2n/vt0O0j4wFw0c5dS3/AK0H9I00u2Rwue53zQ4F19CR2lJgyyvu0Fl3K4AZPqpIfH/iRjHHlJxqbf+4L4Xvrqhdb+/sqViyms4/hik2PaCIXxO3Il3kq8RODzpQKBgQDCizlqIcs+e9zZcBasD0thsm7VheFPGKd/gpog8jIAg0iKuWd5FlUKtn2rZNgT2bmVehJRKdpKn9kafrmZrdamvZ5HNsuOd7bFknNIs3EdtlCcnFW8IpbDVnzcWGwFA7WtWZYWMEAK0j0px8qvMIwkyrCZrqpg+N9dxowvIWu5ywKBgGbULkj4HIuMOhCb68R1OLf2n8VloeuTnX0mHJWqvN2pFt2K8lm2ZWX4GpC09QZXw/1C0VM1syKsNbUe/2sprF0FYzbRrdvPk2yjvJbus5XhnPL5CW9zOUyu+KIHwsOOAVoNn37j3sZnQ3unS+it4Mpno+LbblCffGO/Czg68BX2】
二、生成待簽名字符串:
1. 剔除參數名(和參數值)前后的空格: (正常業務下,參數值前后不應含有空格) 【classifyCode=PC&v=&sign_type=RSA2&appId=20201028】 刪除空字段【v】
2. 剔除空值參數: 【classifyCode=PC&sign_type=RSA2&appId=20201028】
3. 排序: 【appId=20201028&classifyCode=PC&sign_type=RSA2】
三、生成簽名: 【DZw/dCtCgRkvszdCRKekzKDe2m+J8pZxh4eCk1DNOXE7SKq4TE6pm/z7N49LaSauEpXyX4MJR5VZSRUeu8avO3K4ma6MGcDMKg2lWD7MLwoA9O0Q7QXVlY04ytwlXw9GVya8oL+Dyka0CspTSPJUZtKf5oJRK03XMRyWJw6+ERJuMb2HptgknNPYhsm7B2SqCyDRaVUa69h9NxIxhm17ora3RNbSkThnbkaFtxAXSol7GGWHHng23uekv8MJSalwFSZS4tuPhc4EMIAigC57+pdntgGlzmHj9AfnQ1FODV9bk0cJYDaK7eYUxUZx2T/OfKtzawKoM+qLHTw27fB/1g==】
7.5. SDK兼容性說明
SDK僅支持Win10以上操作系統
原文地址:https://open.lenovomm.com/developer/doc?id=1689213143070081026
聯想開放平臺地址:聯想開放平臺
聯想開發者專屬QQ客服(工作日9:30-18:00):聯想開發平臺首頁右側懸浮的在線客服聊天入口可直接會話,無需添加好友。也可搜索官方客服QQ號2881414004。
聯想應用商店微信公眾號:
?