LCM服务端 接入指南
1、游戏服务端与LCM服务端交互(GS vs LS)
- 简体域名
- Production: https://lcm-prod-cn-live.mobage.cn/
- Sandbox : https://lcm-sand-cn-live.mobage.cn/
- 繁体域名
- Production: https://lcm-prod-ap-live.mobage.cn/
- Sandbox : https://lcm-sand-ap-live.mobage.cn/
- Basic Authorization Token:
- Game Server和LCM Server之间使用Oauth2的Client Credentials Grant模式进行授权。
- LCM系统事先线下发行consumer key和consumer secret给Game Server方,每一次Game Server通过Web API调用LCM Server的时候,都需要在Http的header里面加入Authorization头, 头的值为Basic xxxxxxxxxx(注意Basic和xxxxxxxxxx之间有空格), 其中xxxxxxxxxx为Basic Authorization token。
- 以下为xxxxxxxxxx的生成方法:
- 1, 令a = urlencode(consumerkey)
- 2, 令b = urlencode(consumersecret)
- 3, 令c = concat(a, ':', b)
- 4, 令d = base64(c); 于是d就是Basic Authorization token。
1-1 登录相关 RESTFULAPI
- auth/validate : 指定一个accessToken,检查该accessToken是否合法
- Method: POST
-
Request:
type value Authorization Basic #{token} Accept application/json Content-Type application/json Request body {"accessToken": "xxx.xxx.xxx"} -
Response:
type value Content-Type application/json Response body {"storeType": "LCM_A_CN","valid": true,"lid": "1000000000090795","rnInfo": 1,"storeAccount": "1003739633"}
无 realNameExceptionInfo 字段:
{
"storeType": "LCM_A_CN",
"valid": true,
"lid": "1000000000090795",
"rnInfo": 1,
"rncStatus": 0,
"storeAccount": "1003739633"
}
有 realNameExceptionInfo 字段:
{
"lid": "1000000000095791",
"StoreType": "APPLE",
"rnInfo": 1,
"rncStatus": 0,
"storeAccount": "1002519540",
"realNameExceptionInfo": {
"code": "9992000",
"message": "not available for minor",
"trace": "192899.60.16065656803670299"
},
"valid": true
}
rncStatus -> 认证状态:0: 认证成功 1: 认证中。2: 认证失败 3:待认证
-
防沉迷相关异常码【
realNameExceptionInfo
】code message desc 9991900 NEED_RECORD_REAL_NAME_INFO_CAN_SKIP 需要实名且可跳过 (实名制) 9991901 NEED_RECORD_REAL_NAME_INFO_CANNOT_SKIP 需要实名且不可跳过(实名制) 9992000 not available for minor 未成年游玩时间段限制生效(防沉迷) 9992001 reached play time limit 未成年游玩总时长限制生效(防沉迷)
新增字段 :
rnInfo -> 实名信息【0 : NO_REAL_NAME_INFO(无实名信息); 1 : IS_MINOR(未成年) ;2 : IS_ADULT(成年)】
storeAccount -> 商店账号
-
状态码
status description 200 OK 400 request body is wrong 401 basic token invalid 429 too many request 500 Internal Server Error
1-2 支付相关 RESTFULAPI
- bank/spend/{lid} : 消费用户的L币(lid 用户标识)
- Method: POST
-
Request:
type value Authorization Basic #{token} Accept application/json Content-Type application/json Request body {"items":[ ],"memo":"","billingId":"abc123"} -
Response:
type value Content-Type application/json Response body {"transactionId": "hSkwNL-wQQN-qF-P-oOXhvphg", "paidAmount": 7, "freeAmount": 2,"paidBalance": 1030,"freeBalance": 10 } -
状态码
status description 200 OK 400 bad request 401 basic token invalid 402 invalid parameter 403 指定的用户不存在指定的storeType的Bank信息 409 余额不足 429 too many request 500 Internal Server Error -
Example for Request body:
简洁模式(推荐):
{
"items": [{
"id": "gacha1",
"totalValue": 300,
"quantity": "1"
}, {
"id": "gacha2",
"totalValue": 200,
"quantity": "3"
}],
"memo": "可选,供游戏记录更多信息",
"billingId": "abc123:可选(最长128个字符)"
}
旧模式(继续兼容):
{
"items": [{
"id": "gacha1",
"paidValue": 100,
"freeValue": 200,
"totalValue": 300,
"quantity": "1"
}, {
"id": "gacha2",
"paidValue": 200,
"freeValue": 0,
"totalValue": 200,
"quantity": "3"
}],
"memo": "可选,供游戏记录更多信息",
"billingId": "abc123//可选(最长128个字符)"
}
-
注意:
-
1.物品价格:
- totalValue是物品的单价(对应商品配置中L币的数量),如果未传入totalValue或该值为0,则看paidValue和freeValue,如果有值,则不关心paidValue和freeValue的值;
- paidValue和freeValue加起来是物品的單價。quantity是物品的數量。
- L服務器端會計算總共這條request應該扣除多少Paid L幣和Free L幣;
-
paidTotal = sum(paidValue*quantity) 例子中 paidTotal = 100*1 + 200*3
即 item gacha1 和 gacha2 总的paidValue之和freeTotal = sum(freeValue*quantity)
例子中freeTotal = 200*1 + 0*3
即item gacha1 和gacha2 总的freeValue之和 -
2.余额判断:
- 有totalValue时,
totalValue>paidBalance+freeBalance
则余额不足; -
没有totalValue时,paidBalance和freeBalance分别判断
paidTotal>paidBalance
或者freeTotal>freeBalance
都会是余额不足 -
3.支付:
-
有totalValue时,先消费freeBalance, 后消费paidBalance
-
4.billing id:
- 该字段是可选的,主要用于超时重试,如果不传会直接扣款,如果传了,第一次会扣款,重复传多次不扣款,第三方可用该字段重试一些失败的消费,不同消费操作传入全局唯一的值,同一笔消费重试时每次传入相同的值。
1-3 支付相关 RESTFULAPI(可选)
- bank/queryConsume/{billingId} : 消费记录查询(billingId 消费订单标识)
- Method: POST
-
Request:
type value Authorization Basic #{token} Accept application/json Content-Type application/json Request body -
Response:
type value Content-Type application/json Response body {"code":"204", "message": "the consume record already exist"}
* code : 204表示已经存在消费记录,205表示不存在消费记录
-
状态码
status description 200 OK 400 bad request 401 basic token invalid 402 invalid parameter 402 指定的用户不存在指定的storeType的Bank信息 409 余额不足 429 too many request 500 Internal Server Error
1-4 证书相关 RESTFULAPI
- rest/certifications: 获取认证证书
- Method: GET
-
Request:
type value Authorization Basic #{token} Accept application/json Content-Type application/json Request body - Response: type value Content-Type application/json Response body `{ "date1":"base64 certification data","date2":"base64 certification data" } - Example for Request body:
{
"20150501": "-----BEGIN CERTIFICATE-----\n
MIIBzTCCATagAwIBAgIGAUgpV/1eMA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNVBAMM\n
H2xjZC1zYW5kYm94LXN0YWdpbmcuYXBwc3BvdC5jb20wHhcNMTQwODMwMjM1NTA1\n
WhcNMTQwOTAxMTE1NTA1WjAqMSgwJgYDVQQDDB9sY2Qtc2FuZGJveC1zdGFnaW5n\n
LmFwcHNwb3QuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGXBof38M3\n
Zu9rKBa/YPIpVgcn/7hylJqLvVYNCVS/ip5VkSTLeRwKzYHqXlZLAJSU/svEYI6D\n
atnITqlIEL4mMnQk1jF5AbXIxzdvx4rBt4Ta24ZvqH42OlczQmNSjZDUPbaKw3kL\n
S+Lhdex1L+bxTGxaCB0BLv8F/FcQx//IhwIDAQABMA0GCSqGSIb3DQEBCwUAA4GB\n
AIRxdmeQDvQVv57ABjpZOkT/61F3tVFcbqpEkz2Y9sKbVnx+e6yTFNZ+txpjkcIl\n
oItzXP4JhN6/2ZKtJ6oD1etax4qyHLr3d03NBc/V5LMRo2fyyhpYn1qRifDGd1vz\n
/fFUEXLdmWlFErjkR6jd5hhYrPJIDDMZTTMJ3g0BtL7w\n
-----END CERTIFICATE-----\n",
"20150502": "-----BEGIN CERTIFICATE-----\n
MIIBzTCCATagAwIBAgIGAUgkMZVMMA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNVBAMM\n
H2xjZC1zYW5kYm94LXN0YWdpbmcuYXBwc3BvdC5jb20wHhcNMTQwODI5MjM1NTAy\n
WhcNMTQwODMxMTE1NTAyWjAqMSgwJgYDVQQDDB9sY2Qtc2FuZGJveC1zdGFnaW5n\n
LmFwcHNwb3QuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+VkIZB7Ci\n
YfcpOwUM+V6jx5g75TxZn+3CofwaWy91EbvZYZqY9+q6h+LHHyk+Ej3ycYG/y4+/\n
tOQ89icJsKgJ0yKNcHuktx45iCA1PSW1EkZOc230HLLZQqyW/bnUMyLBFSE/LkUp\n
HEGSRSdT/6OaN2qUkwgEPHG1r2/1AjrleQIDAQABMA0GCSqGSIb3DQEBCwUAA4GB\n
ABy7Eepnw+aZSmhH1SvG2day1wdTTsHdM8tFI9sQLa9TS0YKhnaux5hUmKWClXbu\n
xBx+/T8d+kfCxUV1/N+yQfGWAMj0L/2TMJAOujBs54GJxpQVIpscaX9N8kmLETOp\n
9UlpEufxW39+qKNc4rVQ2PI9ZjETsZpavtgZjM+KQ8Nl\n
-----END CERTIFICATE-----\n"
}
-
状态码
status description 200 OK 400 request body is wrong 401 basic token invalid 429 too many request 500 Internal Server Error
1-5 恶意退款订单查询 RESTFULAPI(可选)
- bank/order/refund/query : 查询谷歌、苹果恶意退款订单信息
- Method: GET
-
Request:
-
1、headers
name value Authorization Basic #{token} -
2、Request body
name description 类型 queryType 查询类型,1:返回最近15分钟内的恶意退单信息,2:返回指定时间范围内的恶意退单信息,3:根据lid进行查询,不传时间范围则默认查询指定lid的最近15分钟内的恶意退单信息 Integer startTime 起始时间,不得超过当前时间1个月,当查询类型为2时为必传参数 Long endTime 截止时间,当查询类型为2时为必传参数 Long lid 用户的lid,想根据用户的lid进行查询时传入 Long -
Response:
-
1、Response body
name description returnCode 返回状态码,200表示返回成功 returnMsg 返回结果msg returnData 返回结果集,为json格式 totalCount 返回结果总数,为returnData内的值 data 退单信息集合,为returnData内的值 -
2、examples:
正常返回时:
{
"returnCode": 200,
"returnMsg": "successed",
"returnData": {
"data": [
{
"orderId": "HeDX88-lmTd-WBq--48ZTrS0g",
"storeType": "GOOGLE",
"lid": 1000000000058786,
"lnum": 1,
"sku": "lcm.dena_zhifu.alipay.tire01",
"memo": "from api test"
},
{
"orderId": "LdWD9O-g2TH-myar-aULkjqhw",
"storeType": "GOOGLE",
"lid": 1000000000058787,
"lnum": 1,
"sku": "lcm.dena_zhifu.alipay.tire01",
"memo": "from api test"
}
],
"totalCount": 2
}
}
异常返回时:
{
"returnCode": 100,
"returnMsg": "startTime can't beyond lately one month",
"returnData": {}
}
-
3、状态码:
status description 200 OK 400 request body is wrong 401 basic token invalid 500 Internal Server Error
1-6 注销相关 RESTFULAPI
- auth/logOff : 注销接口,指定一个accessToken,检查该accessToken是否合法,检验合法后可唤起注销
- Method: POST
-
Request:
type value Authorization Basic #{token} Accept application/json Content-Type application/json Request body {"accessToken": "xxx.xxx.xxx"} -
Response:
type value Content-Type application/json Response body {"redirectURL":"https://tickets-prod-cn-stage.mobage.cn/1?type=0&content=mbyYRznNR8u0Z5PhKBMx8rKcEBCNQ1DPM8FRMrsl3aLm3reGlp7h5A2GgQq4F7DGg8Yk6b4KrMwEnKx5Q/U%2BPmD4qA/BHSGk2DUGlsUF1yPNFaA6UGJuxc3C%2BekOZCDaWHIml2%2BR1pJMc04IEdChZc/woJ7yHMG4Qa9k/75k9JQRWfTt%2BaIbIYR%2BSn5LY1fb6KwjVMqxTOWPy6f4IiU5irYa0wGE58N/M41I/OZXI2A%3D&logOff=1"}
备注 :
1.Response body 返回结果中redirectURL为重定向URL,只需游戏方将redirectURL对应的网页展示出来(游戏内部通过webview打开),具体注销功能由lcm实现
2.可参考 服务器1.0接入文档中 1-1 登录相关 接口中的参数值
-
状态码
status description 200 OK 400 request body is wrong 401 basic token invalid 429 too many request 500 Internal Server Error
2、联系方式
LCM-SERVER
邮箱:mobageplatformdev_cn@dena.jp