package wx // import ( // "bytes" // "crypto/tls" // "crypto/x509" // "encoding/xml" // "io/ioutil" // "net/http" // "net/url" // "strconv" // "github.com/ouxuanserver/osmanthuswine/src/helper" // ) // const KEY = "wechat_key" // var transfers = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers" // type Order struct { // XMLName xml.Name `xml:"xml"` // MchAppid string `xml:"mch_appid"` // Mchid string `xml:"mchid"` // DeviceInfo string `xml:"device_info"` // NonceStr string `xml:"nonce_str"` // Sign string `xml:"sign"` // PartnerTradeNo string `xml:"partner_trade_no"` // Openid string `xml:"openid"` // CheckName string `xml:"check_name"` // ReUserName string `xml:"re_user_name"` // Amount int `xml:"amount"` // Desc string `xml:"desc"` // SpbillCreateIp string `xml:"spbill_create_ip"` // } // type OrderResult struct { // ReturnCode string `xml:"return_code"` // ReturnMsg string `xml:"return_msg"` // ResultCode string `xml:"result_code"` // ErrCode string `xml:"err_code"` // ErrCodeDes string `xml:"err_code_des"` // MchAppid string `xml:"mch_appid"` // Mchid string `json:"mchid"` // DeviceInfo string `json:"device_info"` // NonceStr string `json:"nonce_str"` // PartnerTradeNo string `xml:"partner_trade_no"` // PaymentNo string `xml:"payment_no"` // PaymentTime string `xml:"payment_time"` // } // //付款,成功返回自定义订单号,微信订单号,true,失败返回错误信息,false // func Withdraw(appid, mchid, openid, amount, partnerTradeNo, desc, clientIp string) (*OrderResult, error) { // order := Order{} // order.MchAppid = appid // order.Mchid = mchid // order.Openid = openid // order.Amount, _ = strconv.Atoi(amount) // order.Desc = desc // order.PartnerTradeNo = partnerTradeNo // order.DeviceInfo = "WEB" // order.CheckName = "NO_CHECK" //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名 // order.SpbillCreateIp = clientIp // order.NonceStr = helper.CreateUUID() // order.Sign = md5WithdrawOrder(order) // xmlBody, _ := xml.MarshalIndent(order, " ", " ") // resp, err := SecurePost(transfers, xmlBody) // if err != nil { // return nil, err // } // defer resp.Body.Close() // bodyByte, _ := ioutil.ReadAll(resp.Body) // res := new(OrderResult) // err = xml.Unmarshal(bodyByte, res) // return res, err // } // func md5WithdrawOrder(order Order) string { // o := url.Values{} // o.Add("mch_appid", order.MchAppid) // o.Add("mchid", order.Mchid) // o.Add("device_info", order.DeviceInfo) // o.Add("partner_trade_no", order.PartnerTradeNo) // o.Add("check_name", order.CheckName) // o.Add("amount", strconv.Itoa(order.Amount)) // o.Add("spbill_create_ip", order.SpbillCreateIp) // o.Add("desc", order.Desc) // o.Add("nonce_str", order.NonceStr) // o.Add("openid", order.Openid) // r, _ := url.QueryUnescape(o.Encode()) // return helper.Md5(r + "&key=" + KEY) // } // var ( // wechatCertPath = `./cert/cert.pem` // wechatKeyPath = `./cert/key.pem` // wechatCAPath = `./cert/rootca.pem` // ) //采用单例模式初始化ca // func getTLSConfig() (*tls.Config, error) { // if _tlsConfig != nil { // return _tlsConfig, nil // } // // load cert // cert, err := tls.LoadX509KeyPair(wechatCertPath, wechatKeyPath) // if err != nil { // return nil, err // } // // load root ca // caData, err := ioutil.ReadFile(wechatCAPath) // if err != nil { // return nil, err // } // pool := x509.NewCertPool() // pool.AppendCertsFromPEM(caData) // _tlsConfig = &tls.Config{ // Certificates: []tls.Certificate{cert}, // RootCAs: pool, // } // return _tlsConfig, nil // } // //携带ca证书的安全请求 // func SecurePost(url string, xmlContent []byte) (*http.Response, error) { // tlsConfig, err := getTLSConfig() // if err != nil { // return nil, err // } // tr := &http.Transport{TLSClientConfig: tlsConfig} // client := &http.Client{Transport: tr} // return client.Post( // url, // "application/xml", // bytes.NewBuffer(xmlContent)) // }