client

package
v0.0.0-...-f5adc6c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 26, 2014 License: Apache-2.0 Imports: 31 Imported by: 0

README

简介

这个 package 封装了微信公众平台的主动请求功能,如发送客服消息、群发消息、创建自定义菜单、 创建二维码等等...

使用方法

大部分功能都是 Client 对象的方法, 根据对应的功能调用对应的方法.

NewClient 函数的参数 TokenService 可以自己实现, 也可以用默认实现 *DefaultTokenService,

采用默认实现的时候要注意, 对于一个特定的 appid, 只能有一个 DefaultTokenService 的实例, 一般的做法就是把这个实例作为全局对象!!!

示例

这个实例是创建一个临时的二维码, TokenService 采用默认的实现.

package main

import (
	"fmt"
	"github.com/chanxuehong/wechat/client"
)

// *DefaultTokenService 实现了 TokenService 接口.
// 当然你也可以不用默认的实现, 这个时候就需要你自己实现 TokenService 接口了,
// 根据你自己的实现, tokenService 不一定要求作为全局变量,
// 但是如果用默认的实现 client.NewDefaultTokenService, 一个 appid 只能有一个实例.
var tokenService = client.NewDefaultTokenService(
	"xxxxxxxxxxxxxxxxxx",               // 公众号 appid
	"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // 公众号 appsecret
	nil,
)

func main() {
	wechatClient := client.NewClient(tokenService, nil)

	qrcode, err := wechatClient.QRCodeTemporaryCreate(100, 1000)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(qrcode)
}

测试信息

https://github.com/chanxuehong/wechat/blob/master/client/testinfo.txt

Documentation

Overview

封装公众平台主动请求 API.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func QRCodeDownload

func QRCodeDownload(ticket string, writer io.Writer) (err error)

通过 ticket 换取二维码到 writer

func QRCodeDownloadToFile

func QRCodeDownloadToFile(ticket, _filepath string) (err error)

通过 ticket 换取二维码到文件 _filepath

func QRCodeURL

func QRCodeURL(ticket string) string

根据 qrcode ticket 得到 qrcode 图片的 url

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 封装了主动请求功能, 比如创建菜单, 回复客服消息等等

func NewClient

func NewClient(tokenService TokenService, httpClient *http.Client) (clt *Client)

创建一个新的 Client.

如果 httpClient == nil 则默认用 http.DefaultClient,
see ../CommonHttpClient 和 ../MediaHttpClient.

func (*Client) CustomServiceKfList

func (c *Client) CustomServiceKfList() (kfList []customservice.KfInfo, err error)

获取客服基本信息

func (*Client) CustomServiceOnlineKfList

func (c *Client) CustomServiceOnlineKfList() (kfList []customservice.OnlineKfInfo, err error)

获取在线客服接待信息

func (*Client) CustomServiceRecordGet

func (c *Client) CustomServiceRecordGet(request *customservice.RecordGetRequest) (recordList []customservice.Record, err error)

获取客服聊天记录

func (*Client) CustomServiceRecordIterator

func (c *Client) CustomServiceRecordIterator(request *customservice.RecordGetRequest) (iter customservice.RecordIterator, err error)

聊天记录遍历器

func (*Client) MediaCreateNews

func (c *Client) MediaCreateNews(articles []media.NewsArticle) (info *media.MediaInfo, err error)

根据上传的缩略图媒体创建图文消息素材

articles 的长度不能大于 media.NewsArticleCountLimit

func (*Client) MediaCreateVideo

func (c *Client) MediaCreateVideo(mediaId, title, description string) (info *media.MediaInfo, err error)

根据上传的视频文件 media_id 创建视频媒体, 群发视频消息应该用这个函数得到的 media_id.

NOTE: title, description 可以为空

func (*Client) MediaDownload

func (c *Client) MediaDownload(mediaId, filepath_ string) (err error)

下载多媒体文件

func (*Client) MediaDownloadToWriter

func (c *Client) MediaDownloadToWriter(mediaId string, writer io.Writer) error

下载多媒体文件

func (*Client) MediaUploadImage

func (c *Client) MediaUploadImage(filepath_ string) (info *media.MediaInfo, err error)

上传多媒体图片

func (*Client) MediaUploadImageFromReader

func (c *Client) MediaUploadImageFromReader(filename string, mediaReader io.Reader) (info *media.MediaInfo, err error)

上传多媒体图片

NOTE: 参数 filename 不是文件路径, 是指定 multipart form 里面文件名称

func (*Client) MediaUploadThumb

func (c *Client) MediaUploadThumb(filepath_ string) (info *media.MediaInfo, err error)

