wechat_params.go 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package go_pay
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "sort"
  7. "strconv"
  8. "strings"
  9. )
  10. /*
  11. NecessaryParams: 必传参数
  12. DeviceInfo: 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
  13. Openid: 用户标识: trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识
  14. */
  15. type WechatParams struct {
  16. NecessaryParams WechatParamsNecessary
  17. DeviceInfo string `xml:"device_info"`
  18. Openid string `xml:"openid"`
  19. }
  20. /*
  21. NonceStr: 随机字符串,长度要求在32位以内(如不写,go-pay将为你随机生成)
  22. Body: 商品简单描述
  23. OutTradeNo: 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一
  24. TotalFee: 订单总金额,单位为分
  25. SpbillCreateIp: 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP
  26. NotifyUrl: 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数
  27. TradeType: 交易类型:(JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付,不同trade_type决定了调起支付的方式)
  28. */
  29. type WechatParamsNecessary struct {
  30. Appid string `xml:"appid"`
  31. MchId string `xml:"mch_id"`
  32. NonceStr string `xml:"nonce_str"`
  33. Body string `xml:"body"`
  34. OutTradeNo string `xml:"out_trade_no"`
  35. TotalFee int `xml:"total_fee"`
  36. SpbillCreateIp string `xml:"spbill_create_ip"`
  37. NotifyUrl string `xml:"notify_url"`
  38. TradeType string `xml:"trade_type"`
  39. }
  40. //获取Sign签名
  41. func getSign(secretKey string, params *WechatParams) string {
  42. paramMap := make(map[string]string, 0)
  43. paramMap["appid"] = params.NecessaryParams.Appid
  44. paramMap["mch_id"] = params.NecessaryParams.MchId
  45. paramMap["nonce_str"] = params.NecessaryParams.NonceStr
  46. paramMap["body"] = params.NecessaryParams.Body
  47. paramMap["out_trade_no"] = params.NecessaryParams.OutTradeNo
  48. paramMap["total_fee"] = strconv.Itoa(params.NecessaryParams.TotalFee)
  49. paramMap["spbill_create_ip"] = params.NecessaryParams.SpbillCreateIp
  50. paramMap["notify_url"] = params.NecessaryParams.NotifyUrl
  51. paramMap["trade_type"] = params.NecessaryParams.TradeType
  52. if params.Openid != "" {
  53. paramMap["openid"] = params.Openid
  54. }
  55. if params.DeviceInfo != "" {
  56. paramMap["openid"] = params.DeviceInfo
  57. }
  58. signStr := getSignString(secretKey, paramMap)
  59. fmt.Println("signStr:", signStr)
  60. hash := md5.New()
  61. hash.Write([]byte(signStr))
  62. md5Sign := hash.Sum(nil)
  63. sign := strings.ToUpper(hex.EncodeToString(md5Sign))
  64. return sign
  65. }
  66. //获取排好序的Key
  67. func getSignString(secretKey string, paramMap map[string]string) string {
  68. keyList := make([]string, 0)
  69. for k := range paramMap {
  70. keyList = append(keyList, k)
  71. }
  72. sort.Strings(keyList)
  73. stringA := ""
  74. for _, k := range keyList {
  75. stringA += k + "=" + paramMap[k] + "&"
  76. }
  77. stringA += "key=" + secretKey
  78. return stringA
  79. }
  80. func generateXml(m map[string]string) string {
  81. xml := "<xml>"
  82. for k, v := range m {
  83. xml += fmt.Sprintf("<%s>%s</%s>", k, v, k)
  84. }
  85. xml += "</xml>"
  86. return xml
  87. }