package wx import ( "errors" "fmt" "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys" "git.qianqiusoft.com/qianqiusoft/light-apiengine/models" "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils" "github.com/silenceper/wechat/js" "github.com/silenceper/wechat/oauth" "github.com/silenceper/wechat/pay" "github.com/silenceper/wechat/util" "net/url" "strconv" "strings" ) var wxPayCallbackHandler func(result *pay.NotifyResult)models.SysReturn = nil // 注册微信支付回调处理函数 func RegisterWxPayCallbackHandler(handler func(result *pay.NotifyResult)models.SysReturn){ wxPayCallbackHandler = handler } func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{ if wxPayCallbackHandler == nil{ return models.SysReturn{500, "微信支付回调处理函数为空", nil} } notifyRet := pay.NotifyResult{} err := c.Ctx.BindXML(¬ifyRet) if err != nil{ fmt.Println("******************----》微信支付回调bindxml错误", err.Error()) return models.SysReturn{500, err.Error(), nil} } return wxPayCallbackHandler(¬ifyRet) } // 扫码支付 func PayNative(params *PayParams)(*pay.PayResult, error){ ip := utils.GetIP(params.Ctx) attach := params.Attach if attach == ""{ attach = params.Ctx.Ctx.GetString("user_id") if attach == ""{ attach = "attach" } } body := params.Body if body == ""{ body = "body" } if params.OutTradeNo == ""{ return nil, errors.New("交易单号为空") } parParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, ""} return wc.GetPay().PreNative(&parParams) } // jsapi 支付 func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){ openId := params.OpenId if openId == ""{ return nil, errors.New("openid 为空") } if params.OutTradeNo == ""{ return nil, errors.New("交易单号为空") } attach := params.Attach if attach == ""{ attach = params.Ctx.Ctx.GetString("user_id") if attach == ""{ attach = "attach" } } body := params.Body if body == ""{ body = "body" } ip := utils.GetIP(params.Ctx) payParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, params.OpenId} payObj := wc.GetPay() prePayID, err := payObj.PrePayID(&payParams) if err != nil{ fmt.Println("----------------->prepayid error", err.Error()) return nil, err } nonceStr := util.RandomStr(32) timestamp := util.GetCurrTs() pack := "prepay_id=" + prePayID template := "appId=%s&nonceStr=%s&package=%s&signType=MD5&timeStamp=%s&key=%s" str := fmt.Sprintf(template, payObj.AppID, nonceStr, pack, strconv.FormatInt(timestamp, 10), payObj.PayKey) sign := util.MD5Sum(str) payCfg := pay.Config{timestamp, nonceStr, prePayID, "MD5", sign} exPayConfig := JSAPIPayConfig{} exPayConfig.AppId = wxConfig.AppId exPayConfig.NonceStr = payCfg.NonceStr exPayConfig.OutTradeNo = params.OutTradeNo exPayConfig.Package = "prepay_id=" + payCfg.PrePayID exPayConfig.PaySign = payCfg.Sign exPayConfig.SignType = payCfg.SignType exPayConfig.Timestamp = strconv.Itoa(int(payCfg.Timestamp)) if err==nil { return &exPayConfig, nil }else{ return nil, err } } // 获取微信OAuth认证参数 func GetOAuthParams(paramMap map[string]string)(*WxOAuthConfig, error){ config := WxOAuthConfig{} urlstr := wxConfig.RedirectUrl paramstr := "" for k, v := range paramMap{ paramstr += fmt.Sprintf("%s=%s", k, url.QueryEscape(v)) } if strings.Index(urlstr, "%s") > 0{ urlstr = fmt.Sprintf(urlstr, paramstr) } url, err := wxoauth.GetRedirectURL(urlstr, wxConfig.Scope, url.QueryEscape(wxConfig.State)) if err != nil{ return nil, err } config.OAuthRedirectUrl = url config.AppId = wxConfig.AppId config.State = wxConfig.State config.Scope = wxConfig.Scope config.ResponseType = wxConfig.ResponseType config.AuthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize" config.RedirectUrl = wxConfig.RedirectUrl return &config, nil } // 获取jssdk配置参数 func GetJSSDKRarams(url string)(*js.Config, error){ return wc.GetJs().GetConfig(url) } // 获取token func GetOpenId(code string)(string, error){ resToken, err := wxoauth.GetUserAccessToken(code) if err == nil{ addToken(resToken.OpenID, &resToken) } return resToken.OpenID, err } // 根据code获取用户信息(需scope为 snsapi_userinfo) func GetUserInfoByCode(code string)(*oauth.UserInfo, error){ openId, err := GetOpenId(code) if err != nil{ return nil, err } return GetUserInfo(openId) } // 获取用户信息(需scope为 snsapi_userinfo) func GetUserInfo(openId string)(*oauth.UserInfo, error){ token := getToken(openId) if token == nil{ return nil, errors.New("token of openid " + openId + "does not exist") } userInfo, err := wxoauth.GetUserInfo(token.AccessToken, openId) return &userInfo, err }