-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathutils.go
74 lines (65 loc) · 2.21 KB
/
utils.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
package alipay
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"strconv"
"strings"
)
type AlipayParameters struct {
InputCharset string `json:"_input_charset"` //网站编码
Body string `json:"body"` //订单描述
NotifyUrl string `json:"notify_url"` //异步通知页面
OutTradeNo string `json:"out_trade_no"` //订单唯一id
Partner string `json:"partner"` //合作者身份ID
PaymentType uint8 `json:"payment_type"` //支付类型 1:商品购买
ReturnUrl string `json:"return_url"` //回调url
SellerEmail string `json:"seller_email"` //卖家支付宝邮箱
Service string `json:"service"` //接口名称
Subject string `json:"subject"` //商品名称
TotalFee float32 `json:"total_fee"` //总价
Sign string `json:"sign"` //签名,生成签名时忽略
SignType string `json:"sign_type"` //签名类型,生成签名时忽略
}
// 按照支付宝规则生成sign
func sign(param interface{}) string {
//解析为字节数组
paramBytes, err := json.Marshal(param)
if err != nil {
return ""
}
//重组字符串
var sign string
oldString := string(paramBytes)
//为保证签名前特殊字符串没有被转码,这里解码一次
oldString = strings.Replace(oldString, `\u003c`, "<", -1)
oldString = strings.Replace(oldString, `\u003e`, ">", -1)
//去除特殊标点
oldString = strings.Replace(oldString, "\"", "", -1)
oldString = strings.Replace(oldString, "{", "", -1)
oldString = strings.Replace(oldString, "}", "", -1)
paramArray := strings.Split(oldString, ",")
for _, v := range paramArray {
detail := strings.SplitN(v, ":", 2)
//排除sign和sign_type
if detail[0] != "sign" && detail[0] != "sign_type" {
//total_fee转化为2位小数
if detail[0] == "total_fee" {
number, _ := strconv.ParseFloat(detail[1], 32)
detail[1] = strconv.FormatFloat(number, 'f', 2, 64)
}
if sign == "" {
sign = detail[0] + "=" + detail[1]
} else {
sign += "&" + detail[0] + "=" + detail[1]
}
}
}
//追加密钥
sign += AlipayKey
//md5加密
m := md5.New()
m.Write([]byte(sign))
sign = hex.EncodeToString(m.Sum(nil))
return sign
}