积分打赏接口开发指引

功能介绍

POLYV支持与用户的积分系统对接,实现积分打赏。参照本文档提供的积分查询接口和积分更新接口,配置在POLYV后台的通用设置,使用系统生成的观看链接,配合外部授权、自定义授权或者白名单观看条件使用(目前在无限制观看条件和只有验证码观看条件时不能使用),观众在看直播时可消耗积分并打赏给主播。

获取观众积分接口

说明

通过传递观众的id 和频道号等参数,对用户的积分查询接口URL 进行请求,获取学员在平台的积分

请求方式

GET

请求参数

参数 类型 说明
channelId int 频道号
viewerId string 观众ID
viewerName string 观众昵称
sessionId string 直播场次ID,在未直播时可能返回为空
ts long 当前13位毫秒级时间戳
appId string 账号在polyv后台的应用ID
sign string 用于校验的sign,生成方法参考文档底部

注意:如果您设置的积分查询接口URL 包含参数,直播系统调用接口时会将这些参数同时带上,并且这些参数会参与sign 的拼接加密生成

接口返回要求

请求成功:
{
    "code":200,
    "status":"success",
    "message":"",
    "data":100.00
}
请求失败:
{
    "code":400,
    "status":"error",
    "message":"相关错误信息",
    "data":null
}
参数说明
参数 类型 说明
code int 接口请求状态码,200表示成功,非200表示失败
status string 接口请求状态,success 表示成功
message string 接口错误提示,注意:请求出错时,页面显示的提示为polyv 积分打赏所设置的提示
data float 请求成功时为观众的积分

观众打赏道具接口(修改观众积分)

说明

观众观看页选择了相应道具进行打赏时,请求积分更新接口URL修改在平台的积分

请求方式

POST

请求参数

参数 参数类型 说明
channelId int 频道号
viewerId string 观众ID
sessionId string 直播场次ID,在未直播时可能返回为空
ts long 当前13位毫秒级时间戳
appId string 账号在polyv后台的应用ID
goodName string 打赏的道具名称
goodPrice float 打赏的道具的所需积分
goodNum int 打赏的道具的数量
count float 此次打赏所需积分总数
sign string 用于校验的sign,生成方法参考文档底部

注意:如果您设置的积分更新接口URL 包含参数,直播系统调用接口时会将这些参数同时带上,并且这些参数会参与sign 的拼接加密生成

接口返回要求

请求成功:
{
    "code":200,
    "status":"success",
    "message":"",
    "data":100.00
}
积分不足:
{
    "code":400,
    "status":"error",
    "message":"相关错误信息",
    "data":null
}
请求失败:
{
    "code":403,
    "status":"error",
    "message":"相关错误信息",
    "data":null
}
参数说明
参数 类型 说明
code int 接口请求状态码,200表示成功,400表示积分不足,其他情况表示请求失败
status string 接口请求状态,success 表示成功
message string 接口错误提示,注意:请求出错时,页面显示的提示为polyv积分打赏所设置的提示
data float 请求成功时为观众的剩余积分

sign的生成方法

为了保证接口的安全性,polyv观看页在请求接口时,会增加一个经过拼接生成的sign值,建议您在相应的接口里面增加对sign的校验,以确保接口的安全、正常使用。

生成步骤

  1. 将要提交的所有非空参数和参数值根据参数名的进行字典序排列;
  2. 然后以 参数名参数值参数名参数值进行拼接,拼接完后首尾带上appSecret
  3. 最后用MD5将字符串进行加密,加密后再大写

例如:
要发送的参数为:

channelId=10000, appId=app_trail, viewerId=viewer_test, ts=1558659759696;

按参数名字典序排序:

appId=app_trail, channelId=10000, ts=1558659759696, viewerId=viewer_test

拼接字符串并且首尾带上appSecret(从polyv后台获取,此处例如 6ef8d34c08f44e91a18428842ff0ba7e):

6ef8d34c08f44e91a18428842ff0ba7eappIdapp_trailchannelId10000ts1558659759696viewerviewer_testId6ef8d34c08f44e91a18428842ff0ba7e

通过MD5加密后再大写 得到最终的sign:

F42D596520782405C37021B853F0F805

校验方法的工具类示例:

   import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;

import com.live.util.EncryptionUtils;

/**
 * POLYV API签名工具类
 */
public class PolyvApiSignUtils {

    public static boolean checkSign(HttpServletRequest request, String secretKey) {
        Map<String, String> map = new HashMap<>();
        Enumeration<String> names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String value = request.getParameter(name);
            if (null != value) {
                map.put(name, value);
            }
        }

        String sign = request.getParameter("sign");
        if (null == sign || sign.isEmpty()) {
            return false;
        }
        // 除去map中的空值和签名参数
        Map<String, String> params = paraFilter(map);

        // 处理参数,计算MD5哈希值
        String concatedStr = concatParams(params);
        String plain = secretKey + concatedStr + secretKey;
        // 32位大写MD5值
        String encrypted = EncryptionUtils.md5Hex(plain);
        String upperCase = encrypted.toUpperCase();

        // 验证签名是否正确
        boolean isvalid = upperCase.equals(sign);

        if (!isvalid) {
            //TODO 签名错误,返回错误信息
        }

        return isvalid;
    }

    /**
     * 除去map中的空值和签名参数
     * @param sArray 签名参数组
     * @return 去掉空值与签名参数后的新签名参数组
     */
    private static Map<String, String> paraFilter(Map<String, String> sArray) {
        Map<String, String> result = new HashMap<>();
        if (sArray == null || sArray.size() <= 0) {
            return result;
        }

        for (String key : sArray.keySet()) {
            String value = sArray.get(key);
            if (StringUtils.isBlank(value) || key.equalsIgnoreCase("sign")) {
                continue;
            }
            result.put(key, value);
        }
        return result;
    }

    /**
     * 把数组所有元素排序,并按照“参数参数值”的模式成字符串,用于计算MD5哈希值
     * @param params 需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    private static String concatParams(Map<String, String> params) {
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);

        StringBuilder sb = new StringBuilder();
        for (String key : keys) {
            String value = params.get(key);
            sb.append(key).append(value);
        }
        return sb.toString();
    }
}
以上内容是否对您有帮助?根本没有帮助文档较差文档一般文档不错文档很好
Loading...