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。
联想应用商店微信公众号: