添加积分事件
接口提供方
该接口需要由开发者提供给燃豆
接口说明
如果积分俱乐部使用的是自有积分体系,且开放了可能增加积分的相关营销活动(如签到等),则该接口必须配置,查看自有积分和平台积分的区别
使用场景
用户在积分俱乐部参与活动并获得新积分时使用,如参与签到活动,参与抽奖活动获得积分等。
业务流程说明
- 用户在燃豆积分俱乐部中参与活动获得新积分;
- 燃豆服务端生成该笔参与订单,同时通过该接口来发起新增用户积分的请求,并把该订单信息(包含一个唯一订单号)一起推送给开发者;
- 开发者在收到请求后务必保存好该笔订单的订单号,增加积分给用户,并给燃豆返回已处理成功的消息;如果开发者返回失败信息,则用户参与失败,本次流程结束;
参数说明
该接口除了公共必传参数外,还包括以下参数:
参数 | 是否必须 | 类型[长度限制] | 说明 |
---|---|---|---|
uid | 是 | string[1,64] | 参与用户id,该id由开发者在免登接口中传给燃豆的用户唯一标志 |
mall_no | 是 | string[6,6] | 商城的唯一编号,表示用户参与活动所在商城编号,如JF_001 |
credits | 是 | int | 新获得的积分数,如123 |
unique_no | 是 | string[18,20] | 全局唯一的订单编号,如D420664454376591361 |
created_at | 是 | date | 发生时间,格式为yyyy-MM-dd HH:mm:ss,如2021-09-12 12:34:56 |
type | 是 | string[1,20] | 活动类型(枚举值):DAILYBONUS(每日签到),DRAWINGGAME(抽奖活动) |
description | 是 | string[1,255] | 获得积分行为的描述 |
ip | 是 | string[0,15] | 用户的客户端ip地址,不保证准确性,也有可能获取不到,如8.8.8.8,获取不到返回空字符串 |
返回结果
开发者需以json格式返回响应内容,且不论在业务层面成功失败,http响应码必须为200,返回码非200的情况下燃豆会认为本次请求失败,如果新增积分允许,开发者需要返回一个该业务下唯一的订单编号:
json对象中的响应参数说明
参数 | 是否必须 | 类型[长度限制] | 说明 |
---|---|---|---|
status | 是 | string[4,7] | 添加积分是否成功标志位(枚举值),success(成功)、fail(失败) |
message | 是 | string[0,255] | status为fail的情况说明,燃豆会将该信息展示给用户,如成功可以给空字符串 |
bizNo | 否 | string[10,32] | 开发者系统内部加积分订单号,status为success时必传,由开发者自行生成,要求32个字符内,只能包含数字、大小写字母、_和-,且在加积分业务下唯一,不能重复。 |
响应示例
- 如果本次积分添加成功,请返回如下格式的内容:
{
status: "success",
bizNo: "2021091533333", // 由开发者生成的唯一编号,
message: "",
}
- 如果添加失败,请返回如下格式的内容:
{
status: "fail",
message: "失败原因", //燃豆会把该失败原因显示给用户
}
注意事项
- 由于网络和系统存在不确定性,有可能存在接口调用超时或失败的情况,燃豆在调用该接口时,设置了超时时间为5s,如果接口响应时间超过了5s,燃豆会认为该次调用失败,并且终止整个流程;如果此时开发者已经新增了用户的积分,此时需要把这些积分扣除;
- 无论本次增加积分业务是否成功,开发者都需要返回http状态码为200,否则燃豆会认为该次请求失败,直接提示给用户参与失败的相关信息;
- 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;
}