引言
最近的工作中涉及到第三方对接,用户在第三方的平台进行某些操作后,第三方会调用我们提供的回调接口通知,然后我们再进行一些业务上的处理,比如奖励发放等。通过这篇文章总结自己设计回调接口的一些思路。
接口设计
1、请求方式
为了方便扩展以及参数上的考虑,请求方式为 POST,Content-Type 为 application/json 。
2、参数定义
下面列举一些必要的请求参数:
参数 | 类型 | 说明 |
---|---|---|
requestId | String | 请求 ID,第三方自定义,每次请求唯一,用于幂等性处理 |
userId | String | 用户 id |
appKey | String | 媒体公钥 |
timestamp | Long | 用于签名的时间戳,毫秒 |
sign | String | 签名,32 位小写,MD5(requestId + userId + appKey + appSecret + timestamp) |
ext | JSONObject | 额外参数,方便后续扩展 |
注:用于签名的 appKey 和 appSecret 通过其他方式给到第三方,appKey 和 appSecret 一一对应。
3、接口设计
参数校验
对参数进行非空判断和其他校验,过滤无效的请求。
时效限制
将 timestamp 与当前时间进行判断,超过 5 分钟则不处理该请求。该限制主要出于安全上的考虑。
签名校验
对部分参数使用哈希算法计算出签名,其中 appSecret 为公开的媒体私钥,和 appKey 一一对应。通过验签过滤无效或者非法的请求。
可以使用 MD5 以外的其他哈希算法。
签名参数可以先排序再哈希。
幂等性
为了避免第三方重复调用,或者用户以非正常方式重复触发请求,需要对请求进行幂等性处理,确保多次请求的结果一致。
使用 Redis 来保存每次请求的 requestId。每次请求判断 Redis 中是否存在对应的 key,如果存在则拒绝当前请求,否则保存本次请求的 requestId。
根据具体业务对多次请求的情况进行处理,避免重复请求导致异常,比如奖励超发等。
错误码
针对不同的异常情况设计合理的错误码和错误信息,并通过接口返回。能够提高第三方对接效率,并且能够针对部分异常情况进行特殊处理,比如重发请求等。
示例代码
PHP
<?php
$request_id = $_POST['requestId'];
$user_id = $_POST['userId'];
$sign = $_POST['sign'];
$app_key = $_POST['appKey'];
$timestamp = $_POST['timestamp'];
// 参数校验,略
// 时效性验证
if (time() * 1000 - $timestamp > 300000) {
$arr = array('code' => '-1', 'msg' => '时效性验证失败');
echo json_encode($arr);
exit();
}
// 从数据库查询 appKey 对应的 appSecret
$app_secret = '';
// 签名验证
$str = $request_id . $user_id . $app_key . $app_secret . $timestamp;
if (empty($sign) || md5($str) != $sign) {
$arr = array('code' => '-2', 'msg' => '验签失败');
echo json_encode($arr);
exit();
}
// TODO 业务实现及异常处理
$arr = array('code' => '0', 'msg' => '成功');
echo json_encode($arr);
?>
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于