first
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
e595ba3244
commit
26792be9db
@ -0,0 +1,16 @@
|
|||||||
|
package cacheApi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"epur-pay/model"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Currency struct {
|
||||||
|
List map[string]model.ExchangeRate
|
||||||
|
Map *sync.Map
|
||||||
|
duplicate *Currency
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Currency) Refresh() *Currency {
|
||||||
|
return p
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
const (
|
||||||
|
Normal = "1"
|
||||||
|
)
|
@ -0,0 +1,160 @@
|
|||||||
|
package exchange
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"epur-pay/model"
|
||||||
|
"epur-pay/pkg/httpclient"
|
||||||
|
"epur-pay/pkg/logger"
|
||||||
|
"epur-pay/pkg/rds"
|
||||||
|
"epur-pay/pkg/utils"
|
||||||
|
"fmt"
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CurBody struct {
|
||||||
|
Name string `json:"name"` // 名称
|
||||||
|
Rate string `json:"rate"` // 汇率
|
||||||
|
Updatetime string `json:"updatetime"` // 时间2022-11-01 14:09:24
|
||||||
|
}
|
||||||
|
type ResultMsg struct {
|
||||||
|
Currency string `json:"currency"` // 币种CNY
|
||||||
|
Name string `json:"name"` // 币种名称人民币
|
||||||
|
List map[string]CurBody `json:"list"` // USD
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurResponse struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Result ResultMsg `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type WanWeiYuanCurrency struct {
|
||||||
|
HuiIn string `json:"hui_in,omitempty"` // 现汇买入价
|
||||||
|
HuiOut string `json:"hui_out,omitempty"` // 现汇卖出价
|
||||||
|
ChaoOut string `json:"chao_out,omitempty"` // 现钞卖出价
|
||||||
|
ChaoIn string `json:"chao_in,omitempty"` // 现钞买入价
|
||||||
|
Name string `json:"name"` // 货币名称
|
||||||
|
Zhesuan string `json:"zhesuan,omitempty"` // 中行折算价
|
||||||
|
Code string `json:"code"` // 货币简码
|
||||||
|
Day string `json:"day"` // 发布日期
|
||||||
|
Time string `json:"time"` // 发布时间
|
||||||
|
}
|
||||||
|
type WanWeiYuanCurrencyResponse struct {
|
||||||
|
ShowapiResError string `json:"showapi_res_error"`
|
||||||
|
ShowapiResId string `json:"showapi_res_id"`
|
||||||
|
ShowapiResCode int64 `json:"showapi_res_code"`
|
||||||
|
ShowapiFeeNum int64 `json:"showapi_fee_num"`
|
||||||
|
ShowapiResBody struct {
|
||||||
|
RetCode int64 `json:"ret_code"`
|
||||||
|
ListSize int64 `json:"listSize"`
|
||||||
|
List []WanWeiYuanCurrency `json:"list"`
|
||||||
|
} `json:"showapi_res_body"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExchangeResponse struct {
|
||||||
|
ShowapiResError string `json:"showapi_res_error"`
|
||||||
|
ShowapiResId string `json:"showapi_res_id"`
|
||||||
|
ShowapiResCode int `json:"showapi_res_code"`
|
||||||
|
ShowapiFeeNum int `json:"showapi_fee_num"`
|
||||||
|
ShowapiResBody ExchangeResBody `json:"showapi_res_body"`
|
||||||
|
}
|
||||||
|
type ExchangeResBody struct {
|
||||||
|
List []ExchangeList `json:"list"`
|
||||||
|
ListSize int `json:"listSize"`
|
||||||
|
RetCode int `json:"ret_code"`
|
||||||
|
}
|
||||||
|
type ExchangeList struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
HuiOut string `json:"hui_out"`
|
||||||
|
Zhesuan string `json:"zhesuan"`
|
||||||
|
ChaoOut string `json:"chao_out"`
|
||||||
|
Time string `json:"time"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
HuiIn string `json:"hui_in"`
|
||||||
|
ChaoIn string `json:"chao_in"`
|
||||||
|
Day string `json:"day"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRate() {
|
||||||
|
btime := time.Now().UnixNano()
|
||||||
|
logger.AccessLogger.Info("ExchangeRate...", btime)
|
||||||
|
if err := rds.DB.Transaction(func(ts *gorm.DB) error {
|
||||||
|
resp := ExchangeResponse{}
|
||||||
|
// TWD新台币 MYR马来西亚林吉特 SGD新加坡元 PHP菲律宾比索 IDR印度尼西亚盾 THB泰铢 BRL巴西雷亚尔 GBP英镑 MXN墨西哥比索 VND越南盾
|
||||||
|
//Currency := []string{"TWD", "MYR", "SGD", "PHP", "IDR", "THB", "BRL", "GBP", "MXN", "VND"}
|
||||||
|
str, _ := AliyunExchangeApi()
|
||||||
|
err := json.Unmarshal([]byte(str), &resp)
|
||||||
|
if err != nil {
|
||||||
|
logger.AccessLogger.Error("ERROR:", err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if resp.ShowapiResCode != 0 {
|
||||||
|
logger.AccessLogger.Error("ERROR:", resp.ShowapiResError)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for idx, tmp := range resp.ShowapiResBody.List {
|
||||||
|
logger.AccessLogger.Debug(idx, "处理币种:", tmp.Code, "汇率:", tmp.HuiIn)
|
||||||
|
if len(tmp.HuiIn) < 1 {
|
||||||
|
tmp.HuiIn = tmp.ChaoIn
|
||||||
|
}
|
||||||
|
rate := model.ExchangeRate{}
|
||||||
|
rate.RateId = 0
|
||||||
|
rate.FromName = "人民币"
|
||||||
|
rate.FromCurrency = "CNY"
|
||||||
|
rate.FromAmt = decimal.NewFromFloat(1.00)
|
||||||
|
rate.Unit = "元"
|
||||||
|
rate.ToCurrency = tmp.Code
|
||||||
|
rate.ToName = tmp.Name
|
||||||
|
rate.Date = utils.Str2FormatDateTime(tmp.Day, "2006-01-02", nil).Unix()
|
||||||
|
rate.Status = model.Normal
|
||||||
|
rate.CreateTime = utils.Time2StampSecond()
|
||||||
|
rate.ToAmt, _ = decimal.NewFromString(tmp.HuiIn)
|
||||||
|
rate.ToAmt = decimal.NewFromInt(100).DivRound(rate.ToAmt, 6)
|
||||||
|
res := ts.Table(model.ExchangeRate{}.TableName()).
|
||||||
|
Where(model.ExchangeRate{FromCurrency: rate.FromCurrency, ToCurrency: rate.ToCurrency, Date: rate.Date, Status: model.Normal}).
|
||||||
|
FirstOrCreate(&rate)
|
||||||
|
if res.Error != nil {
|
||||||
|
logger.AccessLogger.Error("ERROR:", res.Error)
|
||||||
|
return res.Error
|
||||||
|
}
|
||||||
|
//// 刷新缓存
|
||||||
|
//cache.Global.Caches.Currency.Refresh()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
logger.AccessLogger.Error("ERROR:", err.Error())
|
||||||
|
}
|
||||||
|
etime := time.Now().UnixNano()
|
||||||
|
logger.AccessLogger.Info("END...", etime-btime)
|
||||||
|
//logger.AccessLogger.Info("USD:", cache.Global.Caches.Currency.ToCNY("USD", decimal.NewFromInt(100)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// curl -i -k --get --include
|
||||||
|
// 'https://ali-waihui.showapi.com/waihui-transform?fromCode=GBP&money=100&toCode=EUR'
|
||||||
|
// -H 'Authorization:APPCODE 你自己的AppCode'
|
||||||
|
func HttpGet(toCode string) (str string, code int) {
|
||||||
|
header := map[string]string{}
|
||||||
|
header["Authorization"] = "APPCODE 63e68d5081144e0185139b496a999000"
|
||||||
|
url := fmt.Sprintf("https://ali-waihui.showapi.com/waihui-transform?fromCode=%s&money=%s&toCode=%s",
|
||||||
|
"CNY", "100", toCode)
|
||||||
|
str, code = httpclient.DoHttp(url, "GET", "", header)
|
||||||
|
logger.AccessLogger.Info("返回信息:", str, "http代码", code)
|
||||||
|
return str, code
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://jisuhuilv.market.alicloudapi.com/exchange/single
|
||||||
|
// curl -i -k -X GET'https://jisuhuilv.market.alicloudapi.com/exchange/single?currency=CNY'
|
||||||
|
// https://market.aliyun.com/products/57000002/cmapi010841.html?spm=5176.2020520132.101.3.2b9b72189hTyJH#sku=yuncode484100008
|
||||||
|
// -H 'Authorization:APPCODE 你自己的AppCode'
|
||||||
|
func AliyunExchangeApi() (str string, code int) {
|
||||||
|
header := map[string]string{}
|
||||||
|
header["Authorization"] = "APPCODE 63e68d5081144e0185139b496a999000"
|
||||||
|
//url := "https://jisuhuilv.market.alicloudapi.com/exchange/single?currency=CNY"
|
||||||
|
url := "https://ali-waihui.showapi.com/waihui-list?code=code"
|
||||||
|
str, code = httpclient.DoHttp(url, "GET", "", header)
|
||||||
|
//logger.AccessLogger.Info("返回信息:", str, "http代码", code)
|
||||||
|
logger.AccessLogger.Info("http代码:", code, "\n", str)
|
||||||
|
return str, code
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package httpclient
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DoHttp(url, method, body string, headers map[string]string) (string, int) {
|
||||||
|
req, err := http.NewRequest(method, url, bytes.NewBuffer([]byte(body)))
|
||||||
|
if err != nil {
|
||||||
|
return "", 0
|
||||||
|
}
|
||||||
|
for key, value := range headers {
|
||||||
|
req.Header.Set(key, value)
|
||||||
|
}
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", 0
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
respBody, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", resp.StatusCode
|
||||||
|
}
|
||||||
|
return string(respBody), resp.StatusCode
|
||||||
|
}
|
Loading…
Reference in new issue