接收支付结果通知 - 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&timestamp=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