Skip to content

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

Back to top