当前位置: 首页 > 工具软件 > beego_weixin > 使用案例 >

beego(golang)创建一个微信小程序backend服务器。

公孙宸
2023-12-01

这里尽量简单化一点。包含一个获取openid的功能。以及保存用户信息到数据库的功能。
技术点的话就是数据库,参数校验,以及第三方接口调用。
只有简单的两个文件。若是有bug,大家多切磋。
这里有一个问题。如果是设置json,把这个结构体的属性转成小写开头。从前端向后端传递属性的时候,ParseForm还是需要大写。不知道有没有一种办法,可以全部使用小写开头?


package  models
import (
	"fmt"
    "github.com/astaxie/beego/orm"   
     _ "github.com/go-sql-driver/mysql"
	"github.com/astaxie/beego"
    // "github.com/astaxie/beego/orm"   
    "time"

)

var (
	mysqluser=beego.AppConfig.String("mysqluser")
	mysqlpass=beego.AppConfig.String("mysqlpass")
	mysqlurls=beego.AppConfig.String("mysqlurls")
	mysqldb=beego.AppConfig.String("mysqldb")
)
type Param  map[string]interface{}
type StringParam  map[string]string

type Resp struct{
	Code int //`json:"code"//`
	Msg string //`json:"msg"//`
	Data interface{} //`json:"data"//`//map[string]interface{}
}
type Customer struct{//如果需要json化的时候转成小写可以这样写。 `orm:"auto;pk"  json:"id"`中间用空格分开。
	Id int `orm:"auto;pk" `//json:"id"`
	AliasName string  `orm:"null" `//json:"aliasName"`
	UnionId string  `orm:"null" `//json:"unionId"`
	OpenId  string  `orm:"unique" `//json:"openId"`
	Phone string  `orm:"unique;null" `//json:"phone"`
	Money float32	  `orm:"default(0)" `//json:"money"`
	CarLicence string  `orm:"null" `//json:"carLicence"`
}

func init() {
    // orm.RegisterDriver("mysql", orm.DR_MySQL)
	orm.DefaultTimeLoc = time.Local 
    orm.RegisterDataBase("default", "mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",mysqluser,mysqlpass,mysqlurls,mysqldb), 30)
    orm.RegisterModel(new(Customer))
    beego.Info("orm模块初始化完成。")

}

// weixinCtrl
package  controllers
/**

设置代理。
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=on   # 必须是小写on
下载好了这个资源包。就需要把这个模块关掉
设置off。
go env -w GO111MODULE=off
//自动路由的时候用纯小写来访问。/weixinminiprogram/get
*/

import (
	"fmt"
	"github.com/astaxie/beego"
	// "net/http"
	// "encoding/xml"
	"weixin_public_plateform/models"
	// "strings"
	// "time"
	// "reflect"
	// // "github.com/astaxie/beego/context"
	// "regexp"
	"github.com/astaxie/beego/validation"
	"github.com/astaxie/beego/httplib"
    "github.com/astaxie/beego/orm"   
    "strconv"
)
var (	
	weixinminiprogramappid=beego.AppConfig.String("weixinminiprogramappid")
	weixinminiprogramappsecret=beego.AppConfig.String("weixinminiprogramappsecret")
	jscode2sessionUrl="https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
	valid = validation.Validation{}
    o = orm.NewOrm()
)
func CheckValid(valid *validation.Validation,c interface{}) bool{
	var msg string
	 if valid.HasErrors() {
        // 如果有错误信息,证明验证没通过
        // 打印错误信息
        // for _, err := range valid.Errors {
        //     beego.Error("参数校验未能通过。",err.Key, err.Message)
        // }
        err:=valid.Errors[0]
    	msg= fmt.Sprintf("参数校验未能通过。%s:%s",err.Key, err.Message)
    }else{
    	msg =""
    }
    //要进行复用,必须在每次验证之后进行清除。要注意,为了清除,必须传指针。
    valid.Clear()
    if msg!=""{
		c.(*beego.Controller).Data["json"]=models.Resp{500,msg,nil}
		c.(*beego.Controller).ServeJSON()
		// (*beego.Controller)(c).Data["json"]=models.Resp{500,msg,nil}
		// (*beego.Controller)(c).ServeJSON()
		panic(msg)//通过这个来阻断函数的执行,不需要再处理返回值了。
		return false
	}
	return true

}
type WeixinMiniprogramController struct {
	beego.Controller
}

func (c *WeixinMiniprogramController) Get() {
	//参考文档。https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
	//GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
	js_code:=c.GetString("js_code")
	valid.Required(js_code,"js_code")
	CheckValid(&valid,(*beego.Controller)(&c.Controller))
	// if !chk {
	// 	return
	// }
	// beego.Error("错误信息。是否有阻断?",chk)
	var result map[string]interface{}
	httplib.Get(fmt.Sprintf(jscode2sessionUrl,weixinminiprogramappid,weixinminiprogramappsecret,js_code)).ToJSON(&result)
	beego.Info("jscode2session返回结果。",result)
	c.Data["json"]=&models.Resp{Data:result}	//这里需要注意。返回结果是设置到c.Data["json"]而不是c.Data。
	if result["errcode"].(float64)==0{
		// cu := models.Customer{}
		// cu.
		// o.Insert()
		c.Data["json"].(*models.Resp).Code=200
	}else{
		c.Data["json"].(*models.Resp).Code=500
		// c.Data["json"].(map[string]interface{})["add"]= map[string]interface{}{
		// 	"msg":"出现错误。",
		// }
	}
	c.ServeJSON()
}
type CustomerController struct {
	beego.Controller
}

func (c *CustomerController) Prepare(){
	beego.Debug("请求参数为:",c.Input())
	beego.Debug("请求体为:",c.Ctx.Input.RequestBody)
}
func (c *CustomerController) Get() {
	id:= c.GetString("id")
	openId:= c.GetString("openId")
	valid.Required(id+ openId,"id或openId")
	CheckValid(&valid,(*beego.Controller)(&c.Controller))
	u := models.Customer{}
	if id!=""{
		v,_:=strconv.Atoi(id)
		u.Id=v
		o.Read(&u)
	}else{
		o.QueryTable("customer").Filter("openId",openId).One(&u)
	}
	c.Data["json"]= models.Resp{200,"",u}
	c.ServeJSON()
}
func (c *CustomerController) Post() {//上传的参数首字母需要是大写的。否则执行ParseForm之后是空。
	u := models.Customer{}
    if err := c.ParseForm(&u); err != nil {
        //handle error
        beego.Error("参数错误。",u)
    }    
    // qs:=o.QueryTable(u)
    // for k,v:= range u{}
    // for f:=range reflect.ValueOf(&t).Elem()
    // .Filter()
    //首先进行查询openId,如果已经存在就进行更新,如果不存在就成了。
    var (id int64 
    	err error
	)
    if u.Id==0{
	    id, err =o.Insert(&u)
	}else{
	    id, err =o.Update(&u)		
	}
    beego.Debug("插入客户信息。",u,id, err )//o.Insert(u))
    c.Data["json"]=&models.Resp{Data:err}
    if err==nil{
    	c.Data["json"].(*models.Resp).Code=200
	}else{
		c.Data["json"].(*models.Resp).Code=500
	}
	c.ServeJSON()
}
 类似资料: