## 结汇 `CNH`结算成`CNY`
[结汇是什么意思?](./结汇概念.md)
### 流程
#### 流程图
![](./../结汇流程图.png)
### 1. 发起结汇
> 商户从前端选择 系统账户(币种CNH)发起结汇,
```js
// 提交结汇的账户 ,金额,等
http.post("",{
amount:10000.00,
//currencyID:88, // 币种 CNY
paymentChannel:"CNH", //"alipay" unionpay
fromAccountID:"66688", //来自到的账户
toAccountID:"2332", //转到的账户
TradeType:"settlement"
})
```
### 2. 收款系统生成结汇订单号 ,记录到交易日志
### 3. 关联操作的账户
```go
orderSN:="charge".util.PayTool.GenOrderSn() //生成结汇单号 settlement202204221059590001
order := &entity.PaymentOoder{
MerchantID:mid,
FromCurrencyID:CurrencyID, // 币种
ToCurrencyID:22325222 ,//转到的账户
Amount:1000.00 , //金额
FromAccountID:22325222 ,//来自到的账户
ToAccountID:22325222 ,//转到的账户
OrderSN:orderSN,
TradeType:"settlement", //交易类型 结汇
TradeOrg:"settlement", //交易 机构指银行
OrderSN:orderSN,
// ......
}
accountID,err:=repo.PaymentOrderDao.Save(order) //保存订单
//日志
payLog:=&entity.PaymentOoderLog{
OrderSN:orderSN,
StepR:0 , //步骤
StepR:"order_create", //步骤 init
TradeType:"settlement", //交易类型 结汇
CallBack:"" //回调信息
}
err:=repo.PaymentOrderLogDao.Save(payLog) //保存订单日志
```
### 4. 向银行机构发起结汇请求 略
##### 4.1 查询实时汇率等,渠道,币种;
##### 4.2 包装请求体,向银行发起结汇请求
##### 4.3 记录请求数据及响应数据
### 5. 收到银行机构结汇成功的通知
##### 5.1 解析通知body, 查询订单,验证签名,回应银行机构 success
##### 5.2 更改订单状态,记录银行通知数据、订单状态等到日志
### 6.结汇成功,更改目标账户金额
##### 6.1 查询订单信息,获取商户外部账户信息(CNY币种),订单金额等
##### 6.2 更改外部账户金额、记录订单状态等到`MerchantAccountOutLog`日志
##### 6.3 记录订单状态等到`PaymentOrderLog`日志