接收支付结果通知 - notifyUrl
集成系统需要单独开放一个rest接口来接收来自Payment服务器的支付结果通知
接口地址
POST notifyUrl - 调用createOrder时候传入的notifyUrl
请求头
Content-Type: application/json
请求参数
请求体为JSON格式,包含以下字段:
参数名
类型
是否必填
描述
id
String
是
支付订单的唯一标识符
oid
String
是
订单ID
uid
String
是
用户ID
timestamp
Long
是
当前时间戳
nonce
String
是
随机字符串,用于防重放攻击
status
Enum
是
交易状态,固定为PAID
statusCode
Int
是
订单状态的枚举值
sign
String
是
请求签名,用于验证请求合法性
签名生成
签名是通过将请求参数按键名排序后拼接成字符串,并在末尾追加环境变量PAYMENT_NOTIFY_SECRET,然后使用SHA-256算法生成的。示例:id=123&nonce=abc&oid=456&status=PAID&statusCode=1×tamp=1617181723{PAYMENT_NOTIFY_SECRET}
响应
成功:返回字符串"success"
失败:返回错误信息
错误处理
如果通知失败,系统会记录错误日志并增加重试次数。
重试间隔时间根据重试次数动态调整,重试次数超过29次后任务状态将被标记为FINAL_FAIL。
代码示例
public function notify($params)
{
$payload = trim(get_request_content());
if (empty($payload)) {
throw new ApiException('request error');
}
$json_params = json_decode($payload, true);
$data = [
'id' => $json_params['id'], // 这个是beaver payment系统支付的流水号
'oid' => $json_params['oid'], // 这个是业务系统中的订单号
'uid' => $json_params['uid'], // 业务系统的用户id
'timestamp' => $json_params['timestamp'], // 时间戳
'nonce' => $json_params['nonce'], // 一次性验证码,建议缓存24小时,重复不处理
'status' => $json_params['status'], // 字符串状态值, 支付成功是PAID
'statusCode' => $json_params['statusCode']
];
# sign的计算参照 https://cn.docs.beaverpayment.com/ji-cheng-dao-ying-yong/rest-api-wen-dang#qian-ming-ji-suan-fang-fa
$sign = $this->sign($data);
if ($sign != $json_params['sign']) {
throw new ApiException('sign error');
}
if ($json_params['status'] == 'PAID') {
return [
'trade_no' => $data['oid'],
'callback_no' => $data['id'],
];
} else {
return false;
}
}
Last updated