wechat_export.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //==================================
  2. // * Name:Jerry
  3. // * DateTime:2019/5/6 13:16
  4. // * Desc:
  5. //==================================
  6. package gopay
  7. import (
  8. "bytes"
  9. "crypto/hmac"
  10. "crypto/md5"
  11. "crypto/sha256"
  12. "crypto/tls"
  13. "encoding/hex"
  14. "fmt"
  15. "github.com/parnurzeal/gorequest"
  16. "strings"
  17. )
  18. //JSAPI支付,支付参数后,再次计算出小程序用的paySign
  19. func GetMiniPaySign(appId, nonceStr, prepayId, signType, timeStamp, secretKey string) (paySign string) {
  20. buffer := new(bytes.Buffer)
  21. buffer.WriteString("appId=")
  22. buffer.WriteString(appId)
  23. buffer.WriteString("&nonceStr=")
  24. buffer.WriteString(nonceStr)
  25. buffer.WriteString("&package=")
  26. buffer.WriteString(prepayId)
  27. buffer.WriteString("&signType=")
  28. buffer.WriteString(signType)
  29. buffer.WriteString("&timeStamp=")
  30. buffer.WriteString(timeStamp)
  31. buffer.WriteString("&key=")
  32. buffer.WriteString(secretKey)
  33. signStr := buffer.String()
  34. var hashSign []byte
  35. if signType == SignType_MD5 {
  36. hash := md5.New()
  37. hash.Write([]byte(signStr))
  38. hashSign = hash.Sum(nil)
  39. } else {
  40. hash := hmac.New(sha256.New, []byte(secretKey))
  41. hash.Write([]byte(signStr))
  42. hashSign = hash.Sum(nil)
  43. }
  44. paySign = strings.ToUpper(hex.EncodeToString(hashSign))
  45. return
  46. }
  47. //JSAPI支付,支付参数后,再次计算出微信内H5支付需要用的paySign
  48. func GetH5PaySign(appId, nonceStr, prepayId, signType, timeStamp, secretKey string) (paySign string) {
  49. buffer := new(bytes.Buffer)
  50. buffer.WriteString("appId=")
  51. buffer.WriteString(appId)
  52. buffer.WriteString("&nonceStr=")
  53. buffer.WriteString(nonceStr)
  54. buffer.WriteString("&package=")
  55. buffer.WriteString(prepayId)
  56. buffer.WriteString("&signType=")
  57. buffer.WriteString(signType)
  58. buffer.WriteString("&timeStamp=")
  59. buffer.WriteString(timeStamp)
  60. buffer.WriteString("&key=")
  61. buffer.WriteString(secretKey)
  62. signStr := buffer.String()
  63. var hashSign []byte
  64. if signType == SignType_MD5 {
  65. hash := md5.New()
  66. hash.Write([]byte(signStr))
  67. hashSign = hash.Sum(nil)
  68. } else {
  69. hash := hmac.New(sha256.New, []byte(secretKey))
  70. hash.Write([]byte(signStr))
  71. hashSign = hash.Sum(nil)
  72. }
  73. paySign = strings.ToUpper(hex.EncodeToString(hashSign))
  74. return
  75. }
  76. //获取微信用户的OpenId、SessionKey、UnionId
  77. func GetWeChatUserId(appId, secretKey, wxCode string) (userRsp *WeChatUserIdRsp, err error) {
  78. userRsp = new(WeChatUserIdRsp)
  79. url := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%v&secret=%v&js_code=%v&grant_type=authorization_code", appId, secretKey, wxCode)
  80. agent := gorequest.New()
  81. tlsCfg := &tls.Config{
  82. InsecureSkipVerify: true,
  83. }
  84. agent.TLSClientConfig(tlsCfg)
  85. _, _, errs := agent.Get(url).EndStruct(userRsp)
  86. if len(errs) > 0 {
  87. return nil, errs[0]
  88. } else {
  89. return userRsp, nil
  90. }
  91. }