# 支付回调通知

主要用于商家在发起收款后，收钱吧会将消费者支付成功或失败的订单信息推送给商家系统。

**注意**：
- 此接口为收钱吧主动推送到商户系统域名地址的回调
- Method: POST, Content-Type: application/json
- Header中包含 Authorization: sign（RSA SHA256WithRSA签名）
- 验签流程：获取Authorization中的sign → 解析请求body → 用收钱吧公钥RSA SHA256WithRSA验签
- 回调重试：通知时间间隔为1s,5s,30s,600s
- 商户接收到回调后请返回"success"字符串

## 接口说明

- 请求方式：`POST`
- 请求地址：`https://vsi-api.shouqianba.com/notify`
- Operation ID：`notify`

## 请求参数

无请求参数。

## 请求体

| 字段名 | 类型 | 必填 | 描述 |
| --- | --- | --- | --- |
| channel_finish_time | string | 否 | 付款动作在支付服务商的完成时间（时间戳）。只有支付成功时才有值返回 |
| client_sn | string | 是 | 商户订单号 |
| finish_time | string | 是 | 付款动作在收钱吧的完成时间（时间戳） |
| net_amount | string | 是 | 实收金额 |
| operator | string | 是 | 门店操作员 |
| order_status | string | 是 | 订单状态。当前订单状态 |
| payer_login | string | 否 | 付款人账号 |
| payer_uid | string | 否 | 付款人ID |
| payment_list | array[object] | 否 | 活动优惠信息概览 |
| payment_list[].amount | string | 是 | 此次交易变更的金额 |
| payment_list[].amount_total | string | 是 | 活动出资总金额 |
| payment_list[].type | string | 是 | 活动类型。见附录《活动优惠类型列表》 |
| payway | string | 是 | 一级支付方式。取值见附录《支付方式列表》 |
| provider_response | object | 否 | 优惠详情。格式为json，内容有两部分：goods_details为核销单品信息数组，voucher_details为核销券信息数组。 |
| provider_response.goods_details | array[object] | 否 |  |
| provider_response.voucher_details | array[object] | 否 |  |
| reflect | string | 否 | 透传参数 |
| settlement_amount | string | 是 | 本次支付金额 |
| sn | string | 是 | 收钱吧唯一订单号 |
| status | string | 是 | 流水状态。本次操作产生的流水的状态 |
| sub_payway | string | 是 | 二级支付方式。取值见附录《二级支付方式列表》 |
| subject | string | 是 | 交易概述 |
| total_amount | string | 是 | 交易总额 |
| trade_no | string | 否 | 支付服务商订单号。只有支付成功时才有值返回 |

## 请求示例

```json
{
  "channel_finish_time": "1449646835244",
  "client_sn": "7654321132",
  "finish_time": "1449646835244",
  "net_amount": "0",
  "operator": "张三丰",
  "order_status": "PAID",
  "payer_login": "134****3920",
  "payer_uid": "2801003920293239230239",
  "payway": "1",
  "reflect": "{ \"tips\": \"200\" }",
  "settlement_amount": "10000",
  "sn": "7892259488292938",
  "status": "SUCCESS",
  "sub_payway": "1",
  "subject": "Pizza",
  "total_amount": "10000",
  "trade_no": "2013112011001004330000121536"
}
```

## 响应体

无响应体定义。

## 响应示例

```json
"success"
```

## 示例代码

### cURL

```bash
curl -X POST "https://vsi-api.shouqianba.com/notify" \
  -H "Authorization: 100000000000000000 0123456789abcdef0123456789abcdef" \
  -H "Content-Type: application/json" \
  -d '{"channel_finish_time":"1449646835244","client_sn":"7654321132","finish_time":"1449646835244","net_amount":"0","operator":"张三丰","order_status":"PAID","payer_login":"134****3920","payer_uid":"2801003920293239230239","payway":"1","reflect":"{ \"tips\": \"200\" }","settlement_amount":"10000","sn":"7892259488292938","status":"SUCCESS","sub_payway":"1","subject":"Pizza","total_amount":"10000","trade_no":"2013112011001004330000121536"}'
```

