kra-oa/internal/integration/payment/gopay.go

56 lines
1.4 KiB
Go

package payment
import (
"crypto/x509"
"encoding/base64"
"encoding/pem"
"strings"
"github.com/go-pay/gopay"
)
// toGoPayBodyMap keeps provider protocol types inside the data layer while
// allowing GoPay's signing and notification helpers to be reused.
func toGoPayBodyMap(values map[string]string) gopay.BodyMap {
bm := make(gopay.BodyMap, len(values))
for key, value := range values {
bm[key] = value
}
return bm
}
func cloneGoPayBodyMap(values gopay.BodyMap) gopay.BodyMap {
clone := make(gopay.BodyMap, len(values))
for key, value := range values {
clone[key] = value
}
return clone
}
func fromGoPayBodyMap(values gopay.BodyMap) map[string]string {
result := make(map[string]string, len(values))
for key := range values {
result[key] = values.GetString(key)
}
return result
}
// goPayAlipayKey converts the PEM-friendly configuration accepted by this
// service into GoPay's raw base64 key format. GoPay's Alipay helpers add their
// own PEM envelope internally.
func goPayAlipayKey(value string, public bool) string {
value = strings.TrimSpace(value)
if block, _ := pem.Decode([]byte(value)); block != nil {
der := block.Bytes
if public && block.Type == "CERTIFICATE" {
if cert, err := x509.ParseCertificate(block.Bytes); err == nil {
if pub, err := x509.MarshalPKIXPublicKey(cert.PublicKey); err == nil {
der = pub
}
}
}
return base64.StdEncoding.EncodeToString(der)
}
return strings.Join(strings.Fields(value), "")
}