上传多媒体缩略图

func (*Client) MediaUploadThumbFromReader

func (c *Client) MediaUploadThumbFromReader(filename string, mediaReader io.Reader) (info *media.MediaInfo, err error)

上传多媒体缩略图

NOTE: 参数 filename 不是文件路径, 是指定 multipart form 里面文件名称

func (*Client) MediaUploadVideo

func (c *Client) MediaUploadVideo(filepath_ string) (info *media.MediaInfo, err error)

上传多媒体视频

func (*Client) MediaUploadVideoFromReader

func (c *Client) MediaUploadVideoFromReader(filename string, mediaReader io.Reader) (info *media.MediaInfo, err error)

上传多媒体视频

NOTE: 参数 filename 不是文件路径, 是指定 multipart form 里面文件名称

func (*Client) MediaUploadVoice

func (c *Client) MediaUploadVoice(filepath_ string) (info *media.MediaInfo, err error)

上传多媒体语音

func (*Client) MediaUploadVoiceFromReader

func (c *Client) MediaUploadVoiceFromReader(filename string, mediaReader io.Reader) (info *media.MediaInfo, err error)

上传多媒体语音

NOTE: 参数 filename 不是文件路径, 是指定 multipart form 里面文件名称

func (*Client) MenuCreate

func (c *Client) MenuCreate(_menu menu.Menu) (err error)

创建自定义菜单.

NOTE: 创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。
建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

func (*Client) MenuDelete

func (c *Client) MenuDelete() (err error)

删除自定义菜单

func (*Client) MenuGet

func (c *Client) MenuGet() (_menu menu.Menu, err error)

获取自定义菜单

func (*Client) MerchantCategoryGetProperty

func (c *Client) MerchantCategoryGetProperty(categoryId int64) (properties []category.Property, err error)

获取指定分类的所有属性

func (*Client) MerchantCategoryGetSKU

func (c *Client) MerchantCategoryGetSKU(categoryId int64) (skus []category.SKU, err error)

获取指定子分类的所有SKU

func (*Client) MerchantCategoryGetSub

func (c *Client) MerchantCategoryGetSub(categoryId int64) (categories []category.Category, err error)

获取指定分类的所有子分类.

@categoryId: 大分类ID(根节点分类id为1)

func (*Client) MerchantExpressAddDeliveryTemplate

func (c *Client) MerchantExpressAddDeliveryTemplate(template *express.DeliveryTemplate) (templateId int64, err error)

增加邮费模板

NOTE: 无需指定 Id 字段

func (*Client) MerchantExpressDeleteDeliveryTemplate

func (c *Client) MerchantExpressDeleteDeliveryTemplate(templateId int64) (err error)

删除邮费模板

func (*Client) MerchantExpressGetAllDeliveryTemplate

func (c *Client) MerchantExpressGetAllDeliveryTemplate() (dts []express.DeliveryTemplate, err error)

获取所有邮费模板

func (*Client) MerchantExpressGetDeliveryTemplateById

func (c *Client) MerchantExpressGetDeliveryTemplateById(templateId int64) (dt *express.DeliveryTemplate, err error)

获取指定ID的邮费模板

func (*Client) MerchantExpressUpdateDeliveryTemplate

func (c *Client) MerchantExpressUpdateDeliveryTemplate(template *express.DeliveryTemplate) (err error)

修改邮费模板

NOTE: 需要指定 template.Id 字段

func (*Client) MerchantGroupAdd

func (c *Client) MerchantGroupAdd(_group *group.GroupEx) (groupId int64, err error)

增加分组

NOTE: 无需指定 Id 字段

func (*Client) MerchantGroupDelete

func (c *Client) MerchantGroupDelete(groupId int64) (err error)

删除分组

func (*Client) MerchantGroupGetAll

func (c *Client) MerchantGroupGetAll() (groups []group.Group, err error)

获取所有分组

func (*Client) MerchantGroupGetById

func (c *Client) MerchantGroupGetById(groupId int64) (_group *group.GroupEx, err error)

根据分组ID获取分组信息

func (*Client) MerchantGroupModifyProduct

func (c *Client) MerchantGroupModifyProduct(modifyRequest *group.GroupModifyProductRequest) (err error)

修改分组商品

func (*Client) MerchantGroupRename

func (c *Client) MerchantGroupRename(groupId int64, newName string) (err error)

修改分组名称

func (*Client) MerchantOrderClose

func (c *Client) MerchantOrderClose(orderId string) (err error)

关闭订单

func (*Client) MerchantOrderGetByFilter

func (c *Client) MerchantOrderGetByFilter(status int, beginTime, endTime int64) (orders []order.Order, err error)

