添加积分事件

接口提供方

该接口需要由开发者提供给燃豆

接口说明

如果积分俱乐部使用的是自有积分体系,且开放了可能增加积分的相关营销活动(如签到等),则该接口必须配置,查看自有积分和平台积分的区别

使用场景

用户在积分俱乐部参与活动并获得新积分时使用,如参与签到活动,参与抽奖活动获得积分等。

业务流程说明

  1. 用户在燃豆积分俱乐部中参与活动获得新积分;
  2. 燃豆服务端生成该笔参与订单,同时通过该接口来发起新增用户积分的请求,并把该订单信息(包含一个唯一订单号)一起推送给开发者;
  3. 开发者在收到请求后务必保存好该笔订单的订单号,增加积分给用户,并给燃豆返回已处理成功的消息;如果开发者返回失败信息,则用户参与失败,本次流程结束;

参数说明

该接口除了公共必传参数外,还包括以下参数:

参数是否必须类型[长度限制]说明
uidstring[1,64]参与用户id,该id由开发者在免登接口中传给燃豆的用户唯一标志
mall_nostring[6,6]商城的唯一编号,表示用户参与活动所在商城编号,如JF_001
creditsint新获得的积分数,如123
unique_nostring[18,20]全局唯一的订单编号,如D420664454376591361
created_atdate发生时间,格式为yyyy-MM-dd HH:mm:ss,如2021-09-12 12:34:56
typestring[1,20]活动类型(枚举值):DAILYBONUS(每日签到),DRAWINGGAME(抽奖活动)
descriptionstring[1,255]获得积分行为的描述
ipstring[0,15]用户的客户端ip地址,不保证准确性,也有可能获取不到,如8.8.8.8,获取不到返回空字符串

返回结果

开发者需以json格式返回响应内容,且不论在业务层面成功失败,http响应码必须为200,返回码非200的情况下燃豆会认为本次请求失败,如果新增积分允许,开发者需要返回一个该业务下唯一的订单编号:

json对象中的响应参数说明

参数是否必须类型[长度限制]说明
statusstring[4,7]添加积分是否成功标志位(枚举值),success(成功)、fail(失败)
messagestring[0,255]status为fail的情况说明,燃豆会将该信息展示给用户,如成功可以给空字符串
bizNostring[10,32]开发者系统内部加积分订单号,status为success时必传,由开发者自行生成,要求32个字符内,只能包含数字、大小写字母、_和-,且在加积分业务下唯一,不能重复。

响应示例

  • 如果本次积分添加成功,请返回如下格式的内容:
{
  status: "success",
  bizNo: "2021091533333",  // 由开发者生成的唯一编号,
  message: "",
}
  • 如果添加失败,请返回如下格式的内容:
{
  status: "fail",
  message: "失败原因", //燃豆会把该失败原因显示给用户
}

注意事项

  1. 由于网络和系统存在不确定性,有可能存在接口调用超时或失败的情况,燃豆在调用该接口时,设置了超时时间为5s,如果接口响应时间超过了5s,燃豆会认为该次调用失败,并且终止整个流程;如果此时开发者已经新增了用户的积分,此时需要把这些积分扣除;
  2. 无论本次增加积分业务是否成功,开发者都需要返回http状态码为200,否则燃豆会认为该次请求失败,直接提示给用户参与失败的相关信息;
  3. bizID参数必须在该业务场景下唯一;

代码示例

PHP


use Randou\Exception\RdException;
use Randou\RdClient;
use Randou\RdClientBuilder;


$appid = 'q666WPW01AuTODbuCwYtANI8';
$appsecret = '1GT2G55YXixxxWHz1oxCFp9NmO3339';

// 获取全部请求数据
$params = $request->all();

try {
    $client = RdClientBuilder::getClient($appid, $appSecret);
//    校验并且提取订单数据
    $event = $client->creditsIssue($params);
} catch (RdException $e) {
    print_r($e);
    
//    校验失败,返回错误
    return response()->json([
        'status'  => 'fail',
        'message' => '出错了',
    ], 401);
}

// 获取订单全部数据,并处理自身业务逻辑
$data = $event->all();
save($data);

// 允许参加本次活动,且返回增加积分的bizNo
return response()->json([
    'status'  => 'success',
    'message' => '',
    'bizNo'   => sprintf("No%s", time() . ''),
]);

JAVA


import com.randou_tech.ClientBuilder;
import com.randou_tech.RdClient;
import com.randou_tech.RdException;
import com.randou_tech.event.CreditsIssueEvent;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/issue")
public Map<String, String> creditsIssue(HttpServletRequest request) {
    String appid = "aaaaaaaaaaaaaaaaaaaaaaaa";
    String appsecret = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";

    RdClient client = ClientBuilder.build(appid, appsecret);
    Map<String, String> map = new HashMap<>();

    try {
        // 解析数据
        CreditsIssueEvent event = client.creditsIssue(request);

        // 如果项目中没有javax.servlet.http.HttpServletRequest,可从request中自行获取出全部参数,以下为从jakarta.servlet.http.HttpServletRequest对象中获取参数
        // Enumeration<String> parameterNames = request.getParameterNames();
        // Map<String, String> params = new HashMap<>();
        // // 遍历参数名并获取对应的值
        // while (parameterNames.hasMoreElements()) {
        //     String paramName = parameterNames.nextElement();
        //     String paramValue = request.getParameter(paramName); // 只取第一个值
        //     params.put(paramName, paramValue);
        // }
        // CreditsIssueEvent event = client.creditsIssueWithParams(params);

        System.out.println(event);

        // 处理本地业务
        todo()

        map.put("status", "success");
        map.put("message", "");
        map.put("bizNo", String.valueOf((System.currentTimeMillis() / 1000L))); // 本地唯一订单号
    } catch (RdException e) {
        map.put("status", "fail");
        map.put("message", e.getErrorMessage());
    }

    return map;
}