-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathunionpay.go
147 lines (130 loc) · 3.24 KB
/
unionpay.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package unionpay
import "strings"
type UnionpayData struct {
version string `json:"version"`
encoding string `json:"encoding"`
certId string `json:"certId"`
encryptCertId string `json:"encryptCertId"`
}
var (
merId string
frontUrl string
encoding string = "utf-8"
signMethod string = "01"
version string = "5.1.0"
baseUrl string = "https://gateway.test.95516.com/"
)
//初始使用的配置
type Config struct {
// 版本号 默认5.1.0
Version string
// 请求银联的地址
Url string
// 商户代码
MerId string
// 前台通知地址
FrontUrl string
// pfx 证书路径,和同时传入PrivatePath和CertPath 效果一样
PfxPath string
// pfx 证书的密码
PfxPwd string
// 验签私钥证书地址,传入pfx此路径可不传
// openssl pkcs12 -in xxxx.pfx -nodes -out server.pem 生成为原生格式pem 私钥
// openssl rsa -in server.pem -out server.key 生成为rsa格式私钥文件
PrivatePath string
// 验签证书地址,传入pfx此路径可以不传
// openssl pkcs12 -in xxxx.pfx -clcerts -nokeys -out key.cert
CertPath string
// 加密证书地址
EncryptCertPath string
}
func Init(config *Config) error {
if err := LoadCert(config); err != nil {
return err
}
SetConfig(config)
return nil
}
// 设置用户配置
func SetConfig(config *Config) {
merId = config.MerId
frontUrl = config.FrontUrl
if config.Version != "" {
version = config.Version
}
if config.Url != "" {
baseUrl = config.Url
}
}
func sysParams(c ApiConfig, data *RequestParams) map[string]string {
request := map[string]string{
"version": version,
"encoding": encoding,
"certId": certData.CertId,
"signMethod": signMethod,
"encryptCertId": certData.EncryptId,
"accessType": c.accessType,
"channelType": c.channelType,
"bizType": c.bizType,
"merId": merId,
}
if data.TnxTime == "" {
request["txnTime"] = getTxnTime()
} else {
request["txnTime"] = data.TnxTime
}
if data.OrderId == "" {
data.OrderId = randomString(10)
}
request["orderId"] = data.OrderId
request["accNo"] = getaccNo(data.AccNo)
request["customerInfo"] = getCustomerInfo(data.Customer)
if data.Extend != "" {
request["reqReserved"] = data.Extend
}
if data.Reserved != nil {
list := []string{}
for k, v := range data.Reserved {
list = append(list, k+"&"+v)
}
if len(list) > 0 {
request["reserved"] = "{" + strings.Join(list, "&") + "}"
}
}
return request
}
func getTxnTime() string {
return sec2Str("20060102150405", getNowSec())
}
func getaccNo(no string) string {
str, _ := EncryptData(no)
return str
}
func getCustomerInfo(customer *CustomerInfo) string {
enmap := map[string]string{}
other := map[string]string{}
m := obj2Map(*customer)
for k, v := range m {
if v.(string) != "" {
if k == "phoneNo" || k == "cvn2" || k == "expired" {
enmap[k] = v.(string)
} else {
other[k] = v.(string)
}
}
}
if len(enmap) > 0 {
tmp := []string{}
for k, v := range enmap {
tmp = append(tmp, k+"="+v)
}
str := strings.Join(tmp, "&")
enc, _ := EncryptData(str)
other["encryptedInfo"] = enc
}
tmp := []string{}
for k, v := range other {
tmp = append(tmp, k+"="+v)
}
return base64Encode([]byte("{" + strings.Join(tmp, "&") + "}"))
}