根据订单状态/创建时间获取订单详情

@status:    订单状态, 不带该字段(==0) -全部状态, 2-待发货, 3-已发货, 5-已完成, 8-维权中
@beginTime: 订单创建时间起始时间, 不带该字段(==0) 则不按照时间做筛选
@endTime:   订单创建时间终止时间, 不带该字段(==0) 则不按照时间做筛选

func (*Client) MerchantOrderGetById

func (c *Client) MerchantOrderGetById(orderId string) (_order *order.Order, err error)

根据订单id获取订单详情

func (*Client) MerchantOrderSetDelivery

func (c *Client) MerchantOrderSetDelivery(orderId, deliveryCompany, deliveryTrackNo string) (err error)

设置订单发货信息.

@orderId:         订单ID;
@deliveryCompany: 物流公司ID(参考《物流公司ID》)
@deliveryTrackNo: 运单ID

func (*Client) MerchantProductAdd

func (c *Client) MerchantProductAdd(_product *product.Product) (productId string, err error)

增加商品

NOTE: 无需指定 Id 和 Status 字段

func (*Client) MerchantProductDelete

func (c *Client) MerchantProductDelete(productId string) (err error)

删除商品

func (*Client) MerchantProductGet

func (c *Client) MerchantProductGet(productId string) (_product *product.Product, err error)

查询商品

func (*Client) MerchantProductGetAll

func (c *Client) MerchantProductGetAll() ([]product.Product, error)

获取所有商品,包括上架商品 和 下架商品

func (*Client) MerchantProductGetAllOffShelf

func (c *Client) MerchantProductGetAllOffShelf() ([]product.Product, error)

获取所有下架商品

func (*Client) MerchantProductGetAllOnShelf

func (c *Client) MerchantProductGetAllOnShelf() ([]product.Product, error)

获取所有上架商品

func (*Client) MerchantProductModifyStatusOffShelf

func (c *Client) MerchantProductModifyStatusOffShelf(productId string) error

修改商品到下架状态

func (*Client) MerchantProductModifyStatusOnShelf

func (c *Client) MerchantProductModifyStatusOnShelf(productId string) error

修改商品到上架状态

func (*Client) MerchantProductUpdate

func (c *Client) MerchantProductUpdate(_product *product.Product) (err error)

修改商品

NOTE:
1. 需要指定 _product.Id 字段
2. 从未上架的商品所有信息均可修改,否则商品的名称(name)、商品分类(category)、
商品属性(property)这三个字段*不可修改*。

func (*Client) MerchantShelfAdd

func (c *Client) MerchantShelfAdd(_shelf *shelf.Shelf) (shelfId int64, err error)

增加货架

NOTE: 无需指定 Id 字段

func (*Client) MerchantShelfDelete

func (c *Client) MerchantShelfDelete(shelfId int64) (err error)

删除货架

func (*Client) MerchantShelfGetAll

func (c *Client) MerchantShelfGetAll() (shelves []shelf.Shelf, err error)

获取所有货架

func (*Client) MerchantShelfGetById

func (c *Client) MerchantShelfGetById(shelfId int64) (_shelf *shelf.Shelf, err error)

根据货架ID获取货架信息

func (*Client) MerchantShelfModify

func (c *Client) MerchantShelfModify(_shelf *shelf.Shelf) (err error)

修改货架

func (*Client) MerchantStockAdd

func (c *Client) MerchantStockAdd(productId string, skuInfo string, quantity int) (err error)

增加库存

@productId: 商品ID;
@skuInfo:   sku信息,格式"id1:vid1;id2:vid2",如商品为统一规格,则此处赋值为空字符串即可;
@quantity:  增加的库存数量.

func (*Client) MerchantStockReduce

func (c *Client) MerchantStockReduce(productId string, skuInfo string, quantity int) (err error)

减少库存

@productId: 商品ID;
@skuInfo:   sku信息,格式"id1:vid1;id2:vid2",如商品为统一规格,则此处赋值为空字符串即可;
@quantity:  增加的库存数量.

func (*Client) MerchantUploadImage

func (c *Client) MerchantUploadImage(filename string, imageReader io.Reader) (imageURL string, err error)

上传图片

NOTE: 参数 filename 不是文件路径, 是指定 multipart form 里面文件名称

func (*Client) MerchantUploadImageFromFile

func (c *Client) MerchantUploadImageFromFile(_filepath string) (imageURL string, err error)

上传图片

func (*Client) MsgCustomSendImage

func (c *Client) MsgCustomSendImage(msg *custom.Image) error

发送客服消息, 图片.

func (*Client) MsgCustomSendMusic

