增加vendor
This commit is contained in:
+84
@@ -0,0 +1,84 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/silenceper/wechat/v2/officialaccount/context"
|
||||
"github.com/silenceper/wechat/v2/util"
|
||||
)
|
||||
|
||||
var (
|
||||
// 获取微信服务器IP地址
|
||||
// 文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html
|
||||
getCallbackIPURL = "https://api.weixin.qq.com/cgi-bin/getcallbackip"
|
||||
getAPIDomainIPURL = "https://api.weixin.qq.com/cgi-bin/get_api_domain_ip"
|
||||
|
||||
// 清理接口调用次数
|
||||
clearQuotaURL = "https://api.weixin.qq.com/cgi-bin/clear_quota"
|
||||
)
|
||||
|
||||
// Basic struct
|
||||
type Basic struct {
|
||||
*context.Context
|
||||
}
|
||||
|
||||
// NewBasic 实例
|
||||
func NewBasic(context *context.Context) *Basic {
|
||||
basic := new(Basic)
|
||||
basic.Context = context
|
||||
return basic
|
||||
}
|
||||
|
||||
// IPListRes 获取微信服务器IP地址 返回结果
|
||||
type IPListRes struct {
|
||||
util.CommonError
|
||||
IPList []string `json:"ip_list"`
|
||||
}
|
||||
|
||||
// GetCallbackIP 获取微信callback IP地址
|
||||
func (basic *Basic) GetCallbackIP() ([]string, error) {
|
||||
ak, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
url := fmt.Sprintf("%s?access_token=%s", getCallbackIPURL, ak)
|
||||
data, err := util.HTTPGet(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ipListRes := &IPListRes{}
|
||||
err = util.DecodeWithError(data, ipListRes, "GetCallbackIP")
|
||||
return ipListRes.IPList, err
|
||||
}
|
||||
|
||||
// GetAPIDomainIP 获取微信API接口 IP地址
|
||||
func (basic *Basic) GetAPIDomainIP() ([]string, error) {
|
||||
ak, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
url := fmt.Sprintf("%s?access_token=%s", getAPIDomainIPURL, ak)
|
||||
data, err := util.HTTPGet(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ipListRes := &IPListRes{}
|
||||
err = util.DecodeWithError(data, ipListRes, "GetAPIDomainIP")
|
||||
return ipListRes.IPList, err
|
||||
}
|
||||
|
||||
// ClearQuota 清理接口调用次数
|
||||
func (basic *Basic) ClearQuota() error {
|
||||
ak, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
url := fmt.Sprintf("%s?access_token=%s", clearQuotaURL, ak)
|
||||
data, err := util.PostJSON(url, map[string]string{
|
||||
"appid": basic.AppID,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return util.DecodeWithCommonError(data, "ClearQuota")
|
||||
}
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"github.com/silenceper/wechat/v2/util"
|
||||
)
|
||||
|
||||
const (
|
||||
qrCreateURL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s"
|
||||
getQRImgURL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s"
|
||||
)
|
||||
|
||||
const (
|
||||
actionID = "QR_SCENE"
|
||||
actionStr = "QR_STR_SCENE"
|
||||
|
||||
actionLimitID = "QR_LIMIT_SCENE"
|
||||
actionLimitStr = "QR_LIMIT_STR_SCENE"
|
||||
)
|
||||
|
||||
// Request 临时二维码
|
||||
type Request struct {
|
||||
ExpireSeconds int64 `json:"expire_seconds,omitempty"`
|
||||
ActionName string `json:"action_name"`
|
||||
ActionInfo struct {
|
||||
Scene struct {
|
||||
SceneStr string `json:"scene_str,omitempty"`
|
||||
SceneID int `json:"scene_id,omitempty"`
|
||||
} `json:"scene"`
|
||||
} `json:"action_info"`
|
||||
}
|
||||
|
||||
// Ticket 二维码ticket
|
||||
type Ticket struct {
|
||||
util.CommonError `json:",inline"`
|
||||
Ticket string `json:"ticket"`
|
||||
ExpireSeconds int64 `json:"expire_seconds"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
// GetQRTicket 获取二维码 Ticket
|
||||
func (basic *Basic) GetQRTicket(tq *Request) (t *Ticket, err error) {
|
||||
accessToken, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
uri := fmt.Sprintf(qrCreateURL, accessToken)
|
||||
response, err := util.PostJSON(uri, tq)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("get qr ticket failed, %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
t = new(Ticket)
|
||||
err = json.Unmarshal(response, &t)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if t.ErrMsg != "" {
|
||||
err = fmt.Errorf("get qr_ticket error : errcode=%v , errormsg=%v", t.ErrCode, t.ErrMsg)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// ShowQRCode 通过ticket换取二维码
|
||||
func ShowQRCode(tk *Ticket) string {
|
||||
return fmt.Sprintf(getQRImgURL, tk.Ticket)
|
||||
}
|
||||
|
||||
// NewTmpQrRequest 新建临时二维码请求实例
|
||||
func NewTmpQrRequest(exp time.Duration, scene interface{}) *Request {
|
||||
tq := &Request{
|
||||
ExpireSeconds: int64(exp.Seconds()),
|
||||
}
|
||||
switch reflect.ValueOf(scene).Kind() {
|
||||
case reflect.String:
|
||||
tq.ActionName = actionStr
|
||||
tq.ActionInfo.Scene.SceneStr = scene.(string)
|
||||
case reflect.Int, reflect.Int8, reflect.Int16,
|
||||
reflect.Int32, reflect.Int64,
|
||||
reflect.Uint, reflect.Uint8, reflect.Uint16,
|
||||
reflect.Uint32, reflect.Uint64:
|
||||
tq.ActionName = actionID
|
||||
tq.ActionInfo.Scene.SceneID = scene.(int)
|
||||
}
|
||||
|
||||
return tq
|
||||
}
|
||||
|
||||
// NewLimitQrRequest 新建永久二维码请求实例
|
||||
func NewLimitQrRequest(scene interface{}) *Request {
|
||||
tq := &Request{}
|
||||
switch reflect.ValueOf(scene).Kind() {
|
||||
case reflect.String:
|
||||
tq.ActionName = actionLimitStr
|
||||
tq.ActionInfo.Scene.SceneStr = scene.(string)
|
||||
case reflect.Int, reflect.Int8, reflect.Int16,
|
||||
reflect.Int32, reflect.Int64,
|
||||
reflect.Uint, reflect.Uint8, reflect.Uint16,
|
||||
reflect.Uint32, reflect.Uint64:
|
||||
tq.ActionName = actionLimitID
|
||||
tq.ActionInfo.Scene.SceneID = scene.(int)
|
||||
}
|
||||
|
||||
return tq
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/silenceper/wechat/v2/util"
|
||||
)
|
||||
|
||||
const (
|
||||
// 将一条长链接转成短链接
|
||||
// https://developers.weixin.qq.com/doc/offiaccount/Account_Management/URL_Shortener.html
|
||||
long2shortURL = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=%s"
|
||||
long2shortAction = "long2short"
|
||||
)
|
||||
|
||||
type (
|
||||
reqLong2ShortURL struct {
|
||||
Action string `json:"action"`
|
||||
LongURL string `json:"long_url"`
|
||||
}
|
||||
resplong2ShortURL struct {
|
||||
ShortURL string `json:"short_url"`
|
||||
util.CommonError
|
||||
}
|
||||
)
|
||||
|
||||
// Long2ShortURL 将一条长链接转成短链接
|
||||
func (basic *Basic) Long2ShortURL(longURL string) (shortURL string, err error) {
|
||||
var (
|
||||
req = &reqLong2ShortURL{
|
||||
Action: long2shortAction,
|
||||
LongURL: longURL,
|
||||
}
|
||||
resp = new(resplong2ShortURL)
|
||||
ac, uri string
|
||||
responseBytes []byte
|
||||
)
|
||||
ac, err = basic.GetAccessToken()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
uri = fmt.Sprintf(long2shortURL, ac)
|
||||
responseBytes, err = util.PostJSON(uri, req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = util.DecodeWithError(responseBytes, resp, long2shortAction); err != nil {
|
||||
return
|
||||
}
|
||||
shortURL = resp.ShortURL
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user