### Python

```python
import requests

url = "https://vsi-api.shouqianba.com/notify"
headers = {"Content-Type": "application/json",
    "Authorization": "100000000000000000 0123456789abcdef0123456789abcdef",
}
json_data = {
    "channel_finish_time": "1449646835244",
    "client_sn": "7654321132",
    "finish_time": "1449646835244",
    "net_amount": "0",
    "operator": "张三丰",
    "order_status": "PAID",
    "payer_login": "134****3920",
    "payer_uid": "2801003920293239230239",
    "payway": "1",
    "reflect": "{ \"tips\": \"200\" }",
    "settlement_amount": "10000",
    "sn": "7892259488292938",
    "status": "SUCCESS",
    "sub_payway": "1",
    "subject": "Pizza",
    "total_amount": "10000",
    "trade_no": "2013112011001004330000121536"
}

response = requests.post(
    url,
    headers=headers,
    json=json_data,
)

print(response.json())
```

### Java

```java
// 支付回调通知
OkHttpClient client = new OkHttpClient();
String json = "{\"channel_finish_time\":\"1449646835244\",\"client_sn\":\"7654321132\",\"finish_time\":\"1449646835244\",\"net_amount\":\"0\",\"operator\":\"张三丰\",\"order_status\":\"PAID\",\"payer_login\":\"134****3920\",\"payer_uid\":\"2801003920293239230239\",\"payway\":\"1\",\"reflect\":\"{ \\\"tips\\\": \\\"200\\\" }\",\"settlement_amount\":\"10000\",\"sn\":\"7892259488292938\",\"status\":\"SUCCESS\",\"sub_payway\":\"1\",\"subject\":\"Pizza\",\"total_amount\":\"10000\",\"trade_no\":\"2013112011001004330000121536\"}";
RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));

Request request = new Request.Builder()
    .url("https://vsi-api.shouqianba.com/notify")
    .addHeader("Authorization", "100000000000000000 0123456789abcdef0123456789abcdef")
    .post(body)
    .build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
```

### Go

```go
package main

import (
    "fmt"
    "io"
    "net/http"
    "bytes"
)

func main() {
	jsonBody := []byte(`{"channel_finish_time":"1449646835244","client_sn":"7654321132","finish_time":"1449646835244","net_amount":"0","operator":"张三丰","order_status":"PAID","payer_login":"134****3920","payer_uid":"2801003920293239230239","payway":"1","reflect":"{ \"tips\": \"200\" }","settlement_amount":"10000","sn":"7892259488292938","status":"SUCCESS","sub_payway":"1","subject":"Pizza","total_amount":"10000","trade_no":"2013112011001004330000121536"}`)
	reqBody := bytes.NewBuffer(jsonBody)
	req, err := http.NewRequest("POST", "https://vsi-api.shouqianba.com/notify", reqBody)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "100000000000000000 0123456789abcdef0123456789abcdef")
	resp, err := (&http.Client{}).Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	respBytes, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(respBytes))
}
```

### Node.js

```javascript
const https = require("https");

const options = {
  method: "POST",
  hostname: "vsi-api.shouqianba.com",
  path: "/notify",
  headers: {
    "Authorization": "100000000000000000 0123456789abcdef0123456789abcdef",
    "Content-Type": "application/json"
  }
};

const postData = JSON.stringify({"channel_finish_time":"1449646835244","client_sn":"7654321132","finish_time":"1449646835244","net_amount":"0","operator":"张三丰","order_status":"PAID","payer_login":"134****3920","payer_uid":"2801003920293239230239","payway":"1","reflect":"{ \"tips\": \"200\" }","settlement_amount":"10000","sn":"7892259488292938","status":"SUCCESS","sub_payway":"1","subject":"Pizza","total_amount":"10000","trade_no":"2013112011001004330000121536"});

const req = https.request(options, (res) => {
  let data = "";
  res.on("data", (chunk) => { data += chunk; });
  res.on("end", () => { console.log(JSON.parse(data)); });
});
req.write(postData);
req.end();
```
