# 账号绑定功能接入

# 一、产品介绍

为了丰富玩家数据,促进各游戏相关平台生态互通,微信游戏制定了外部账号绑定机制,方便微信和第三方平台、账号互绑和数据打通。 当前微信游戏可接入以下用户数据:

可支持数据类型

# 二、具体场景示意

表格1表格2

# 三、名词约定

  • 微信游戏: 微信游戏中心,主要入口:微信-> 发现-> 游戏。
  • 第三方(平台):与微信游戏中心账号互相绑定的、除微信游戏以外的平台。

# 四、整体流程详解

流程图 (以腾讯视频:双城之战为例)

  1. 起始为场景为绑定/授权场景(图中①),该场景为微信游戏中的场景,由微信游戏负责。该场景中会引导用户进入绑定流程。
  2. 进入绑定流程后会先展示 Loading 态的中间页(图中②),该页面由微信游戏负责提供。若用户没有绑定过账号,或者之前绑定过账号后解绑了,则可继续跳转至第三方平台的登录绑定页面(图中③)。
跳转中间页链接(微信游戏侧提供)示例:
https://game.weixin.qq.com/cgi-bin/h5/lite/externalaccount/authorization.html?appid=wg88fc141186626f15&biz_id=4

  1. 第三方平台的登录绑定页面(图中③),这里登录方式任意,可以是微信,手机号或者其他登录方式。注意,该页面由第三方平台负责,该页面的开发者需完成第三方平台在微信的登录授权功能以及登录完成后将第三方平台的账号和微信游戏账号进行绑定的操作。
第三方平台登录绑定页链接(第三方提供)示例:https://test.m.v.qq.com/z/login-auth/wxGame/index.html?code=AAQeWlMFAAABAAAAAAB81kz5VUWpGwpf000GZxAAAADRmciqOyn39xY4x1PR3IA5CHkwxc0NRespfOhClr2s6ZDYmj0idPhoWf65H7z8WTo0OdhC-kpPsrMlXJusEO2x&open=1&callback_url=https%3A%2F%2Fgame.weixin.qq.com%2Fcgi-bin%2Fh5%2Flite%2Fexternalaccount%2Fauthorization.html%3Fgrant_biz_id%3D4%26grant%3D1%26appid%3Dwg88fc141186626f15%26biz_id%3D4

链接参数说明:
code: 微信游戏带在第三方平台的登录绑定页面链接上的微信游戏相关凭证;
open: 微信游戏带在第三方平台的登录绑定页面链接上的登录绑定成功的回调方式,即链接中 open=1 代表微信游戏告诉第三方成功后请使用 wx sdk 提供的关闭窗口的方法【见下方:第三方账号绑定页需具备的能力】关闭当前页面。
callback_url: 微信游戏带在第三方平台的登录绑定页面链接上的登录绑定成功的回调地址,注意如果已经有open=1这个参数和值请优先使用上述方法,否则重定向到callback_url。

  1. 在第三方平台完成绑定后,无论是直接关闭页面或者重定向到指定链接,一般会进入隐私授权页(图中④、⑤)。当然,第三方平台不一定需要获取微信游戏的数据,因此图中④之后可以直接到达图中⑥。 注意,图中④这个授权页(即微信游戏申请第三方平台数据)可以是第三方平台自己提供,这样第三方平台可以保存用户选择是否授权给微信游戏,从而在微信游戏向第三方平台请求数据时,根据用户的选择决定是否提供数据给微信游戏。当然也可以由微信游戏提供并管理数据。图中⑤第二个授权页则是微信游戏提供。
微信游戏获取第三方应用的数据隐私授权链接(微信游戏提供)示例:
https://game.weixin.qq.com/cgi-bin/h5/lite/externalaccount/authorization.html?grant_biz_id=4&grant=1&appid=wgc0e34f8271dda8f0&biz_id=4&source=0

第三方平台(主体)获取微信游戏的数据隐私授权链接(微信游戏提供)示例:
https://game.weixin.qq.com/cgi-bin/h5/lite/externalaccount/authorization.html?grant_biz_id=4&grant=1&appid=wgc0e34f8271dda8f0&biz_id=4&source=1

如果某个第三方平台和微信游戏互相都需要获取对方数据,且隐私授权页都由微信游戏提供,则上述链接会带上 next=1, 表明还有下一步,例:
https://game.weixin.qq.com/cgi-bin/h5/lite/externalaccount/authorization.html?grant_biz_id=4&grant=1&appid=wgc0e34f8271dda8f0&biz_id=4&source=0&next=1

# 五、第三方接入详解

  • 主要工作

1. 开发账号登录页面 需要做一个 H5 页面用于游戏账号登录,并提供登录链接地址,微信游戏侧需要配置跳转(这里我们不关心第三方的登录方式,可以是微信,手机号或者其他登录方式)。

