针对golang
设计的微信 Api 接口,涵盖公众号、小程序、App、商户。 支持下单、notify 验证、公对私打款至银行卡等
根据微信的业务特征,分为两部分:
go get github.com/blusewang/wxApi-go
订阅号
、服务号
、小程序
、App
MessageData
。内部实现了识别并解密消息、校验请求的Query
数据。Query
中的access_token
数据。access_token
、js_sdk_ticket
这类需要每7200秒刷新一次的,放到crontab
中。
一个基础账号对象MpAccount
,它有三个行为:
UrlSign(url string)
ReadMessage(req *http.Request)
NewMpReq(path mp_api.MpApi) *mpReq
只实现了很有限的数据。若需要使用本库自带的数据结构之外的API。完全可以参考本库的数据结构写法,自行另起书写(注意不同业务的tag名称不同)。 并能得到一样的兼容体验!
a := MpAccount{ AppId: "your_app_id", AccessToken: "38_XtyPcVUODHd8q3TNYPVGAZ2WNRx_nW4gnclObbv78tsEa1Y_bwdkLALDMEb4372wYqcC_CanjU9O0Zw4MqHiqxrIukk_G4ElAUxyv_ASOb0V2y8647cbxbYU-G8CbtnPdLNub8NrqtUVrSTnWAPaAGALPE", // ... ServerHost: mp_api.ServerHostShangHai, // 选择离自己最近的服务主机 } // 一个简单的只带access_token的GET API var list mp_api.MessageCustomServiceKfListRes if err := a.NewMpReq(mp_api.MessageCustomServiceKfList).Bind(&list).Do(); err != nil { t.Error(err) } log.Println(list) // 一个POST API var rs mp_api.AccountShortUrlRes err = a.NewMpReq(mp_api.AccountShortUrl).SendData(mp_api.AccountShortUrlData{ Action: mp_api.ShortUrlAction, LongUrl: "https://developers.weixin.qq.com/doc/offiaccount/Account_Management/URL_Shortener.html", }).Bind(&rs).Do() if err != nil { t.Error(err) } log.Println(rs) // 一个上传媒体文件的API err = a.NewMpReq(mp_api.MessageCustomServiceKfAccountUploadHeadImg).Query(mp_api.MessageCustomServiceKfAccountUploadHeadImgQuery{ KfAccount: "1@1", }).Upload(resp.Body, "png") if err != nil { t.Error(err) }
App、JSAPI、小程序下单
分账
付款至微信零钱
付款至个人银行卡
发红包
MD5
、HMAC-SHA256
加密一个基础账号对象MchAccount
,它有以下行为:
NewMchReq(url string)
OrderSign4App(or mch_api.PayUnifiedOrderRes)
OrderSign(or mch_api.PayUnifiedOrderRes)
PayNotify(pn mch_api.PayNotify)
RsaEncrypt(plain string)
只实现了很有限的数据。若需要使用本库自带的数据结构之外的API。完全可以参考本库的数据结构写法,自行另起书写(建议参考structs.go中的方式书写)。 能得到一样的兼容体验!
mch := MchAccount{} var data mch_api.PayProfitSharingRes var body = mch_api.PayProfitSharingData{ TransactionId: "4200000531202004307536721907", OutOrderNo: "TSF_216144_1065_ye7DvHdSed", } _ = body.SerReceivers([]mch_api.PayProfitSharingReceiver{ { Type: "", Account: "", Amount: 10, Description: "", }, }) err := mch.NewMchReq(mch_api.PayProfitSharing). Send(&body). // 注意:发送的数据需传指针,以便自动填充基础信息和签名 UseHMacSign(). // 指定使用HMAC-SHA256 UsePrivateCert(). // 指定使用私有证书通信 Bind(&data).Do() // 传指针 log.Println(err) log.Println(data)
NewRandStr
生成符合微信要求随机字符LimitString
限制长度,并将微信不支持的字符替换成'x',能满足公众号App的字符要求SafeString
安全地限制长度,并将微信不支持的字符替换成'x',能满足商户平台的字符要求代码: func HttpBuildQuery(params map[string]string) (param_str string) { params_arr := make([]string, 0, len(params)) for k, v := range params { params_arr = append(params_arr, fmt.Sprintf("%s=%s", k, v
这小节我们将要介绍如何定义变量、常量、Go内置类型以及Go程序设计中的一些技巧。 定义变量 Go语言里面定义变量有多种方式。 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型放在变量名后面: //定义一个名称为“variableName”,类型为"type"的变量 var variableName type 定义多个变量 //定义三个类型都是“type”的变量 var
我们有的时候希望Go在未来的某个时刻执行或者是以一定的时间间隔重复执行。Go内置的timer和ticker功能使得这些任务变得简单了。我们先看看timer的功能,下一节再看看ticker的功能。 package main import "time" import "fmt" func main() { // Timer 代表了未来的一个事件,你告诉timer需要等待多久,然后 //
有的时候我们希望Go能够智能地处理Unix信号。例如我们希望一个server接收到一个SIGTERM的信号时,能够自动地停止;或者一个命令行工具接收到一个SIGINT信号时,能够停止接收输入。现在我们来看下如何使用channel来处理信号。 package main import "fmt" import "os" import "os/signal" import "syscall" func
本文向大家介绍Go 基本循环,包括了Go 基本循环的使用技巧和注意事项,需要的朋友参考一下 示例 for 是go中唯一的循环语句,因此基本的循环实现可能如下所示:
Go是一门类似C的编译型语言,但是它的编译速度非常快。这门语言的关键字总共也就二十五个,比英文字母还少一个,这对于我们的学习来说就简单了很多。先让我们看一眼这些关键字都长什么样: break default func interface select case defer go map struct chan e
什么是 Go 语言 Go 语言 Golang 是 Google 公司 2009 年推出的一门 高级编程言语,目的是为了解决: 现有主流编程语言 明显落后于硬件发展速度的问题 不能合理利用多核CPU的优势提升软件系统性能的问题 软件复杂度越来越高, 维护成本也越来越高的问题 企业开发中不得不在快速开发和性能之间艰难抉择的问题 科普小知识 1. 静态语言 1.1 一般都需要通过编译器(compiler