环境:
客户端:cocos creator2.4.3
服务器:openresty
官方网站:https://microapp.bytedance.com/docs/zh-CN/mini-game/develop/open-capacity/log-in/tt-login
1.登录。目前不能使用匿名登录必须强制授权。
客户端:使用官方提供的示例代码即可。
tt.login({
force: true,
success(res) {
console.log(`login 调用成功${res.code} ${res.anonymousCode}`);
},
fail(res) {
console.log(`login 调用失败`);
},
});
得到code拿来登录。
服务器:登录换取openid
function utils.request_verify_session_byte(code, anonymous_code)
local httpc = http.new()
local params = "appid="..byteapppid.."&secret="..bytesecret.."&code="..code
return httpc:request_uri("https://developer.toutiao.com/api/apps/jscode2session?"..params, {
method = "GET",
})
end
-- byteappid 字节的app id
-- bytesecret 字节的secret id
-- code 客户端登录获得的
-- 成功返回 open id
2.支付
准备工作:在字节管理后台设置支付参数
客户端调起支付界面前,需要向自己的服务器创建订单,已获得订单ID:order_id.
客户端流程:
1.请求开发后端创建订单order_id.
2.调起支付:
let payData = {
mode: 'game', // 支付类型
env: 0, //支付环境
currencyType: "CNY", // 币种:目前仅为 "CNY"
platform: "android", // 申请接入时的平台:目前仅为"android"
buyQuantity: buyData.productPrice, // 购买数量,必须满足:金币数量*金币单价 = 限定价格等级(详见金币限定等级)
zoneId: "1",
customId: orderID, //开发者自定义唯一订单号。如不填,支付结果回调将不包含此字段,将导致游戏开发者无法发放游戏道具, 基础库版本低于1.55.0没有此字段
extraInfo: JSON.stringify({
userId: userID, //用户自定义额外信息,支付结果回调信息包含此字段, 基础库版本低于1.55.0没有此字段
version: "v0.0.0",
price: productPrice,
}),//extraInfo要转成字符串
success(res) {
console.log("字节跳动支付调用成功:", res);
},
fail(res) {
console.log("字节跳动支付调用失败:", res);
},
}
tt.requestGamePayment(payData)
3.支付成功之后,字节服务器会回调上一步页面配置的回调地址。顺便说一下,这个回调地址配置完成后,需要在页面进行验证,验证req的参数都放在query里的,处理代码大概是这个样子的(openresty)
pay_router:get("/cb", function(req, res, next)
local signature = ngx.escape_uri(req.query["signature"])
local msg = ngx.escape_uri(req.query["msg"])
local echostr = ngx.escape_uri(req.query["echostr"])
local nonce = ngx.escape_uri(req.query["nonce"])
local timestamp = ngx.escape_uri(req.query["timestamp"])
local token = cfg.bytetoken
local params = {token, timestamp, nonce, msg}
table.sort(params)
local str = table.concat(params)
local sign = string.lower(utils.bin2hex(ngx.sha1_bin(str)))
if sign == signature then
ngx.log(ngx.ERR, "byte get cb success")
else
ngx.log(ngx.ERR, "byte get cb failed.data=", utils.json_encode(req),".our sign:", sign, ",byte sign:", signature)
end
ngx.print(echostr)
end)
正式支付的时候,回调发起的是POST方法,接口名不变,处理代码大概是这个样子的:
pay_router:post("/cb", function(req, res, next)
local body = req.body
local token = cfg.bytetoken
ngx.log(ngx.ERR, "bytepay cb: req:", utils.json_encode(req))
local params = {token, body.timestamp, body.nonce, body.msg}
table.sort(params)
local str = table.concat(params)
local sign =string.lower(utils.bin2hex(ngx.sha1_bin(str)))
if body.signature == sign then
ngx.log(ngx.ERR, "bytepay check signature ok")
local status = 'success'
local msg = utils.json_decode(body.msg)
-- 充值OK,下发充值物品。
local ret = game_pay(utils.json_decode(msg.cp_extra).userId, msg.cp_orderno)
if ret.errCode ~= 0 then
res:json({''})
else
res:json({body.echostr})
end
else
ngx.log(ngx.ERR, "bytepay pay cb sign check err. own sign= ", sign, ".byte sign=", body.signature)
res:json({''})
end
end)
其他接口可参考官方文档进行补充,比如获取玩家充值货币,轮询进行补单等。