# 签名

虚拟货币支付请求、服务器查询余额、兑换道具和赠送接口都需要使用快手小游戏平台颁发的支付密钥生成签名,签名规则相同,参与签名的字段有所差异。

# 签名规则

  • 计算签名使用从开放平台获得的支付密钥,参数签名建议放在服务端进行,这样不需要将支付密钥放在游戏包内,以免支密钥泄露。
  • 签名/验签时请务必排除空字段

# 实例

  • 以下单接口为例,参与签名的字段如下:
zone_id-> 区服ID + "_" + 角色ID 的格式拼接 serverId_roleId,必传非空
os->用户设备系统,必传非空
currency_type->货币类型,必传非空
buy_quantity->货币购买数量,必传非空
third_party_trade_no->游戏自定义的订单号,必传非空
extension->开发者自定义的其他信息,非必填,当为非空字符串时参与签名,否则不参与签名
  • 签名流程
  1. 联系平台运营,获取支付密钥
var sign_key = "B7Y0c6E5bCKMEQOsvCExziNhq16ObGqh"; // 非真实密钥,仅做示例
  1. 参与签名相关参数
var params = {
   "zone_id": "fu001_role001",
   "os": "android",
   "currency_type": "CNY",
   "buy_quantity": 100,
   "third_party_trade_no": "123456",
   "extension": "{}"
}
  1. 按照key=value的格式,并按照参数名ASCII字典序升序排列 k=v&k1=v1… 签名串示例:
stringA = "buy_quantity=100&currency_type=CNY&extension={}&os=android&third_party_trade_no=123456&zone_id=fu001_role001"
  1. 使用算法HMAC-SHA256,得到签名
sig=hmac_sha256(sign_key, stringA)
  = c16908b30bf05f54f7aa89326308fa9ed9c98c96d6aa58be682a3b75e4f2a907

PS: 密钥请联系运营获得

# 相关实现

HMAC-SHA256算法

public static String sha256Hmac(String message, String secret) {
    String hash = "";
    try {
        Mac sha256Hmac = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        sha256Hmac.init(secretKey);
        byte[] bytes = sha256Hmac.doFinal(message.getBytes());
        hash = byteArrayToHexString(bytes);
    } 
    catch (Exception e) {
        logger.error("sha256Hmac exception :{},:{}", message, secret, e);
    }
    return hash;
}

byte字符串转hex字符串

private static String byteArrayToHexString(byte[] b) {
    StringBuilder hs = new StringBuilder();
    String stmp;
    for (int n = 0; b != null && n < b.length; n++) {
        stmp = Integer.toHexString(b[n] & 0XFF);
        if (stmp.length() == 1) {
            hs.append('0');
        }
        hs.append(stmp);
    }
    return hs.toString().toLowerCase();
}