func (c *Client) MsgCustomSendMusic(msg *custom.Music) error

发送客服消息, 音乐.

func (*Client) MsgCustomSendNews

func (c *Client) MsgCustomSendNews(msg *custom.News) (err error)

发送客服消息, 图文.

func (*Client) MsgCustomSendText

func (c *Client) MsgCustomSendText(msg *custom.Text) error

发送客服消息, 文本.

func (*Client) MsgCustomSendVideo

func (c *Client) MsgCustomSendVideo(msg *custom.Video) error

发送客服消息, 视频.

func (*Client) MsgCustomSendVoice

func (c *Client) MsgCustomSendVoice(msg *custom.Voice) error

发送客服消息, 语音.

func (*Client) MsgMassDelete

func (c *Client) MsgMassDelete(msgid int64) (err error)

删除群发.

NOTE: 只有已经发送成功的消息才能删除删除消息只是将消息的图文详情页失效,已经收到的用户,
还是能在其本地看到消息卡片。 另外,删除群发消息只能删除图文消息和视频消息,
其他类型的消息一经发送,无法删除。

func (*Client) MsgMassSendImageByGroup

func (c *Client) MsgMassSendImageByGroup(msg *massbygroup.Image) (msgid int64, err error)

根据分组群发图片消息.

func (*Client) MsgMassSendImageByOpenId

func (c *Client) MsgMassSendImageByOpenId(msg *massbyopenid.Image) (msgid int64, err error)

根据用户列表群发图片消息.

func (*Client) MsgMassSendNewsByGroup

func (c *Client) MsgMassSendNewsByGroup(msg *massbygroup.News) (msgid int64, err error)

根据分组群发图文消息.

func (*Client) MsgMassSendNewsByOpenId

func (c *Client) MsgMassSendNewsByOpenId(msg *massbyopenid.News) (msgid int64, err error)

根据用户列表群发图文消息.

func (*Client) MsgMassSendTextByGroup

func (c *Client) MsgMassSendTextByGroup(msg *massbygroup.Text) (msgid int64, err error)

根据分组群发文本消息.

func (*Client) MsgMassSendTextByOpenId

func (c *Client) MsgMassSendTextByOpenId(msg *massbyopenid.Text) (msgid int64, err error)

根据用户列表群发文本消息.

func (*Client) MsgMassSendVideoByGroup

func (c *Client) MsgMassSendVideoByGroup(msg *massbygroup.Video) (msgid int64, err error)

根据分组群发视频消息.

func (*Client) MsgMassSendVideoByOpenId

func (c *Client) MsgMassSendVideoByOpenId(msg *massbyopenid.Video) (msgid int64, err error)

根据用户列表群发视频消息.

func (*Client) MsgMassSendVoiceByGroup

func (c *Client) MsgMassSendVoiceByGroup(msg *massbygroup.Voice) (msgid int64, err error)

根据分组群发语音消息.

func (*Client) MsgMassSendVoiceByOpenId

func (c *Client) MsgMassSendVoiceByOpenId(msg *massbyopenid.Voice) (msgid int64, err error)

根据用户列表群发语音消息.

func (*Client) MsgTemplateSend

func (c *Client) MsgTemplateSend(msg *template.Msg) (msgid int64, err error)

发送模版消息

func (*Client) MsgTemplateSendRaw

func (c *Client) MsgTemplateSendRaw(msg []byte) (msgid int64, err error)

发送模版消息.

对于某些用户, template.Msg 不能满足其需求, 所以提供了这个方法供其调用, 由用户自己封装 json格式 消息体!

func (*Client) PayDeliverNotify

func (c *Client) PayDeliverNotify(data *pay.DeliverNotifyData) (err error)

微信支付发货通知

func (*Client) PayFeedbackUpdate

func (c *Client) PayFeedbackUpdate(openid string, feedbackid int64) (err error)

标记客户的投诉处理状态

func (*Client) PayOrderQuery

func (c *Client) PayOrderQuery(req *pay.OrderQueryRequest) (resp *pay.OrderQueryResponse, err error)

微信支付订单查询

func (*Client) QRCodeDownload

func (c *Client) QRCodeDownload(ticket string, writer io.Writer) (err error)

通过 ticket 换取二维码到 writer

func (*Client) QRCodeDownloadToFile

func (c *Client) QRCodeDownloadToFile(ticket, _filepath string) (err error)

通过 ticket 换取二维码到文件 _filepath

func (*Client) QRCodePermanentCreate

func (c *Client) QRCodePermanentCreate(sceneId uint32) (_qrcode *qrcode.PermanentQRCode, err error)

创建永久二维码