2. 后台做绑定流程,存储用户的绑定关系 进行一个 oauth2 的授权流程拿到用户的 token 和 openid。在拿到 access_token 后需要做后台账号绑定流程,在绑定成功后需要存储用户 refresh_token,openid 和绑定关系。

3. 接入游戏行为数据并传输给微信游戏 跟微信游戏运营约定好需要传输的数据,然后开发接入对应的游戏行为数据,最后通过接口传输给微信游戏。

  • 时序图

时序图

  • 给第三方提供的接口

应用的含义: 微信游戏会给第三方分配一个应用,一个应用可以绑定多个游戏。绑定是以应用为维度,绑定了应用就会绑定应用下面的所有游戏。比如米哈游作为一个应用,米哈游下面绑定了原神、星铁两个游戏。用户绑定米哈游账号之后,相当于绑定原神、星铁两个游戏。如果只想绑定一个游戏,可以一个游戏单独申请一个应用,一个应用绑定哪些游戏是第三方决定,需要同步给微信游戏运营。

** 接口参数定义:**

接口参数定义

注意这里的 game_platform_access_token 和微信开平 access_token 不是一个体系,两边是不互通的

下面接口强调需要签名的,签名方案都走:服务端 API 预分配密钥签名指南

下面的字段没有标明是可选的都是必填的字段

  1. 跳转第三方登录页面链接会带上 code,登录页面 redirect_uri 需要给到微信游戏。 跳转登录页: redirect_uri/?code=CODE&param=PARAM param:是第三方自定义的参数,微信游戏跳转只是透传 code:用户身份认证,用于第三方后台换取 game_platform_access_token

  2. 通过 code 换取网页授权 access_token

在第三方完成账号登录后,需要把 code 传给第三方后台,第三方后台进行后续的流程

这个接口需要签名

URL: https://game.weixin.qq.com/cgi-bin/gameplatformauthwap/getaccesstoken
POST:
{
	"game_platform_appid": "APPID", // 具体值是微信游戏给出的应用ID
    "code":"CODE" // 具体值登录页面上面微信游戏拼的 code 参数
}

返回:
{
	"game_platform_access_token": "ACCESS_TOKEN",
    "access_token_expire_time":1724811189,  
        // game_platform_access_token 过期时间,现在是两个小时
    "refresh_token_expire_time":1724811189, 
         // game_platform_refresh_token 过期时间,现在是一个月
    "game_platform_refresh_token": "REFRESH_TOKEN",
    "game_platform_openid":"OPENID"
}

错误码: -1000001:code 过期,需要重新发起授权 -1000006:参数 game_platform_appid 和 code 编码的 game_platform_appid 不一致

  1. game_platform_access_token 续期接口

在 game_platform_access_token过期后,需要刷新。这里会返回一个新的 refresh_token,业务需要替换旧的 refresh_token

这个接口需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformauthwap/refreshaccesstoken
POST:
{
   "game_platform_appid": "APPID", // 具体值是微信游戏给出的应用ID
   "game_platform_refresh_token":"TOKEN", 
      // getaccesstoken 或者 refreshaccesstoken 接口返回的 game_platform_refresh_token,每次拿到新的都替换旧的
   "game_platform_openid":"OPENID" 
      // getaccesstoken 接口返回的 game_platform_openid,不会变
}

返回:
{
    "game_platform_access_token": "TOKEN",
    "access_token_expire_time":1724811189, 		   
        // game_platform_access_token 过期时间,现在是两个小时
    "game_platform_refresh_token":"REFRESH_TOKEN", 
    "refresh_token_expire_time":1724811189,		   
        // game_platform_refresh_token 过期时间,现在是一个月
    "game_platform_openid":"OPENID"
}

错误码: -1000002:game_platform_refresh_token 数据不合法 -1000003:game_platform_refresh_token 过期 -1000006:参数 game_platform_appid 和 refresh_token 编码的 game_platform_appid 不一致

  1. 绑定接口

这个接口第三方需要调用,不然微信测不知道哪些用户绑定过,后续的同步数据会失败。可选的字段可以不填

这个接口不需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformlogicwap/bindaccount?game_platform_access_token=TOKEN&game_platform_openid=OPENID
POST:
{
   "game_platform_appid": "APPID",
   "thirdplat_openid":"THIRDPLAT_OPENID", 
      // 第三方 openid,对于一个账号需要保证一个应用下唯一。由第三方生成=
   "thirdplat_nick_name":"NAME", // 用户在第三方的昵称,可选
   "masked_display_name":"DISPLAY_NAME", 
      // 用户在第三方的账号掩码,可选。比如手机号登录,可以传 "135******76",方便用户在账号管理的时候提醒用户绑定了哪个账号
   "thirdplat_head_img_url":"URL" // 用户在第三方的头像,可选
}

返回:
{
	"errmsg": "ok"
}

错误码: -40001:game_platform_access_token 过期 -200004:thirdplat_openid 已经被人绑定 -1000004:game_platform_access_token 数据非法

  1. 解除绑定接口

这个接口第三方可选,解绑功能在微信游戏设置里面有做,第三方可以不做

这个接口不需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformlogicwap/unbindaccount?game_platform_access_token=TOKEN&game_platform_openid=OPENID
POST:
{
   "game_platform_appid": "APPID",
   "thirdplat_openid":"THIRDPLAT_OPENID"
}

返回:
{
	"errmsg": "ok"
}

错误码: -40001:game_platform_access_token 过期 -1000004:game_platform_access_token 数据非法 -200001:thirdplat_openid 已经被人绑定

  1. 获取用户信息接口

这个接口第三方可选。绑定成功后,第三方可以保存用户的头像昵称,头像需要自己转存,链接可能会失效

这个接口不需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformlogicwap/getuserinfo?game_platform_access_token=TOKEN&game_platform_openid=OPENID
POST:
{
   "game_platform_appid": "APPID"
}

返回:
{
   "nick_name": "NAME",
   "head_img_url":"URL",
   "game_platform_openid":"OPENID"
}

错误码: -40001:game_platform_access_token 过期 -1000004:game_platform_access_token 数据非法

  1. 传输数据给微信游戏,生成用户事件

同步的数据项需要跟微信游戏的运营对。这里传的格式是 key-value 方式。微信游戏会有一个管理端,对 key-value 进行运算生成对应的事件

这个接口需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformlogicwap/reportgamedata?game_platform_access_token=TOKEN&game_platform_openid=OPENID
POST:
{
    "game_platform_appid": "APPID",          // 应用ID
	"thirdplat_appid": "wxd0ba2ae8ccfcda5e", 
        // 第三方游戏 appid,可以是开平的 appid,圈子的 group_out_id,由微信游戏给出
	"data_list": [{
		"key": "winbean", 
		"value": 1234 // // 如果是数值类型的就填数值,如果是字符串就填字符串
	}]
}

返回:
{
	"errmsg": "ok"
}

错误码: -40001:game_platform_access_token 过期 -1000004:game_platform_access_token 数据非法

这里有设置几个通用的 key,如果要上报按下面的 key 来上报 key

如果是数值类型的数据,微信游戏会有一些统计项,统计项如下:

message GamePlatformUserData {
  optional string key = 4;                    // 数据的 key
  optional int64 value = 5;                   // 数值类型的 Value
  optional string string_value = 6;           // String value
  optional uint32 value_type = 7;             // value 的类型 1-数字 2-字符串
  optional uint64 last_update_time = 8;       // 最近更新时间
  optional int64 max_in_day = 9;              // 该天最大值 day_max
  optional uint64 max_stamp_in_day = 10;      // 该天最大值的上报时间 day_max_stamp
  optional int64 max_in_week = 11;            // 自然周最大值 week_max
  optional uint64 max_stamp_in_week = 12;     // 自然周最大值的上报时间 week_max_stamp
  optional int64 max_in_history = 13;         // 历史最大值 total_max
  optional uint64 max_stamp_in_history = 14;  // 历史最大值上报的时间 total_max_stamp
  optional int64 total_in_day = 15;           // 一天内的数值和
  optional int64 total_in_week = 16;          // 自然周的数值和
  optional int64 total_in_history = 17;       // 历史累加值
}
  1. 当用户回流后,通知用户来游戏圈续期绑定关

当第三方超过30天没有续期 game_platform_refresh_token,就认为用户已经流失,这个时候需要续期

当用户回流的时候,第三方可以调用这个接口,然后游戏中心会提醒用户来续期。当用户续期成功后,refreshaccesstoken 接口就会接受之前过期的 game_platform_refresh_token,返回一个新的 game_platform_refresh_token

这个接口需要签名

URL:https://game.weixin.qq.com/cgi-bin/gameplatformlogicwap/reportuserreflux
POST:
{
   "game_platform_appid": "APPID",
   "game_platform_refresh_token":"TOKEN",
   "game_platform_openid":"OPENID"
}

返回:
{
    "errmsg": "ok"
}

错误码: -1000002:game_platform_refresh_token 数据不合法 -1000008:频率限制,一个 game_platform_openid一天只能上报一次

  • 第三方账号绑定页需具备的能力

以下两种能力至少满足一个,且请优先使用第一个

  1. 登录绑定成功后,支持关闭当前页面,可调用 wx.closeWindow,具体参考JS-SDK说明文档
  2. 登录绑定成功后,支持重定向到目标页面 登录页的链接可以提供重定向链接的入参,登录绑定成功后,重定向到指定链接。具体:Location.replace()