-
Notifications
You must be signed in to change notification settings - Fork 3
/
response.go
101 lines (88 loc) · 2.05 KB
/
response.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
package ecommerce
import (
"encoding/json"
"net/url"
"github.com/chrislzg/baidupay/core"
"github.com/chrislzg/baidupay/eto"
)
func (c *PayClient) NotifyResponse(err error) (string, error) {
baseResponse := &eto.BaseResponse{
Errno: 0,
Msg: "success",
}
if err != nil {
baseResponse = &eto.BaseResponse{
Errno: 1,
Msg: err.Error(),
}
}
res, e := json.Marshal(baseResponse)
if e != nil {
return "", e
}
return string(res), nil
}
func (c *PayClient) PayNotifyResponse(err error) (string, error) {
baseResponse := &eto.BaseResponse{
Errno: 0,
Msg: "success",
Data: json.RawMessage(`{"isConsumed": 2}`),
}
if err != nil {
baseResponse = &eto.BaseResponse{
Errno: 1,
Msg: err.Error(),
}
}
res, e := json.Marshal(baseResponse)
if e != nil {
return "", e
}
return string(res), nil
}
// 验证回调是否是合法的,防止第三方伪造
func (c *PayClient) validCallback(values url.Values) bool {
sign := values.Get("rsaSign")
values.Del("rsaSign")
originalData, err := url.QueryUnescape(values.Encode())
if err != nil {
return false
}
signErr := core.CheckSign(originalData, sign, c.PlatformRsaPublicKey)
if signErr != nil {
return false
}
return true
}
func (c *PayClient) VerifyNotify(body []byte) error {
var fieldMap map[string]interface{}
err := json.Unmarshal(body, &fieldMap)
if err != nil {
return err
}
plainString := core.BuildSignatureString(fieldMap)
plainString, err = url.QueryUnescape(plainString)
if err != nil{
return err
}
sign := fieldMap["rsaSign"].(string)
return core.CheckSign(plainString, sign, c.PlatformRsaPublicKey)
}
func (c *PayClient) parseGetCallBack(res eto.CallbackModel, body string) error {
qs, err := url.ParseQuery(body)
if err == nil {
res.Filled(qs)
}
if !c.validCallback(qs) {
return core.ErrorInvalidSign
}
return nil
}
// 解析回调通知内容,res必须为指针类型
func (c *PayClient) ParseNotify(body []byte, res eto.CallbackModel) error {
err := c.parseGetCallBack(res, string(body))
if err != nil {
return err
}
return nil
}