forked from chanxuehong/wechat
-
Notifications
You must be signed in to change notification settings - Fork 1
/
upload.go
185 lines (171 loc) · 4.27 KB
/
upload.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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package media
import (
"bytes"
"crypto/md5"
"crypto/tls"
"encoding/hex"
"encoding/xml"
"io"
"log"
"mime/multipart"
"os"
"github.com/charsunny/wechat/mch/core"
)
var cert tls.Certificate
var caCert []byte
// UploadMediaRequest 上传图片数据结构
type UploadMediaRequest struct {
// XMLName xml根节点标识
XMLName xml.Name `xml:"xml"`
// Media 媒体文件
Media string `xml:"media"`
// MediaHash 媒体文件hash
MediaHash string `xml:"media_hash"`
}
// Submit 申请入驻接口提交你的小微商户资料,申请后一般5分钟左右可以查询到具体的申请结果
// NOTE: 请求需要双向证书.
func Upload(clt *core.Client, file string) (resp map[string]string, err error) {
m1 := make(map[string]string, 16)
var b bytes.Buffer
w := multipart.NewWriter(&b)
// Add your image file
f, err := os.Open(file)
if err != nil {
log.Fatal("open img file error:", err)
}
// calculate hash first
md5h := md5.New()
io.Copy(md5h, f)
f.Seek(0, os.SEEK_SET)
defer f.Close()
//file part
fw, err := w.CreateFormFile("media", file)
if err != nil {
log.Fatal(err)
return
}
if _, err = io.Copy(fw, f); err != nil {
log.Fatal(err)
return
}
var uploadMediaRequest UploadMediaRequest
uploadMediaRequest.MediaHash = hex.EncodeToString(md5h.Sum(nil))
data, err := xml.Marshal(uploadMediaRequest)
if err != nil {
return
}
err = xml.Unmarshal(data, &m1)
if err != nil {
return
}
return clt.PostXML(core.APIBaseURL()+"/applyment/micro/submit", m1)
}
//func main() {
// log.Println("===start===")
// var uploadMediaRequest UploadMediaRequest
// uploadMediaRequest.MchID = config.MchID
// //multipart post form
//
// var b bytes.Buffer
// w := multipart.NewWriter(&b)
// // Add your image file
// file := config.ImgFile
// f, err := os.Open(file)
// if err != nil {
// log.Fatal("open img file error:", err)
// }
//
// // calculate hash first
// md5h := md5.New()
// io.Copy(md5h, f)
// f.Seek(0, os.SEEK_SET)
//
// defer f.Close()
//
// //file part
// fw, err := w.CreateFormFile("media", file)
// if err != nil {
// log.Fatal(err)
// return
// }
// if _, err = io.Copy(fw, f); err != nil {
// log.Fatal(err)
// return
// }
//
// uploadMediaRequest.MediaHash = hex.EncodeToString(md5h.Sum(nil))
// // calculate sign
// var hashString = "mch_id=" + uploadMediaRequest.MchID + "&media_hash=" + uploadMediaRequest.MediaHash + "&key=" + config.Key
// log.Println("to hash string: ",hashString)
// hasher := md5.New()
// hasher.Write([]byte(hashString))
// uploadMediaRequest.Sign = strings.ToUpper(hex.EncodeToString(hasher.Sum(nil)))
//
// output, err := xml.MarshalIndent(uploadMediaRequest, " ", " ")
// if err != nil {
// log.Printf("error: %v\n", err)
// }
//
// log.Println("Request in XML:\n", string(output))
//
// // Add the other fields
// // mch_id
// fw, err = w.CreateFormField("mch_id")
// if err != nil {
// return
// }
// if _, err = fw.Write([]byte(uploadMediaRequest.MchID)); err != nil {
// return
// }
//
// // media_hash
// if fw, err = w.CreateFormField("media_hash"); err != nil {
// return
// }
// if _, err = fw.Write([]byte(uploadMediaRequest.MediaHash)); err != nil {
// return
// }
//
// // sign
// if fw, err = w.CreateFormField("sign"); err != nil {
// return
// }
// if _, err = fw.Write([]byte(uploadMediaRequest.Sign)); err != nil {
// return
// }
//
// // Don't forget to close the multipart writer.
// // If you don't close it, your request will be missing the terminating boundary.
// w.Close()
//
// newReq, err := http.NewRequest("POST", "https://api.mch.weixin.qq.com/secapi/mch/uploadmedia", &b)
// newReq.Header.Set("Content-Type", w.FormDataContentType())
//
// var client *http.Client
// caCertPool := x509.NewCertPool()
// caCertPool.AppendCertsFromPEM(caCert)
// tlsConfig := &tls.Config{
// Certificates: []tls.Certificate{cert},
// RootCAs: caCertPool,
// }
// tlsConfig.BuildNameToCertificate()
// transport := &http.Transport{TLSClientConfig: tlsConfig}
// client = &http.Client{Transport: transport}
//
// resp, err := client.Do(newReq)
//
// if err != nil {
// log.Fatal(err.Error())
// }
//
// log.Println(resp.StatusCode)
//
// respBody, err := ioutil.ReadAll(resp.Body)
// log.Printf("[INFO][IN] Respond content:%v", string(respBody))
// defer resp.Body.Close()
// if err != nil {
// log.Fatal(err.Error())
// }
//
// return
//}