Skip to content
/ wx Public

wechat weixin sdk,支持微信应用和商户。在概念清晰的基础上追求更少的编码、更开放、灵活的结构和更低的学习曲线!极致、简单!不创造新理念、不创造新架构!

License

Notifications You must be signed in to change notification settings

blusewang/wx

Repository files navigation

wechat

wechat weixin sdk,支持微信应用和商户。

设计目标

在概念清晰的基础上追求更少的编码、更开放、灵活的结构。

本库不是在微信官方API基础上进一步封装,造出一个新的框架级的重体量SDK。而是努力成为微信官方文档的Golang版快速工具箱。

努力让开发者在学习微信官方文档后,不再有新的学习曲线(另学一套)!

所以本库目标是:极致、简单!不创另行发明新理念、不另行创造新架构!

概述

根据微信的文档,微信的业务有两个不同的领域:

  • 应用类账号下的Api
  • 商户类账号下的Api

遵守高内聚,低耦合的设计哲学。

所有同类型的请求,都能复用,封装聚合。其它零散的功能都封装成独立函数,按需调用。

所有的接口、请求数据、请求结果数据,都是开放的;可以使用我提供的数据,也能自行设计。

安装

go get github.com/blusewang/wx

应用账号API

订阅号服务号小程序App

  • 支持连接不同的地区的微信服务器
  • 支持一行代码从被动消息的 http.Request 中安全取出消息成MessageData。内部实现了识别并解密消息、校验请求的Query数据。
  • 支持自动填充Query中的access_token数据。
  • 链式调用,让不同需求的业务能一气和成!

时效性凭证安置方式约定

access_tokenjs_sdk_ticket 这类需要每7200秒刷新一次的,放到crontab中。

对此不满的,完全可以在使用本库的基础上,采用自己熟悉的方式、甚至自己设计方案来替代crontab

程序设计

对象设计

一个基础账号对象MpAccount,它有三个行为:

  • 为微信H5的网址签名 UrlSign(url string)
  • 读取被动消息通知 ReadMessage(req *http.Request)
  • 主动发出请求 NewMpReq(path mp_api.MpApi) *mpReq

数据设计

说明

只实现了很有限的数据。若需要使用本库自带的数据结构之外的API。完全可以参考本库的数据结构写法,自行另起书写(注意不同业务的tag名称不同)。 并能得到一样的兼容体验!

举例

	a := wx.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)
	}

商户账号API(V2版)

App、JSAPI、小程序下单 分账 付款至微信零钱 付款至个人银行卡 发红包

  • 自动填充基础信息
  • 自动签名
  • 私有证书HTTP客户端自动缓存
  • 支持MD5HMAC-SHA256加密
  • 支持付款至银行卡时,隐私信息加密

程序设计

对象设计

一个基础账号对象MchAccount,它有以下适用于V2的行为:

  • 创建请求 NewMchReq(url string)
  • 将订单签名给App OrderSign4App(or mch_api.PayUnifiedOrderRes)
  • 将订单签名给于H5、小程序 OrderSign(or mch_api.PayUnifiedOrderRes)
  • 验证支付成功通知 PayNotify(pn mch_api.PayNotify)
  • 付款至银行卡时,隐私信息项加密 RsaEncrypt(plain string)

数据设计

说明

只实现了很有限的数据。若需要使用本库自带的数据结构之外的API。完全可以参考本库的数据结构写法,自行另起书写(建议参考structs.go中的方式书写)。 能得到一样的兼容体验!

举例

    mch := wx.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)

商户账号API(V3版)(含服务商)

App、JSAPI、小程序等支付 分账 付款至微信零钱 付款至个人银行卡 服务商系列接口

  • 支持付款至银行卡时,隐私信息加密
  • 自动签名
  • 自动下载微信支付官方证书

程序设计

对象设计

一个基础账号对象MchAccount,它有以下适用于V3的行为:

  • 创建请求 NewMchReqV3(api mch_api_v3.MchApiV3)
  • 获取微信支付官方证书 LoadV3Cert()
  • AEAD_AES_256_GCM 解密 DecryptAES256GCM(nonce, associatedData, ciphertext string)
  • V3版通用签名 SignBaseV3(message string)

数据设计

说明

如果程序长时间运行,需要给DownloadV3Cert()做一个定时更新的任务。按自己的需求自行实现。 如果不实现,DownloadV3Cert()只会在第一次操作V3接口时获取一次。

举例

    mch := wx.MchAccount{}

	var res mch_api_v3.JsApiTransactionResp
	err = mch.NewMchReqV3(mch_api_v3.JsApiTransaction).Send(&mch_api_v3.JsApiTransactionReq{
		AppId:       constant.WxAppMember,
		MchId:       mch.MchId,
		Description: "this is a description",
		OutTradeNo:  wx.NewRandStr(22),
		NotifyUrl:   "https://yourdomain.name/notify/url",
		Amount:      mch_api_v3.Amount{Total: 100},
		Payer:       mch_api_v3.Payer{OpenId: "oEG8Ss_yCRB315jjLfdTRK-QicdY"},
	}).Bind(&res).Do(http.MethodPost)
	if err != nil {
		t.Fatal(err)
	}
	log.Println(res)

API Hook,同时支持两个类型的所有API

RegisterHook(hook func(req *http.Request, reqBody []byte, res *http.Response, err error)) 将每一次网络交互过程都开放出来,以便做自定义日志。

为微信业务数据提供的额外工具方法

  • NewRandStr 生成符合微信要求随机字符
  • LimitString 限制长度,并将微信不支持的字符替换成'x',能满足公众号App的字符要求
  • SafeString 安全地限制长度,并将微信不支持的字符替换成'x',能满足商户平台的字符要求

About

wechat weixin sdk,支持微信应用和商户。在概念清晰的基础上追求更少的编码、更开放、灵活的结构和更低的学习曲线!极致、简单!不创造新理念、不创造新架构!

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages