-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpayjs.go
More file actions
88 lines (77 loc) · 1.66 KB
/
payjs.go
File metadata and controls
88 lines (77 loc) · 1.66 KB
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
package payjs
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"sort"
"strings"
)
type PayJS struct {
mchid string
privKey string
apiUrl string
}
var (
APIURL = `https://payjs.cn/api/native`
)
type TradeParam struct {
Total_fee int `json:"total_fee"`
Out_trade_no string `json:"out_trade_no"`
Body string `json:"body"`
Notify_url string `json:"notify_url"`
}
func New(mchid string, privKey string) *PayJS {
pj := &PayJS{}
pj.apiUrl = APIURL
pj.mchid = mchid
pj.privKey = privKey
return pj
}
func sign(params url.Values, privKey string) string {
params.Del(`sign`)
var keys = make([]string, 0, 0)
for key := range params {
if params.Get(key) != `` {
keys = append(keys, key)
}
}
sort.Strings(keys)
var pList = make([]string, 0, 0)
for _, key := range keys {
var value = strings.TrimSpace(params.Get(key))
if len(value) > 0 {
pList = append(pList, key+"="+value)
}
}
var src = strings.Join(pList, "&")
src += "&key=" + privKey
md5bs := md5.Sum([]byte(src))
md5res := hex.EncodeToString(md5bs[:])
return strings.ToUpper(md5res)
}
func (pj *PayJS) CreateTrade(param TradeParam) (res string, err error) {
var p = url.Values{}
jsonbs, _ := json.Marshal(param)
jsonmap := make(map[string]interface{})
json.Unmarshal(jsonbs, &jsonmap)
for k, v := range jsonmap {
p.Add(k, fmt.Sprintf("%v", v))
}
p.Add("mchid", pj.mchid)
p.Add("sign", sign(p, pj.privKey))
cli := http.Client{}
r, err := cli.PostForm(pj.apiUrl, p)
if err != nil {
return ``, err
}
defer r.Body.Close()
bs, err := ioutil.ReadAll(r.Body)
if err != nil {
return ``, err
}
return string(bs), nil
}