func (*Client) QRCodeTemporaryCreate

func (c *Client) QRCodeTemporaryCreate(sceneId uint32, expireSeconds int) (_qrcode *qrcode.TemporaryQRCode, err error)

创建临时二维码

func (*Client) ShortURL

func (c *Client) ShortURL(longURL string) (shortURL string, err error)

将一条长链接转成短链接。

主要使用场景:开发者用于生成二维码的原链接(商品、支付二维码等)太长导致扫码速度和成功率下降,
将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率。

func (*Client) Token

func (c *Client) Token() (token string, err error)

获取 access token 正常情况下 token != "" && err == nil, 否则 token == "" && err != nil

func (*Client) TokenRefresh

func (c *Client) TokenRefresh() (token string, err error)

从微信服务器获取新的 access token. 正常情况下 token != "" && err == nil, 否则 token == "" && err != nil

NOTE:
1. 一般情况下无需调用该函数, 请使用 Token() 获取 access token.
2. 即使微信服务器返回了 access token 过期错误(错误代码 42001, 正常情况下不会出现),
   也请谨慎调用 TokenRefresh, 建议直接返回错误! 因为很有可能高并发情况下造成雪崩效应!
3. 再次强调, 调用这个函数你应该知道发生了什么!!!

func (*Client) UserGroupCreate

func (c *Client) UserGroupCreate(name string) (_group *user.Group, err error)

创建分组

func (*Client) UserGroupGet

func (c *Client) UserGroupGet() (groups []user.Group, err error)

查询所有分组

func (*Client) UserGroupRename

func (c *Client) UserGroupRename(groupid int64, name string) (err error)

修改分组名

func (*Client) UserInWhichGroup

func (c *Client) UserInWhichGroup(openid string) (groupid int64, err error)

查询用户所在分组

func (*Client) UserInfo

func (c *Client) UserInfo(openid string, lang string) (userinfo *user.UserInfo, err error)

获取用户基本信息, 如果用户没有订阅公众号, 返回 user.ErrNotSubscribe 错误.

lang 可能的取值是 zh_CN, zh_TW, en; 如果留空 "" 则默认为 zh_CN.

func (*Client) UserIterator

func (c *Client) UserIterator(beginOpenId string) (iter user.UserIterator, err error)

关注用户遍历器, 如果 beginOpenId == "" 则表示从头遍历

func (*Client) UserList

func (c *Client) UserList(beginOpenId string) (data *user.UserGetData, err error)

获取关注者列表, 每次最多能获取 10000 个用户, 如果 beginOpenId == "" 则表示从头获取

func (*Client) UserMoveToGroup

func (c *Client) UserMoveToGroup(openid string, toGroupId int64) (err error)

移动用户分组

func (*Client) UserUpdateRemark

func (c *Client) UserUpdateRemark(openId, remark string) (err error)

开发者可以通过该接口对指定用户设置备注名

NOTE: 该接口暂时开放给微信认证的服务号

type DefaultTokenService

type DefaultTokenService struct {
	// contains filtered or unexported fields
}

func NewDefaultTokenService

func NewDefaultTokenService(appid, appsecret string, httpClient *http.Client) (srv *DefaultTokenService)

func (*DefaultTokenService) Token

func (srv *DefaultTokenService) Token() (token string, err error)

func (*DefaultTokenService) TokenRefresh

func (srv *DefaultTokenService) TokenRefresh() (token string, err error)

type Error

type Error struct {
	ErrCode int    `json:"errcode"`
	ErrMsg  string `json:"errmsg"`
}

微信服务器返回的错误都是这个格式

func (*Error) Error

func (e *Error) Error() string

type TokenService

type TokenService interface {
	// 获取 access token, 该 token 一般缓存在某个地方.
	// 正常情况下 token != "" && err == nil, 否则 token == "" && err != nil
	// NOTE: 该方法一定要功能上实现!
	Token() (token string, err error)

	// 从微信服务器获取新的 access token.
	// 正常情况下 token != "" && err == nil, 否则 token == "" && err != nil
	//  NOTE:
	//  1. 一般情况下无需调用该函数, 请使用 Token() 获取 access token.
	//  2. 该方法可以选择是否功能上实现, 如果没有需求可以在语法上实现即可!
	//  3. 即使微信服务器返回了 access token 过期错误(错误代码 42001, 正常情况下不会出现),
	//     也请谨慎调用 TokenRefresh, 建议直接返回错误! 因为很有可能高并发情况下造成雪崩效应!
	//  4. 再次强调, 调用这个函数你应该知道发生了什么!!!
	TokenRefresh() (token string, err error)
}

access token 伺服接口, see token_service.png

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL