Giter VIP home page Giter VIP logo

wechat's People

Contributors

alysay avatar chanxuehong avatar huangjunwen avatar ian4hu avatar leeemooo avatar nanjishidu avatar owen-gxz avatar satbirdd avatar yushan017 avatar zhangxinghao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat's Issues

README.md and readme.md

There are two readme files.README.md and readme.md .....
Is there any reason to create two files?
Git have a mistake here, because of the same files, it always says there is a readme.md was deleted.
Can you delete one of them?

ExchangeToken() dial tcp: i/o timeout

在 chrome 中访问 https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxx&secret=xxx&code=xxx&grant_type=authorization_code 正常。
但在代码里面调用 token, xerr := oauth2Client.ExchangeToken(code) 得到 xerr:
Get https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxx&secret=xxx&code=xxx&grant_type=authorization_code: dial tcp: i/o timeout

以下命令也超时
curl -sL https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxx&secret=xxx&code=xxx&grant_type=authorization_code

OS: macOS Sierra 10.12.3 (16D30)

消息排重算法收集

因为微信推送过来的消息如果你5秒内没有处理完毕,会尝试再推送过来一个,总的三次

那么现实中,很有可能因为某些原因(逻辑处理不对在5秒内没有处理完成,或者异常)造成重发消息,
那么有什么好的算法能快速排重呢

集思广益,tks

删除xml中的空节点

在Request中,struct默认所有的属性都会加上,能否加入,omitempty,删除空节点

signature is empty

偶尔会出现这个消息 signature is empty, 然后微信提示 "该公众号暂无法提供服务, 请稍后重试" 我再发一遍, 服务器就收到正常消息了, AES加密的, 就好了, 没机会重现,这个是什么原因??

security 包不存包

/Web/go/src/github.com/chanxuehong/wechat/mp/serve_http.go:21:2: cannot find package "github.com/chanxuehong/util/security" in any of:
/usr/local/Cellar/go/1.5.1/libexec/src/github.com/chanxuehong/util/security (from $GOROOT)
/Web/go/src/github.com/chanxuehong/util/security (from $GOPATH)

项目中有多处使用该包

go get 直接报错啊

go get -u -v github.com/chanxuehong/wechat.v2
github.com/chanxuehong/wechat.v2 (download)
package github.com/chanxuehong/wechat.v2: no buildable Go source files in /home/defned/.gvm/pkgsets/go1.8.3/global/src/github.com/chanxuehong/wechat.v2

client不能指定access_token

我已经获取了access_token并保存在数据库中,但是当我想建立新的Client实例的时候,只能通过:
NewClient 和 NewClientEx 来创建,但是我别的程序不知道这个appid和secret是多少,而使用Ex有需要构建一个tokenCache的类,能不能暴露一个新的函数:
NewClientFromToken(accessToken string)的方式,传入accessToken就直接创建?

判断微信版本号有bug

util.WXVersion()

不是有效的微信浏览器 user-agent, Mozilla/5.0 (Linux; Android 4.4.4; Che1-CL10 Build/Che1-CL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043128 Safari/537.36 MicroMessenger/6.5.7.1041 NetType/WIFI Language/zh_CN

一处小bug

wechat/mp/message/custom/msg.go
第30行
KfAccount string json:"kfaccount"
根据微信开发文档此处应为
KfAccount string json:"kf_account"

修改后微信客户端可正常显示客服头像及昵称

沙箱测试

这个包不支持沙箱测试么,怎么修改api地址

oauth2.AuthCodeURL生成的url会导致网页授权回调两次

llog:

2018-03-23 16:12:17	handler/weixin.go:67	/service/weixin/mp?code=071AdBVI1ZHOd509MKUI1jwjVI1AdBVV&state=385a5e02f501f8190cb5de69fe0d4d0c
2018-03-23 16:12:17	handler/weixin.go:67	/service/weixin/mp?code=001tbrPg2GWJYH07NrNg2oxqPg2tbrPQ&state=385a5e02f501f8190cb5de69fe0d4d0c

两次回调的code不同,但state相同.

解决方法
生成url时添加connect_redirect=1:

func AuthCodeURL(appId, redirectURI, scope, state string) string {
	return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + url.QueryEscape(appId) +
		"&redirect_uri=" + url.QueryEscape(redirectURI) +
		"&response_type=code&scope=" + url.QueryEscape(scope) +
		"&state=" + url.QueryEscape(state) +
		"&connect_redirect=1#wechat_redirect"
}

调用 demo

package main

import (
"log"
"net/http"

"github.com/chanxuehong/wechat.v2/mp/core"
"github.com/chanxuehong/wechat.v2/mp/menu"
"github.com/chanxuehong/wechat.v2/mp/message/callback/request"
"github.com/chanxuehong/wechat.v2/mp/message/callback/response"
"fmt"

)

const (
//看看的内容
wxAppId = " "
wxAppSecret = " "

wxOriId         = " "
wxToken         = " "
wxEncodedAESKey = " "

)

var (
// 下面两个变量不一定非要作为全局变量, 根据自己的场景来选择.
msgHandler core.Handler
msgServer *core.Server

accessTokenServer core.AccessTokenServer = core.NewDefaultAccessTokenServer(wxAppId, wxAppSecret, nil)
wechatClient      *core.Client           = core.NewClient(accessTokenServer, nil)

)

func init() {
//不知道为什么必须放到初始化当中,在 main 上不行
//创建菜单
var subButtons = make([]menu.Button, 2)
subButtons[0].SetAsViewButton("搜索", "http://www.soso.com/")
subButtons[1].SetAsClickButton("赞一下我们", "V1001_GOOD")

var mn menu.Menu
mn.Buttons = make([]menu.Button, 3)
mn.Buttons[0].SetAsScanCodePushButton("测试汤中", "rselfmenu_0_0")
mn.Buttons[1].SetAsViewButton("视频", "http://v.qq.com/")
mn.Buttons[2].SetAsSubMenuButton("子菜单", subButtons)

if err := menu.Create(wechatClient, &mn); err != nil {
	fmt.Println(err)
	return
}
fmt.Println("ok")

mux := core.NewServeMux()
mux.DefaultMsgHandleFunc(defaultMsgHandler)
mux.DefaultEventHandleFunc(defaultEventHandler)

mux.MsgHandleFunc(request.MsgTypeText, textMsgHandler)
mux.EventHandleFunc(menu.EventTypeClick, menuClickEventHandler)

msgHandler = mux
msgServer = core.NewServer(wxOriId, wxAppId, wxToken, wxEncodedAESKey, msgHandler, nil)

http.HandleFunc("/weixin", wxCallbackHandler)

}

func textMsgHandler(ctx *core.Context) {
fmt.Println("收到文本消息:\n%s\n", string(ctx.MsgPlaintext))

msg := request.GetText(ctx.MixedMsg)
resp := response.NewText(msg.FromUserName, msg.ToUserName, msg.CreateTime, msg.Content)
ctx.RawResponse(resp) // 明文回复
//ctx.AESResponse(resp, 0, "", nil) // aes密文回复

fmt.Println("老子拿到了你的消息",msg.Content)

}

func defaultMsgHandler(ctx *core.Context) {
fmt.Println("收到消息:\n%s\n", string(ctx.MsgPlaintext))
ctx.NoneResponse()
}

func menuClickEventHandler(ctx *core.Context) {
fmt.Println("收到菜单 click 事件:\n%s\n", string(ctx.MsgPlaintext))

event := menu.GetClickEvent(ctx.MixedMsg)
resp := response.NewText(event.FromUserName, event.ToUserName, event.CreateTime, "收到 click 类型的事件")
ctx.RawResponse(resp) // 明文回复
//ctx.AESResponse(resp, 0, "", nil) // aes密文回复

}

func defaultEventHandler(ctx *core.Context) {
fmt.Println("收到事件:\n%s\n", string(ctx.MsgPlaintext))
ctx.NoneResponse()
}

// wxCallbackHandler 是处理回调请求的 http handler.
// 1. 不同的 web 框架有不同的实现
// 2. 一般一个 handler 处理一个公众号的回调请求(当然也可以处理多个, 这里我只处理一个)
func wxCallbackHandler(w http.ResponseWriter, r *http.Request) {
fmt.Printf("老子信了你的邪")

msgServer.ServeHTTP(w, r, nil)
fmt.Printf("老子信了你的邪2")

}

func main() {
log.Println(http.ListenAndServe(":3080", nil))
}

wechat pay sign error

i have checked with wechat's tool , same as my sign info , but it still return "签名错误" when i use your lib to queryOrder , is there any solutions?

一个平台有多个商家公众号

  1. 一个平台有多个商家公众号,不知道wechat SDK是否支持呢,看demo只能配置一个appId, secret
  2. 如果使用的是微信开放平台授权的,调用接口API能直接使用吗

mp->datacube->client_article.go->UserReadData

貌似少了一个user_source
{list:[
{
"ref_date": "2015-01-13",
"user_source": 4,
"int_page_read_user": 88,
"int_page_read_count": 294,
"ori_page_read_user": 0,
"ori_page_read_count": 0,
"share_user": 0,
"share_count": 0,
"add_to_fav_user": 0,
"add_to_fav_count": 0
},...
]}

support for 企业微信

Documentation says there is support for 企业微信 but it doesnt seem to be present in wechat.v2. My ability to read chinese is pretty limited however, so perhaps I am missing something.

测试友好

现在在搞支付,要用到pay相关部份,现在的代码不太方便测试,发请求都用了具体类型core.Client,而且url也写死在代码里, 没办法mock一个,如果是接口就好,总不能测试就去请求微信那边吧

access_token相关的问题

请教一个问题,大神关于access_token是如何管理的,每次向微信发出请求还是本地缓存还是其他分布式的做法?

为什么注释说整个系统只能存在一个 DefaultAccessTokenServer 实例?

每个AccessTokenServer都只能适用于一个Corp,实际场景是一个微信应用需要服务很多企业,不太明白为什么作者在注释中反复强调整个系统只能存在一个 DefaultAccessTokenServer 实例?

type DefaultAccessTokenServer struct {
corpId string
corpSecret string
httpClient *http.Client

resetTickerChan chan time.Duration // 用于重置 tokenDaemon 里的 ticker

tokenGet struct {
	sync.Mutex
	LastTokenInfo accessTokenInfo // 最后一次成功从微信服务器获取的 access_token 信息
	LastTimestamp int64           // 最后一次成功从微信服务器获取 access_token 的时间戳
}

tokenCache struct {
	sync.RWMutex
	Token string
}

}

mp/media/ 中news上传方法已经被微信删除了

参考微信素材管理功能的文档:http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html

当前代码中这一部分在文档中已经被移除,还没有测试老的接口是否可以使用,如果不可以使用了,老的上传news的代码需要移除了:https://github.com/chanxuehong/wechat/blob/master/mp/media/media.go#L26
新的逻辑中只有多媒体素材作为临时素材上传的描述;

可以保留老的代码,但是需要说明一下使用的时候需要注意;

希望能保留master分支

好几个项目使用了持续构建
go get -v -x命令安装依赖,现在报错如下

git clone https://github.com/chanxuehong/wechat /go/src/github.com/chanxuehong/wechat
cd /go/src/github.com/chanxuehong/wechat
git show-ref
cd /go/src/github.com/chanxuehong/wechat
git checkout master
# cd /go/src/github.com/chanxuehong/wechat; git checkout master
error: pathspec 'master' did not match any file(s) known to git.
package github.com/chanxuehong/wechat/mp: exit status 1
github.com/gorilla/websocket (download)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.