update service wechatminiprogram

master
李光春 2 years ago
parent ea5476f1e4
commit a0ed28bf12

@ -3,15 +3,10 @@ package wechatminiprogram
import (
"encoding/json"
"fmt"
"net/http"
)
// AuthCode2Session 请求参数
type AuthCode2Session struct {
JsCode string `json:"js_code"`
}
// AuthCode2SessionResult 返回参数
type AuthCode2SessionResult struct {
type AuthCode2SessionResponse struct {
OpenId string `json:"openid"` // 用户唯一标识
SessionKey string `json:"session_key"` // 会话密钥
Unionid string `json:"unionid"` // 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
@ -19,14 +14,21 @@ type AuthCode2SessionResult struct {
Errmsg string `json:"errmsg"` // 错误信息
}
func (app *App) AuthCode2Session(param AuthCode2Session) (result AuthCode2SessionResult, err error) {
// request
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", app.AppId, app.AppSecret, param.JsCode), map[string]interface{}{}, "GET")
if err != nil {
return
}
if err = json.Unmarshal(body, &result); err != nil {
return
}
return
type AuthCode2SessionResult struct {
Result AuthCode2SessionResponse // 结果
Byte []byte // 内容
Err error // 错误
}
func NewAuthCode2SessionResult(result AuthCode2SessionResponse, byte []byte, err error) *AuthCode2SessionResult {
return &AuthCode2SessionResult{Result: result, Byte: byte, Err: err}
}
func (app *App) AuthCode2Session(jsCode string) *AuthCode2SessionResult {
// 请求
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", app.AppId, app.AppSecret, jsCode), map[string]interface{}{}, http.MethodGet)
// 定义
var response AuthCode2SessionResponse
err = json.Unmarshal(body, &response)
return NewAuthCode2SessionResult(response, body, err)
}

@ -1,10 +1,12 @@
package wechatminiprogram
import (
"encoding/json"
"fmt"
"net/http"
)
type BusinessGetLiveInfoResult struct {
type BusinessGetLiveInfoResponse struct {
Errcode int `json:"errcode"` // // 错误码0代表成功1代表未创建直播间
Errmsg string `json:"errmsg"` // 错误信息
Total int `json:"total"`
@ -39,13 +41,26 @@ type BusinessGetLiveInfoResult struct {
} `json:"room_info"`
}
type BusinessGetLiveInfoResult struct {
Result BusinessGetLiveInfoResponse // 结果
Byte []byte // 内容
Err error // 错误
}
func NewBusinessGetLiveInfoResult(result BusinessGetLiveInfoResponse, byte []byte, err error) *BusinessGetLiveInfoResult {
return &BusinessGetLiveInfoResult{Result: result, Byte: byte, Err: err}
}
// BusinessGetLiveInfo 获取直播间列表
// 调用此接口获取直播间列表及直播间信息
// https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/liveplayer/studio-api.html
func (app *App) BusinessGetLiveInfo(notMustParams ...Params) (body []byte, err error) {
func (app *App) BusinessGetLiveInfo(notMustParams ...Params) *BusinessGetLiveInfoResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err = app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/business/getliveinfo?access_token=%s", app.AccessToken), params, "POST")
return
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/business/getliveinfo?access_token=%s", app.AccessToken), params, http.MethodPost)
// 定义
var response BusinessGetLiveInfoResponse
err = json.Unmarshal(body, &response)
return NewBusinessGetLiveInfoResult(response, body, err)
}

@ -3,6 +3,7 @@ package wechatminiprogram
import (
"encoding/json"
"fmt"
"net/http"
)
type AuthGetAccessTokenResponse struct {
@ -26,8 +27,8 @@ func NewAuthGetAccessTokenResult(result AuthGetAccessTokenResponse, byte []byte,
// 接口调用凭证
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
func (app *App) AuthGetAccessToken() *AuthGetAccessTokenResult {
// request
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", app.AppId, app.AppSecret), map[string]interface{}{}, "GET")
// 请求
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", app.AppId, app.AppSecret), map[string]interface{}{}, http.MethodGet)
// 定义
var response AuthGetAccessTokenResponse
err = json.Unmarshal(body, &response)

@ -3,6 +3,7 @@ package wechatminiprogram
import (
"encoding/json"
"fmt"
"net/http"
)
type GetCallBackIpResponse struct {
@ -24,7 +25,7 @@ func NewGetCallBackIpResult(result GetCallBackIpResponse, byte []byte, err error
// https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80
func (app *App) GetCallBackIp() *GetCallBackIpResult {
// 请求
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=%s", app.AccessToken), map[string]interface{}{}, "GET")
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=%s", app.AccessToken), map[string]interface{}{}, http.MethodGet)
// 定义
var response GetCallBackIpResponse
err = json.Unmarshal(body, &response)

@ -8,7 +8,7 @@ import (
"time"
)
type ShareResult struct {
type ShareResponse struct {
AppId string `json:"app_id"`
NonceStr string `json:"nonce_str"`
Timestamp int64 `json:"timestamp"`
@ -17,14 +17,24 @@ type ShareResult struct {
Signature string `json:"signature"`
}
func (app *App) Share(url string) (result ShareResult) {
result.AppId = app.AppId
result.NonceStr = gorandom.Alphanumeric(32)
result.Timestamp = time.Now().Unix()
result.Url = url
result.RawString = fmt.Sprintf("jsapi_ticket=%v&noncestr=%v&timestamp=%v&url=%v", app.JsapiTicket, result.NonceStr, result.Timestamp, result.Url)
type ShareResult struct {
Result ShareResponse // 结果
Err error // 错误
}
func NewShareResult(result ShareResponse, err error) *ShareResult {
return &ShareResult{Result: result, Err: err}
}
func (app *App) Share(url string) *ShareResult {
var response ShareResponse
response.AppId = app.AppId
response.NonceStr = gorandom.Alphanumeric(32)
response.Timestamp = time.Now().Unix()
response.Url = url
response.RawString = fmt.Sprintf("jsapi_ticket=%v&noncestr=%v&timestamp=%v&url=%v", app.JsapiTicket, response.NonceStr, response.Timestamp, response.Url)
t := sha1.New()
io.WriteString(t, result.RawString)
result.Signature = fmt.Sprintf("%x", t.Sum(nil))
return result
_, err := io.WriteString(t, response.RawString)
response.Signature = fmt.Sprintf("%x", t.Sum(nil))
return NewShareResult(response, err)
}

@ -16,31 +16,30 @@ type SubscribeMessageSend struct {
Lang string `json:"lang,omitempty"` // 进入小程序查看”的语言类型支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)默认为zh_CN
}
// SubscribeMessageSendResult 返回参数
type SubscribeMessageSendResult struct {
type SubscribeMessageSendResponse struct {
Errcode int // 错误码
Errmsg string // 错误信息
}
type SubscribeMessageSendResult struct {
Result SubscribeMessageSendResponse // 结果
Byte []byte // 内容
Err error // 错误
}
func NewSubscribeMessageSendResult(result SubscribeMessageSendResponse, byte []byte, err error) *SubscribeMessageSendResult {
return &SubscribeMessageSendResult{Result: result, Byte: byte, Err: err}
}
// SubscribeMessageSend 发送订阅消息
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
func (app *App) SubscribeMessageSend(param SubscribeMessageSend) (result SubscribeMessageSendResult, err error) {
// api params
params := map[string]interface{}{}
b, _ := json.Marshal(&param)
var m map[string]interface{}
_ = json.Unmarshal(b, &m)
for k, v := range m {
params[k] = v
}
// request
func (app *App) SubscribeMessageSend(notMustParams ...Params) *SubscribeMessageSendResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s", app.AccessToken), params, http.MethodPost)
if err != nil {
return
}
if err = json.Unmarshal(body, &result); err != nil {
return
}
return
// 定义
var response SubscribeMessageSendResponse
err = json.Unmarshal(body, &response)
return NewSubscribeMessageSendResult(response, body, err)
}

@ -8,15 +8,13 @@ import (
"errors"
)
// UserInfo 请求参数
type UserInfo struct {
SessionKey string `json:"session_key"`
EncryptedData string `json:"encrypted_data"`
Iv string `json:"iv"`
}
// UserInfoResult 返回参数
type UserInfoResult struct {
type UserInfoResponse struct {
OpenID string `json:"openId"`
NickName string `json:"nickName"`
Gender int `json:"gender"`
@ -31,36 +29,46 @@ type UserInfoResult struct {
} `json:"watermark"`
}
type UserInfoResult struct {
Result UserInfoResponse // 结果
Err error // 错误
}
func NewUserInfoResult(result UserInfoResponse, err error) *UserInfoResult {
return &UserInfoResult{Result: result, Err: err}
}
// UserInfo 解密用户信息
func (app *App) UserInfo(param UserInfo) (result UserInfoResult, err error) {
func (app *App) UserInfo(param UserInfo) *UserInfoResult {
var response UserInfoResponse
aesKey, err := base64.StdEncoding.DecodeString(param.SessionKey)
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
cipherText, err := base64.StdEncoding.DecodeString(param.EncryptedData)
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
ivBytes, err := base64.StdEncoding.DecodeString(param.Iv)
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
block, err := aes.NewCipher(aesKey)
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
mode := cipher.NewCBCDecrypter(block, ivBytes)
mode.CryptBlocks(cipherText, cipherText)
cipherText, err = app.pkcs7Unpaid(cipherText, block.BlockSize())
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
err = json.Unmarshal(cipherText, &result)
err = json.Unmarshal(cipherText, &response)
if err != nil {
return result, err
return NewUserInfoResult(response, err)
}
if result.Watermark.AppID != app.AppId {
return result, errors.New("app id not match")
if response.Watermark.AppID != app.AppId {
return NewUserInfoResult(response, errors.New("app id not match"))
}
return result, nil
return NewUserInfoResult(response, err)
}

@ -8,15 +8,13 @@ import (
"errors"
)
// UserPhone 请求参数
type UserPhone struct {
SessionKey string `json:"session_key"`
EncryptedData string `json:"encrypted_data"`
Iv string `json:"iv"`
}
// UserPhoneResult 返回参数
type UserPhoneResult struct {
type UserPhoneResponse struct {
PhoneNumber string `json:"phoneNumber"` // 用户绑定的手机号(国外手机号会有区号)
PurePhoneNumber string `json:"purePhoneNumber"` // 没有区号的手机号
CountryCode string `json:"countryCode"` // 区号
@ -26,36 +24,46 @@ type UserPhoneResult struct {
} `json:"watermark"`
}
type UserPhoneResult struct {
Result UserPhoneResponse // 结果
Err error // 错误
}
func NewUserPhoneResult(result UserPhoneResponse, err error) *UserPhoneResult {
return &UserPhoneResult{Result: result, Err: err}
}
// UserPhone 解密手机号信息
func (app *App) UserPhone(param UserPhone) (result UserPhoneResult, err error) {
func (app *App) UserPhone(param UserPhone) *UserPhoneResult {
var response UserPhoneResponse
aesKey, err := base64.StdEncoding.DecodeString(param.SessionKey)
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
cipherText, err := base64.StdEncoding.DecodeString(param.EncryptedData)
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
ivBytes, err := base64.StdEncoding.DecodeString(param.Iv)
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
block, err := aes.NewCipher(aesKey)
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
mode := cipher.NewCBCDecrypter(block, ivBytes)
mode.CryptBlocks(cipherText, cipherText)
cipherText, err = app.pkcs7Unpaid(cipherText, block.BlockSize())
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
err = json.Unmarshal(cipherText, &result)
err = json.Unmarshal(cipherText, &response)
if err != nil {
return result, err
return NewUserPhoneResult(response, err)
}
if result.Watermark.AppID != app.AppId {
return result, errors.New("app id not match")
if response.Watermark.AppID != app.AppId {
return NewUserPhoneResult(response, errors.New("app id not match"))
}
return result, nil
return NewUserPhoneResult(response, err)
}

Loading…
Cancel
Save