package wxapi
import (
"crypto/sha1"
"encoding/json"
"encoding/xml"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"sort"
"strings"
"bytes"
"github.com/gin-gonic/gin"
"github.com/tidwall/gjson"
)
var (
// APPID 公众号后台分配的APPID
APPID = "xxxxxxxxx"
// APPSECRET 公众号后台分配的APPSECRET
APPSECRET = "xxxxxxxxxxxxxx"
)
type token struct {
AccessToken string `json:"access_token"`
ExpiresIn int `json:"expires_in"`
}
// WxReceiveCommonMsg 接收普通消息
type WxReceiveCommonMsg struct {
ToUserName string //接收者 开发者 微信号
FromUserName string //发送者 发送方帐号(一个OpenID)
Content string //文本内容
CreateTime int64 //创建时间
MsgType string //消息类型
MsgId int64 //消息id
PicUrl string //图片url
MediaId string //媒体id
Event string //事件类型,VIEW
EventKey string //事件KEY值,设置的跳转URL
MenuId string
Format string
Recognition string
ThumbMediaId string //缩略图媒体ID
}
type WxCustomText struct{
Content string `json:"content"`
}
type WxCustomTextMsg struct{
ToUser string `json:"touser"`
MsgType string `json:"msgtype"`
Text WxCustomText `json:"text"`
}
func (msg *WxCustomTextMsg) ToJson() []byte {
body, err := json.Marshal(msg)
if err != nil {
panic(err)
}
return body
}
// WxReceiveFunc (接收到消息之后,会将消息交于这个函数处理)
var WxReceiveFunc func(msg WxReceiveCommonMsg) error
// WxMakeSign 计算签名
func WxMakeSign(token, timestamp, nonce string) string {
strs := []string{token, timestamp, nonce}
sort.Strings(strs)
sha := sha1.New()
io.WriteString(sha, strings.Join(strs, ""))
return fmt.Sprintf("%x", sha.Sum(nil))
}
// HandleWxLogin首次接入,成为开发者
func HandleWxLogin(c *gin.Context) {
fmt.Printf("==>HandleWxLogin\n")
echostr := c.DefaultQuery("echostr", "")
if echostr != "" {
fmt.Printf("==>echostr:%s\n", echostr)
c.String(200, "%s", echostr)
return
}
}
// WxGetAccessToken 获取微信accesstoken
func WxGetAccessToken() string {
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%v&secret=%v", APPID, APPSECRET)
resp, err := http.Get(url)
if err != nil {
fmt.Println("获取微信token失败", err)
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("微信token读取失败", err)
return ""
}
token := token{}
err = json.Unmarshal(body, &token)
if err != nil {
fmt.Println("微信token解析json失败", err)
return ""
}
return token.AccessToken
}
// WxGetUserList 获取关注者列表
func WxGetUserList(accessToken string) []gjson.Result {
url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken + "&next_openid="
resp, err := http.Get(url)
if err != nil {
fmt.Println("获取关注列表失败", err)
return nil
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取内容失败", err)
return nil
}
flist := gjson.Get(string(body), "data.openid").Array()
return flist
}
// WxPostTemplate 发送模板消息
func WxPostTemplate(accessToken string, reqdata string, fxurl string, templateid string, openid string) {
url := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
reqbody := "{\"touser\":\"" + openid + "\", \"template_id\":\"" + templateid + "\", \"url\":\"" + fxurl + "\", \"data\": " + reqdata + "}"
fmt.Printf("WxPostTemplate:%#v\n", reqbody)
resp, err := http.Post(url,
"application/x-www-form-urlencoded",
strings.NewReader(string(reqbody)))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
// 客服回复接口
func WxPostCustomTextMsg(accessToken string, touser string, content string) {
url := "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken
req:=&WxCustomTextMsg{ToUser:touser,MsgType:"text",Text:WxCustomText{Content:content}}
jsonStr := req.ToJson()
//fmt.Printf("WxPostCustomTextMsg:%#v\n", jsonStr)
request ,_:= http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
request.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
// ReceiveCommonMsg
func ReceiveCommonMsg(msgData []byte) (WxReceiveCommonMsg, error) {
fmt.Printf("received weixin msgData:\n%s\n", msgData)
msg := WxReceiveCommonMsg{}
err := xml.Unmarshal(msgData, &msg)
if WxReceiveFunc == nil {
return msg, err
}
err = WxReceiveFunc(msg)
return msg, err
}
// HandleWxPostRecv 处理微信公众号前端发起的消息事件
func HandleWxPostRecv(c *gin.Context) {
fmt.Printf("==>HandleWxPostRecv Enter\n")
data, err := c.GetRawData()
if err != nil {
log.Fatalln(err)
}
ReceiveCommonMsg(data)
}
// WxCreateMenu 创建菜单
func WxCreateMenu(accessToken, menustr string) (string, error) {
url := "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken
fmt.Printf("WxCreateMenu:%s\n", menustr)
resp, err := http.Post(url,
"application/x-www-form-urlencoded",
strings.NewReader(menustr))
if err != nil {
fmt.Println(err)
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return "", err
}
fmt.Println(string(body))
return string(body), nil
}
// WxDelMenu 删除菜单
func WxDelMenu(accessToken string) (string, error) {
url := "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + accessToken
resp, err := http.Get(url)
if err != nil {
fmt.Println("删除菜单失败", err)
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取内容失败", err)
return "", err
}
fmt.Println(string(body))
return string(body), nil
}
// WxGetUserInfo 根据用户openid获取基本信息
func WxGetUserInfo(accessToken, openid string) (string, error) {
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN", accessToken, openid)
resp, err := http.Get(url)
if err != nil {
fmt.Println("获取信息失败", err)
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取内容失败", err)
return "", err
}
fmt.Println(string(body))
return string(body), nil
}
func init() {
}
没有合适的资源?快使用搜索试试~ 我知道了~
openAI接入微信公众号后台源码(golang版本)
共14个文件
go:11个
sum:1个
mod:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 9 下载量 173 浏览量
2023-02-13
18:41:43
上传
评论 19
收藏 5.83MB ZIP 举报
温馨提示
(注:非原生的chatGPT,原生chatGPT是不允许的,使用的openAI的接口) chatGPT和openAI的text-davinci-003模型区别,博文中有介绍。 openAI接入微信公众号后台源码,可运行。 配合公众号,可实现在公众号聊天窗口发消息,收到AI的回答。 无超时和使用次数限制。 只需修改下个人的api-key和公众号key 测试和使用效果参照博客,绝对可行: https://blog.csdn.net/yyz_1987/article/details/128946637?spm=1001.2014.3001.5502
资源推荐
资源详情
资源评论
收起资源包目录
weixin2.zip (14个子文件)
weixin2
go.mod 266B
go.sum 7KB
main2 11.47MB
main2.go 3KB
wxapi
wxapi.go 7KB
convert
textMsg.go 690B
chatReq.go 1KB
chatRes.go 643B
textRes.go 590B
apis
everysay.go 2KB
weather.go 2KB
exponent.go 4KB
chatapi
chatgpt.go 839B
util
conv.go 1KB
共 14 条
- 1
特立独行的猫a
- 粉丝: 9w+
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页