wechat_params.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package gopay
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/md5"
  6. "crypto/sha256"
  7. "encoding/hex"
  8. "strconv"
  9. "strings"
  10. )
  11. //本地通过支付参数计算Sign值
  12. func getLocalSign(secretKey string, signType string, body BodyMap) (sign string) {
  13. signStr := sortSignParams(secretKey, body)
  14. //fmt.Println("signStr:", signStr)
  15. var hashSign []byte
  16. if signType == SignType_MD5 {
  17. hash := md5.New()
  18. hash.Write([]byte(signStr))
  19. hashSign = hash.Sum(nil)
  20. } else {
  21. hash := hmac.New(sha256.New, []byte(secretKey))
  22. hash.Write([]byte(signStr))
  23. hashSign = hash.Sum(nil)
  24. }
  25. sign = strings.ToUpper(hex.EncodeToString(hashSign))
  26. return
  27. }
  28. //从微信提供的接口获取:SandboxSignKey
  29. func getSanBoxSign(mchId, nonceStr, secretKey, signType string) (key string, err error) {
  30. body := make(BodyMap)
  31. body.Set("mch_id", mchId)
  32. body.Set("nonce_str", nonceStr)
  33. //计算沙箱参数Sign
  34. sanboxSign := getLocalSign(secretKey, signType, body)
  35. //沙箱环境:获取key后,重新计算Sign
  36. key, err = getSanBoxSignKey(mchId, nonceStr, sanboxSign)
  37. if err != nil {
  38. return "", err
  39. }
  40. return
  41. }
  42. //生成请求XML的Body体
  43. func generateXml(bm BodyMap) (reqXml string) {
  44. buffer := new(bytes.Buffer)
  45. buffer.WriteString("<xml>")
  46. for k, v := range bm {
  47. buffer.WriteString("<")
  48. buffer.WriteString(k)
  49. buffer.WriteString("><![CDATA[")
  50. value, ok := v.(int)
  51. if ok {
  52. value := strconv.Itoa(value)
  53. buffer.WriteString(value)
  54. } else {
  55. buffer.WriteString(v.(string))
  56. }
  57. buffer.WriteString("]]></")
  58. buffer.WriteString(k)
  59. buffer.WriteString(">")
  60. }
  61. buffer.WriteString("</xml>")
  62. reqXml = buffer.String()
  63. return
  64. }