wx.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package wx
  2. import (
  3. "errors"
  4. "fmt"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  6. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  7. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  8. "github.com/silenceper/wechat/js"
  9. "github.com/silenceper/wechat/oauth"
  10. "github.com/silenceper/wechat/pay"
  11. "github.com/silenceper/wechat/util"
  12. "net/url"
  13. "strconv"
  14. "strings"
  15. )
  16. var wxPayCallbackHandler func(result *pay.NotifyResult)models.SysReturn = nil
  17. // 注册微信支付回调处理函数
  18. func RegisterWxPayCallbackHandler(handler func(result *pay.NotifyResult)models.SysReturn){
  19. wxPayCallbackHandler = handler
  20. }
  21. func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{
  22. if wxPayCallbackHandler == nil{
  23. return models.SysReturn{500, "微信支付回调处理函数为空", nil}
  24. }
  25. notifyRet := pay.NotifyResult{}
  26. err := c.Ctx.BindXML(&notifyRet)
  27. if err != nil{
  28. fmt.Println("******************----》微信支付回调bindxml错误", err.Error())
  29. return models.SysReturn{500, err.Error(), nil}
  30. }
  31. if notifyRet.ResultCode == "SUCCESS" && notifyRet.ReturnCode == "SUCCESS"{
  32. return wxPayCallbackHandler(&notifyRet)
  33. }else{
  34. fmt.Println("------------------>微信支付失败", notifyRet)
  35. return models.SysReturn{500, "", ""}
  36. }
  37. }
  38. // 扫码支付
  39. func PayNative(params *PayParams)(*pay.PayResult, error){
  40. ip := utils.GetIP(params.Ctx)
  41. attach := params.Attach
  42. if attach == ""{
  43. attach = params.Ctx.Ctx.GetString("user_id")
  44. if attach == ""{
  45. attach = "attach"
  46. }
  47. }
  48. body := params.Body
  49. if body == ""{
  50. body = "body"
  51. }
  52. if params.OutTradeNo == ""{
  53. return nil, errors.New("交易单号为空")
  54. }
  55. parParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, ""}
  56. return wc.GetPay().PreNative(&parParams)
  57. }
  58. // jsapi 支付
  59. func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
  60. openId := params.OpenId
  61. if openId == ""{
  62. return nil, errors.New("openid 为空")
  63. }
  64. if params.OutTradeNo == ""{
  65. return nil, errors.New("交易单号为空")
  66. }
  67. attach := params.Attach
  68. if attach == ""{
  69. fmt.Println("--------------------->1")
  70. attach = params.Ctx.Ctx.GetString("user_id")
  71. if attach == ""{
  72. fmt.Println("--------------------->2")
  73. attach = "attach"
  74. }
  75. }
  76. body := params.Body
  77. if body == ""{
  78. body = "body"
  79. }
  80. ip := utils.GetIP(params.Ctx)
  81. fmt.Println("params.Attach", params.Attach, "attach", attach)
  82. payParams := pay.Params{
  83. strconv.Itoa(params.TotalFee),
  84. ip,
  85. body,
  86. attach,
  87. params.OutTradeNo,
  88. params.OpenId,
  89. }
  90. payObj := wc.GetPay()
  91. prePayID, err := payObj.PrePayID(&payParams)
  92. if err != nil{
  93. fmt.Println("----------------->prepayid error", err.Error())
  94. return nil, err
  95. }
  96. nonceStr := util.RandomStr(32)
  97. timestamp := util.GetCurrTs()
  98. pack := "prepay_id=" + prePayID
  99. template := "appId=%s&nonceStr=%s&package=%s&signType=MD5&timeStamp=%s&key=%s"
  100. str := fmt.Sprintf(template, payObj.AppID, nonceStr, pack, strconv.FormatInt(timestamp, 10), payObj.PayKey)
  101. sign := util.MD5Sum(str)
  102. payCfg := pay.Config{timestamp, nonceStr, prePayID, "MD5", sign}
  103. exPayConfig := JSAPIPayConfig{}
  104. exPayConfig.AppId = wxConfig.AppId
  105. exPayConfig.NonceStr = payCfg.NonceStr
  106. exPayConfig.OutTradeNo = params.OutTradeNo
  107. exPayConfig.Package = "prepay_id=" + payCfg.PrePayID
  108. exPayConfig.PaySign = payCfg.Sign
  109. exPayConfig.SignType = payCfg.SignType
  110. exPayConfig.Timestamp = strconv.Itoa(int(payCfg.Timestamp))
  111. if err==nil {
  112. return &exPayConfig, nil
  113. }else{
  114. return nil, err
  115. }
  116. }
  117. // 获取微信OAuth认证参数
  118. func GetOAuthParams(paramMap map[string]string)(*WxOAuthConfig, error){
  119. config := WxOAuthConfig{}
  120. urlstr := wxConfig.RedirectUrl
  121. paramstr := ""
  122. for k, v := range paramMap{
  123. paramstr += fmt.Sprintf("%s=%s", k, url.QueryEscape(v))
  124. }
  125. if strings.Index(urlstr, "%s") > 0{
  126. urlstr = fmt.Sprintf(urlstr, paramstr)
  127. }
  128. url, err := wxoauth.GetRedirectURL(urlstr, wxConfig.Scope, url.QueryEscape(wxConfig.State))
  129. if err != nil{
  130. return nil, err
  131. }
  132. config.OAuthRedirectUrl = url
  133. config.AppId = wxConfig.AppId
  134. config.State = wxConfig.State
  135. config.Scope = wxConfig.Scope
  136. config.ResponseType = wxConfig.ResponseType
  137. config.AuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize"
  138. config.RedirectUrl = wxConfig.RedirectUrl
  139. return &config, nil
  140. }
  141. // 获取jssdk配置参数
  142. func GetJSSDKRarams(url string)(*js.Config, error){
  143. return wc.GetJs().GetConfig(url)
  144. }
  145. // 获取token
  146. func GetOpenId(code string)(string, error){
  147. resToken, err := wxoauth.GetUserAccessToken(code)
  148. if err == nil{
  149. addToken(resToken.OpenID, &resToken)
  150. }
  151. return resToken.OpenID, err
  152. }
  153. // 根据code获取用户信息(需scope为 snsapi_userinfo)
  154. func GetUserInfoByCode(code string)(*oauth.UserInfo, error){
  155. openId, err := GetOpenId(code)
  156. if err != nil{
  157. return nil, err
  158. }
  159. return GetUserInfo(openId)
  160. }
  161. // 获取用户信息(需scope为 snsapi_userinfo)
  162. func GetUserInfo(openId string)(*oauth.UserInfo, error){
  163. token := getToken(openId)
  164. if token == nil{
  165. return nil, errors.New("token of openid " + openId + "does not exist")
  166. }
  167. userInfo, err := wxoauth.GetUserInfo(token.AccessToken, openId)
  168. return &userInfo, err
  169. }