package weapp import "fmt" const ( apiLogin = "/sns/jscode2session" apiGetAccessToken = "/cgi-bin/token" apiGetPaidUnionID = "/wxa/getpaidunionid" apiQetticket = "/cgi-bin/ticket/getticket" ) // LoginResponse 返回给用户的数据 type LoginResponse struct { CommonError OpenID string `json:"openid"` SessionKey string `json:"session_key"` // 用户在开放平台的唯一标识符 // 只在满足一定条件的情况下返回 UnionID string `json:"unionid"` } // Login 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。 // // appID 小程序 appID // secret 小程序的 app secret // code 小程序登录时获取的 code func Login(appID, secret, code string) (*LoginResponse, error) { api := baseURL + apiLogin return login(appID, secret, code, api) } func login(appID, secret, code, api string) (*LoginResponse, error) { queries := requestQueries{ "appid": appID, "secret": secret, "js_code": code, "grant_type": "authorization_code", } url, err := encodeURL(api, queries) if err != nil { return nil, err } res := new(LoginResponse) if err := getJSON(url, res); err != nil { return nil, err } return res, nil } // TokenResponse 获取 access_token 成功返回数据 type TokenResponse struct { CommonError AccessToken string `json:"access_token"` // 获取到的凭证 ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。 } // GetAccessToken 获取小程序全局唯一后台接口调用凭据(access_token)。 // 调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存,注意缓存。 func GetAccessToken(appID, secret string) (*TokenResponse, error) { api := baseURL + apiGetAccessToken return getAccessToken(appID, secret, api) } func getAccessToken(appID, secret, api string) (*TokenResponse, error) { queries := requestQueries{ "appid": appID, "secret": secret, "grant_type": "client_credential", } url, err := encodeURL(api, queries) if err != nil { return nil, err } res := new(TokenResponse) if err := getJSON(url, res); err != nil { return nil, err } return res, nil } // TicketResponse 获取 Ticket 成功返回数据 type TicketResponse struct { CommonError ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。 Errcode int `json:"errcode"` Ticket string `json:"ticket"` } func Getticket(appID, access_token string) (*TicketResponse, error) { api := baseURL + apiQetticket return getticket(appID, access_token, api) } func getticket(appID, access_token, api string) (*TicketResponse, error) { queries := requestQueries{ "access_token": access_token, "type": "jsapi", } url, err := encodeURL(api, queries) if err != nil { return nil, err } res := new(TicketResponse) fmt.Println(res, "res") fmt.Println(access_token, "access_token") if err := getJSON(url, res); err != nil { return nil, err } return res, nil } // GetPaidUnionIDResponse response data type GetPaidUnionIDResponse struct { CommonError UnionID string `json:"unionid"` } // GetPaidUnionID 用户支付完成后,通过微信支付订单号(transaction_id)获取该用户的 UnionId, func GetPaidUnionID(accessToken, openID, transactionID string) (*GetPaidUnionIDResponse, error) { api := baseURL + apiGetPaidUnionID return getPaidUnionID(accessToken, openID, transactionID, api) } func getPaidUnionID(accessToken, openID, transactionID, api string) (*GetPaidUnionIDResponse, error) { queries := requestQueries{ "openid": openID, "access_token": accessToken, "transaction_id": transactionID, } return getPaidUnionIDRequest(api, queries) } // GetPaidUnionIDWithMCH 用户支付完成后,通过微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id)获取该用户的 UnionId, func GetPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID string) (*GetPaidUnionIDResponse, error) { api := baseURL + apiGetPaidUnionID return getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api) } func getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api string) (*GetPaidUnionIDResponse, error) { queries := requestQueries{ "openid": openID, "mch_id": mchID, "out_trade_no": outTradeNo, "access_token": accessToken, } return getPaidUnionIDRequest(api, queries) } func getPaidUnionIDRequest(api string, queries requestQueries) (*GetPaidUnionIDResponse, error) { url, err := encodeURL(api, queries) if err != nil { return nil, err } res := new(GetPaidUnionIDResponse) if err := getJSON(url, res); err != nil { return nil, err } return res, nil }