{{i18nTranslate('_layout.t11')}} {{i18nGetLang()==='zh' ? 'EN' : '中文'}}

# 自定义支付方式

> 此功能为商业版本专有。

从GoEdge v0.5.0开始，可以实现一个自己的在线支付方式，让用户可以在线完成充值等操作。

## 业务流程

简单来说，就是用户在GoEdge用户系统中创建订单，然后跳转到开发者自己的支付系统开始支付，等用户完成支付后，开发者再通过API通知GoEdge已完成支付，然后GoEdge自动完成充值等动作。

## 启用在线支付

在开始之前，需要先启用在线支付，在”财务管理”菜单–“订单管理”菜单–“订单设置”页面中勾选”启用在线”支付并保存：

这样设置后，如果添加了支付方式，用户就可以在充值页面看到这些支付方式。

保存后会也会为此支付方式自动生成一个密钥，用来后面校验支付参数使用。

## 添加支付方式

> 建议你先在测试环境中添加支付方式并测试成功后才上线到生产环境。

在”财务管理”菜单–“订单管理”菜单–“支付方式”页面中点击`[添加支付方式]`，可以添加新的支付方式：

其中：

- `支付方式名称` - 用来提示用户是何种支付方式
- `支付方式代号` - 只能包含数字、字母和下划线；自定义支付页面可以根据此代号判断订单来自哪种支付方式；多个支付方式不能用同一个代号；
- `支付URL` - 用户选择此支付方式后，系统会跳转到此URL，并将订单信息放在URL参数中
- `支付方式说明` - 向用户说明支付方式的详细信息

点击”保存”后就可以在用户系统中看到这个支付方式：

## 实现在线支付

再次重温一下业务流程：

可以看到开发者需要实现的以下步骤：

- 3 跳转到支付页面
- 4 校验订单信息
- 5 开始支付
- 6 完成支付
- 7 回调完成订单API

以下详细说明每一个步骤的实现方式：

### 3 跳转到支付页面

用户在用户系统中填写充值金额并选择支付方式后，可以点击下一步生成订单：

点击上图中的”去支付”即可跳转到你在支付方式中填写的”支付URL”页面，并传递订单相关的参数，类似于：

    https://goedge.cloud/pay?EdgeOrderAmount=100&EdgeOrderCode=2022080100000017&EdgeOrderMethod=new_pay_method&EdgeOrderTimestamp=1659317132&EdgeOrderSign=dd0601e0908456c546af07097e41b877174fd327405ca8f36b3c5ee0466a9474

其中：

- `https://goedge.cloud/pay` - 是我们填写的 `支付URL`，可以预先附带其他参数
- `EdgeOrderAmount` - 订单金额，默认是人民币元
- `EdgeOrderCode` - 订单号，可以根据订单号通过API查询订单信息
- `EdgeOrderMethod` - 支付方式代号，可以用来提示开发者当前是何种支付方式
- `EdgeOrderTimestamp` - 下单时间戳，可以据此判断订单是否过期
- `EdgeOrderSign` - 参数签名，是根据以前的几个参数计算出来的签名信息，用来校验参数是否经过篡改，算法是：
  1. 将EdgeOrderXxx参数名和参数值进行排序（从小到大），比如：

         EdgeOrderAmount=100
         EdgeOrderCode=2022080100000017
         EdgeOrderMethod=new_pay_method
         EdgeOrderTimestamp=1659317132

  2. 使用 `&` 符号连接参数：

         EdgeOrderAmount=100&EdgeOrderCode=2022080100000017&EdgeOrderMethod=new_pay_method&EdgeOrderTimestamp=1659317132

  3. 将支付方式密钥（可以在支付方式详情获取）附加到参数后面，当然也需要一个 `&` 符号：

         EdgeOrderAmount=100&EdgeOrderCode=2022080100000017&EdgeOrderMethod=new_pay_method&EdgeOrderTimestamp=1659317132&072333c67c68bc9efcfc2fc83339ad8b7c99fe42

  4. 将所有参数进行SHA256计算（各个语言算法自行查找，如果结果是大写的，请转成小写）：

         	  SHA256("EdgeOrderAmount=100&EdgeOrderCode=2022080100000017&EdgeOrderMethod=new_pay_method&EdgeOrderTimestamp=1659317132&072333c67c68bc9efcfc2fc83339ad8b7c99fe42")

在刚开发时可以先不去处理 `EdgeOrderSign` 参数，以便加快开发进度。

### 4 校验订单信息

在用户到达的 `支付URL` 页面后，我们可以先通过订单号校验订单信息，API地址为 /UserOrderService/findEnabledUserOrder

建议你检查以下几项信息：

- 订单是否存在
- 订单金额是否正确，可以根据订单信息中的 `amount` 字段进行判断
- 订单是否过期，可以根据订单信息中的 `createdAt` 字段值进行判断
- 订单状态是否正确，只有 `status` 为 `none` 的才需要支付

如果你还不知道怎么调用API，可以参考 API调用概述。

### 5 开始支付

如果你在步骤 4 中查询到订单并发现订单正处于可支付状态，你可以让用户开始支付，这里需要根据自己的业务自行实现。

### 6 完成支付

用户在你的支付页面上完成支付后，需要执行回调，参考下一步骤 `7 回调完成订单API` 说明。

### 7 回调完成订单API

在用户完成支付后，我们可以通过API告诉系统用户已经支付成功，API地址为 /UserOrderService/finishUserOrder

接口回调成功后，系统会自动完成剩余的充值到账和其他订单相关的操作。

如果你还不知道怎么调用API，可以参考 API调用概述。

自此，整个支付流程就完成了。

## 查询订单

你可以在管理系统”财务管理”菜单–“订单管理”菜单中查看订单。

## 非实时支付

如果用户付款为非实时支付，就是不能通过支付页面独立完成的，需要其他渠道完成的，你可以先让用户在用户系统中下订单，然后在其他渠道支付成功后，在管理系统中–订单详情中点击”完成支付”，同样可以完成订单整个流程。

{{i18nTranslate('_layout.t27')}}
{{i18nTranslate('_layout.t12')}}