微信退款官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6
按照接口要求,获取 API 证书,下载解压好,会有三个文件:
- apiclient_cert.p12
- apiclient_cert.pem
- apiclient_key.pem
我们需要用到 2、3 文件,还有一点是需要 根证书文件,这个需要单独下载,地址是:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4,
上面有两个根证书,下载一个即可。
代码
封装 https 双向证书 客户端 POST 请求
func httpsPost(url string, contentType string, body io.Reader) (resp *http.Response, err error) {
var wechatPayCert = "conf/apiclient_cert.pem" // apiclient_cert.pem 文件地址
var wechatPayKey = "conf/apiclient_key.pem" // apiclient_key.pem 文件地址
var rootCaPath = "conf/rootca.pem" // 根证书 文件地址
var tr *http.Transport
// 加载证书
certs, err := tls.LoadX509KeyPair(wechatPayCert, wechatPayKey)
if err != nil {
glog.Errorf("tls.LoadX509KeyPair err=%v", err)
return
}
// 读取根证书内存
rootCa, err := ioutil.ReadFile(rootCaPath)
if err != nil {
glog.Errorf("ioutil.ReadFile err=%v", err)
return
}
pool := x509.NewCertPool()
pool.AppendCertsFromPEM(rootCa)
tr = &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: pool,
Certificates: []tls.Certificate{certs},
},
}
client := &http.Client{Transport: tr}
resp, err = client.Post(url, contentType, body)
return
}
使用
resp, err := httpsPost("https://api.mch.weixin.qq.com/secapi/pay/refund", "text/xml;charset=utf-8", strings.NewReader(reqStr))
if err != nil {
glog.Errorf("[ERROR]:Https post error: %v", err)
return
}