mohwhelper/FeeAuditUtils.go

191 lines
4.9 KiB
Go
Raw Permalink Normal View History

2023-08-27 22:48:30 +08:00
package mohwhelper
import (
"bytes"
"crypto/tls"
"crypto/x509"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"math"
"net/http"
"os"
"time"
"gitlab-ce.niaulang.com/niau-lang/golanghelper"
)
type FeeAuditUtils struct {
UnitNo string
RequestAt string
SourceSystem string
Hash string
Url string
Cert []byte
}
2023-08-27 22:52:58 +08:00
// NewFeeAuditUtils 用來産生 FeeAuditUtils
2023-08-27 22:48:30 +08:00
func NewFeeAuditUtils(unitNo, sourceSystem, hash, url, certPath string) (feeAuditUtils FeeAuditUtils, err error) {
stringutils := golanghelper.StringUtils{}
if stringutils.IsEmpty(unitNo) || stringutils.IsEmpty(sourceSystem) || stringutils.IsEmpty(hash) ||
stringutils.IsEmpty(url) || stringutils.IsEmpty(certPath) {
err = errors.New("Invalid params")
} else {
feeAuditUtils.Cert, err = os.ReadFile(certPath)
if err != nil {
return
}
feeAuditUtils.UnitNo = unitNo
feeAuditUtils.SourceSystem = sourceSystem
feeAuditUtils.Hash = hash
feeAuditUtils.Url = url
feeAuditUtils.RequestAt = time.Now().Format("20060102150405")
}
return
}
// getChecksum 用 apData 來取得校驗碼
func (f *FeeAuditUtils) getChecksum(apData string) string {
apDataBytes := []byte(apData)
timeBytes := []byte(f.RequestAt)
hashBytes := []byte(f.Hash)
timeByteLen := float64(len(timeBytes))
hashByteLen := float64(len(hashBytes))
var sum int
var m1 int
var m2 int
for i := 0; i < len(apDataBytes); i++ {
m1 = int(math.Mod(float64(i), hashByteLen))
m2 = int(math.Mod(float64(i), timeByteLen))
sum += int(apDataBytes[i])*int(hashBytes[m1]) + int(timeBytes[m2])*int(hashBytes[m1])
if sum>>16 > 0 {
sum = (sum >> 16) + (sum & 0xFFFF)
}
}
hex := fmt.Sprintf("%X", sum)
var stringutils golanghelper.StringUtils
return stringutils.LeftPad(hex, 4, "0")
}
// httpsPost 用來上傳 WriteoffResponse
func (f *FeeAuditUtils) httpsPost(funcName string, writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, err error) {
data, err := json.Marshal(&writeoffRequest)
if err != nil {
return
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(f.Cert)
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: caCertPool,
},
},
}
request, err := http.NewRequest("POST", f.Url+"/"+funcName, bytes.NewBuffer(data))
if err != nil {
return
}
request.Header.Set("Content-Type", "application/json; charset=UTF-8")
response, err := client.Do(request)
if err != nil {
return
}
defer response.Body.Close()
responseData, err := io.ReadAll(response.Body)
if err != nil {
return
}
err = json.Unmarshal(responseData, &writeoffResponse)
return
}
2023-08-27 22:52:58 +08:00
// NewRequest 用來産生 WirteoffRequest
2023-08-27 22:48:30 +08:00
func (f *FeeAuditUtils) NewRequest(data []byte) WriteoffRequest {
apData := base64.StdEncoding.EncodeToString(data)
checksum := f.getChecksum(apData)
return WriteoffRequest{
UnitNo: f.UnitNo,
RequestAt: f.RequestAt,
SourceSystem: f.SourceSystem,
ApData: apData,
Checksum: checksum,
}
}
// SendFeeApply 傳送服務記錄申報
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendFeeApply(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, feeApplyResult FeeApplyResult, err error) {
writeoffResponse, err = f.httpsPost("FeeApply", writeoffRequest)
2023-08-27 22:48:30 +08:00
if err != nil {
return
}
resultData, err := base64.StdEncoding.DecodeString(writeoffResponse.Result)
err = json.Unmarshal(resultData, &feeApplyResult)
return
}
// SendObjDel 傳送服務紀錄刪除
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendObjDel(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, err error) {
writeoffResponse, err = f.httpsPost("ObjDel", writeoffRequest)
2023-08-27 22:48:30 +08:00
return
}
// SendAppCompletionNotice 傳送申報確認通知
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendAppCompletionNotice(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, err error) {
writeoffResponse, err = f.httpsPost("appCompletionNotice", writeoffRequest)
2023-08-27 22:48:30 +08:00
return
}
// SendAppResultQuery 傳送「服務單位各分案審核狀態查詢」或「分案審核明細查詢」
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendAppResultQuery(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, appResultQueryResult AppResultQueryResult, err error) {
writeoffResponse, err = f.httpsPost("appResultQuery", writeoffRequest)
2023-08-27 22:48:30 +08:00
if err != nil {
return
}
resultData, err := base64.StdEncoding.DecodeString(writeoffResponse.Result)
err = json.Unmarshal(resultData, &appResultQueryResult)
return
}
// SendAppCancel 傳送撤回服務記錄
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendAppCancel(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, err error) {
writeoffResponse, err = f.httpsPost("appCancel", writeoffRequest)
2023-08-27 22:48:30 +08:00
return
}
// SendCancelResultResponse 傳送取消交易單處理結果回報
2023-08-27 23:27:10 +08:00
func (f *FeeAuditUtils) SendCancelResultResponse(writeoffRequest WriteoffRequest) (writeoffResponse WriteoffResponse, err error) {
writeoffResponse, err = f.httpsPost("CancelResultResponse", writeoffRequest)
2023-08-27 22:48:30 +08:00
return
}