# Payment文档

## 创建订单

<mark style="color:green;">`POST`</mark> `https://www.payvenu.net/api/payment/create`

请求成功后会返回支付二维码的url,请自行处理为二维码或者跳转

#### Request Body

| Name       | Type   | Description  |
| ---------- | ------ | ------------ |
| appId      | string | 申请应用的appId   |
| outTradeNo | string | 用户自己系统的订单号   |
| payAmount  | number | 支付金额,2位小数    |
| payType    | string | ALIPAY\_F2F  |
| sign       | string | 签名,过程见下方签名过程 |
| returnUrl  | string | 暂时用不上        |

{% tabs %}
{% tab title="200 url:实际用户支付的地址
tradeNo:payvenu的订单号" %}

```
{
    "code": 200,
    "msg": "成功",
    "result": {
        "url": "https://qr.alipay.com/bax01419m88pcyps71xxxxxx",
        "tradeNo": "202002291606000003"
    }
}
```

{% endtab %}
{% endtabs %}

## 查询订单

<mark style="color:green;">`POST`</mark> `https://www.payvenu.net/api/payment/query`

用户根据订单号查询订单状态

#### Request Body

| Name       | Type   | Description  |
| ---------- | ------ | ------------ |
| appId      | string | 申请应用的appId   |
| outTradeNo | string | 用户自己系统的订单号   |
| payAmount  | number | 支付金额,2位小数    |
| payType    | string | ALIPAY       |
| sign       | string | 签名,过程见下方签名过程 |

{% tabs %}
{% tab title="200 tradeStatus:
WAIT\_FOR\_CALLBACK:等待付款
TRADE\_SUCCESS:交易成功
TRADE\_CLOSED:交易关闭
TRADE\_REFUND:交易已退款" %}

```
{
    "code": 200,
    "msg": "",
    "result": {
        "payAmount": "0.01",
        "payType": "ALIPAY",
        "tradeNo": "IB_20200421163343002",
        "payTime": "2020-04-21 16:33:55",
        "outTradeNo": "3EF810D1",
        "tradeStatus": "TRADE_SUCCESS",
        "createdTime": "2020-04-21 16:33:44"
    }
}
```

{% endtab %}
{% endtabs %}

## 异步通知

<mark style="color:green;">`POST`</mark> `http(s)://www.example.com/payment/notify`

以uim的通知地址举例: http(s)://domain:port/payment/notify\
支付成功后,网关对商户进行POST,json数据格式发送异步通知\
通知地址为网关-app里自定义的通知地址(需审核)\
网关会在一定时间内持续通知商户\
通知失败可在用户中心手动点击再次通知或者手动确认订单已通知

#### Request Body

| Name        | Type   | Description                                                    |
| ----------- | ------ | -------------------------------------------------------------- |
| outTradeNo  | string | 用户自己系统的订单号                                                     |
| payAmount   | number | 支付金额,2位小数                                                      |
| payType     | string | ALIPAY                                                         |
| tradeNo     | string | 网关订单号                                                          |
| tradeStatus | string | WAIT\_FOR\_CALLBACK或TRADE\_SUCCESS或TRADE\_CLOSED或TRADE\_REFUND |
| sign        | string | 签名,过程见下方签名过程                                                   |

{% tabs %}
{% tab title="200 若payvenu通知商户系统,通知成功,商户需要返回字符串success给payvenu,不能带有引号
否则会一直通知直到通知成功,或者用户手动在payvenu订单里手动确认通知成功" %}

```
success
```

{% endtab %}
{% endtabs %}

## 签名过程

上方每个请求中如需带有sign,即需要对该请求进行签名

**签名的参数为除了sign参数其他所有参数组合**

**举例如下**

{% tabs %}
{% tab title="sign steps" %}

1. 将请求参数

   appId,outTradeNo, payAmount, payType

   排序,php里的对象ksort,python里字典的sorted等,根据key的ASCII码升序排序后按k=v\&k=v拼接,notify的回调sign参数为payType,outTradeNo,tradeNo,payAmount,tradeStatus
2. 待签名内容应该为:eg: data = "appId=xxx\&outTradeNo=xxx\&payAmount=xxx\&payType=xxx"
3. sign = md5(md5(data)+appSecret),其中2次md5的结果都为小写
   {% endtab %}
   {% endtabs %}
