互动
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.1 KiB

5 years ago
  1. package wx
  2. // import (
  3. // "bytes"
  4. // "crypto/tls"
  5. // "crypto/x509"
  6. // "encoding/xml"
  7. // "io/ioutil"
  8. // "net/http"
  9. // "net/url"
  10. // "strconv"
  11. // "github.com/ouxuanserver/osmanthuswine/src/helper"
  12. // )
  13. // const KEY = "wechat_key"
  14. // var transfers = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"
  15. // type Order struct {
  16. // XMLName xml.Name `xml:"xml"`
  17. // MchAppid string `xml:"mch_appid"`
  18. // Mchid string `xml:"mchid"`
  19. // DeviceInfo string `xml:"device_info"`
  20. // NonceStr string `xml:"nonce_str"`
  21. // Sign string `xml:"sign"`
  22. // PartnerTradeNo string `xml:"partner_trade_no"`
  23. // Openid string `xml:"openid"`
  24. // CheckName string `xml:"check_name"`
  25. // ReUserName string `xml:"re_user_name"`
  26. // Amount int `xml:"amount"`
  27. // Desc string `xml:"desc"`
  28. // SpbillCreateIp string `xml:"spbill_create_ip"`
  29. // }
  30. // type OrderResult struct {
  31. // ReturnCode string `xml:"return_code"`
  32. // ReturnMsg string `xml:"return_msg"`
  33. // ResultCode string `xml:"result_code"`
  34. // ErrCode string `xml:"err_code"`
  35. // ErrCodeDes string `xml:"err_code_des"`
  36. // MchAppid string `xml:"mch_appid"`
  37. // Mchid string `json:"mchid"`
  38. // DeviceInfo string `json:"device_info"`
  39. // NonceStr string `json:"nonce_str"`
  40. // PartnerTradeNo string `xml:"partner_trade_no"`
  41. // PaymentNo string `xml:"payment_no"`
  42. // PaymentTime string `xml:"payment_time"`
  43. // }
  44. // //付款,成功返回自定义订单号,微信订单号,true,失败返回错误信息,false
  45. // func Withdraw(appid, mchid, openid, amount, partnerTradeNo, desc, clientIp string) (*OrderResult, error) {
  46. // order := Order{}
  47. // order.MchAppid = appid
  48. // order.Mchid = mchid
  49. // order.Openid = openid
  50. // order.Amount, _ = strconv.Atoi(amount)
  51. // order.Desc = desc
  52. // order.PartnerTradeNo = partnerTradeNo
  53. // order.DeviceInfo = "WEB"
  54. // order.CheckName = "NO_CHECK" //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
  55. // order.SpbillCreateIp = clientIp
  56. // order.NonceStr = helper.CreateUUID()
  57. // order.Sign = md5WithdrawOrder(order)
  58. // xmlBody, _ := xml.MarshalIndent(order, " ", " ")
  59. // resp, err := SecurePost(transfers, xmlBody)
  60. // if err != nil {
  61. // return nil, err
  62. // }
  63. // defer resp.Body.Close()
  64. // bodyByte, _ := ioutil.ReadAll(resp.Body)
  65. // res := new(OrderResult)
  66. // err = xml.Unmarshal(bodyByte, res)
  67. // return res, err
  68. // }
  69. // func md5WithdrawOrder(order Order) string {
  70. // o := url.Values{}
  71. // o.Add("mch_appid", order.MchAppid)
  72. // o.Add("mchid", order.Mchid)
  73. // o.Add("device_info", order.DeviceInfo)
  74. // o.Add("partner_trade_no", order.PartnerTradeNo)
  75. // o.Add("check_name", order.CheckName)
  76. // o.Add("amount", strconv.Itoa(order.Amount))
  77. // o.Add("spbill_create_ip", order.SpbillCreateIp)
  78. // o.Add("desc", order.Desc)
  79. // o.Add("nonce_str", order.NonceStr)
  80. // o.Add("openid", order.Openid)
  81. // r, _ := url.QueryUnescape(o.Encode())
  82. // return helper.Md5(r + "&key=" + KEY)
  83. // }
  84. // var (
  85. // wechatCertPath = `./cert/cert.pem`
  86. // wechatKeyPath = `./cert/key.pem`
  87. // wechatCAPath = `./cert/rootca.pem`
  88. // )
  89. //采用单例模式初始化ca
  90. // func getTLSConfig() (*tls.Config, error) {
  91. // if _tlsConfig != nil {
  92. // return _tlsConfig, nil
  93. // }
  94. // // load cert
  95. // cert, err := tls.LoadX509KeyPair(wechatCertPath, wechatKeyPath)
  96. // if err != nil {
  97. // return nil, err
  98. // }
  99. // // load root ca
  100. // caData, err := ioutil.ReadFile(wechatCAPath)
  101. // if err != nil {
  102. // return nil, err
  103. // }
  104. // pool := x509.NewCertPool()
  105. // pool.AppendCertsFromPEM(caData)
  106. // _tlsConfig = &tls.Config{
  107. // Certificates: []tls.Certificate{cert},
  108. // RootCAs: pool,
  109. // }
  110. // return _tlsConfig, nil
  111. // }
  112. // //携带ca证书的安全请求
  113. // func SecurePost(url string, xmlContent []byte) (*http.Response, error) {
  114. // tlsConfig, err := getTLSConfig()
  115. // if err != nil {
  116. // return nil, err
  117. // }
  118. // tr := &http.Transport{TLSClientConfig: tlsConfig}
  119. // client := &http.Client{Transport: tr}
  120. // return client.Post(
  121. // url,
  122. // "application/xml",
  123. // bytes.NewBuffer(xmlContent))
  124. // }