Browse Source

添加微信支付接口和公共类

huangrf 6 years ago
parent
commit
3c01980e39

+ 2 - 0
controllers/gen/ApiController_gen.go

@@ -4,7 +4,9 @@ package gen
 import (
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 

+ 2 - 0
controllers/gen/CaptchaController_gen.go

@@ -4,7 +4,9 @@ package gen
 import (
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 

+ 2 - 0
controllers/gen/SsoController_gen.go

@@ -4,7 +4,9 @@ package gen
 import (
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 

+ 43 - 37
controllers/gen/SysAppController_gen.go

@@ -1,10 +1,13 @@
+
 package gen
 
 import (
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 
 // SysAppController operations for SysApp
@@ -17,167 +20,170 @@ func NewSysAppController(e *engine.ApiEngine) *SysAppController {
 	return controller
 }
 
+
+
 // AddAppFun
 // @Title AddAppFun
-// @Description 添加APP功能
-// @Param	    string  false  "功能"
+// @Description 添加APP功能         
+// @Param	    string  false  "功能"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /add_app_fun  [post,get,put]
 func (c *SysAppController) AddAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_AddAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // DelAppFun
 // @Title DelAppFun
-// @Description 删除app功能
-// @Param	id    string  false  "APP功能ID"
+// @Description 删除app功能         
+// @Param	id    string  false  "APP功能ID"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /del_app_fun  [post,get,put]
 func (c *SysAppController) DelAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_DelAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // UpdateAppFun
 // @Title UpdateAppFun
-// @Description 更新APP功能
-// @Param	    string  false  "功能"
+// @Description 更新APP功能         
+// @Param	    string  false  "功能"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /update_app_fun  [post,get,put]
 func (c *SysAppController) UpdateAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_UpdateAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // FindAppFunPage
 // @Title FindAppFunPage
-// @Description 分页获取APP功能
+// @Description 分页获取APP功能         
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /find_app_fun_page  [get,post]
 func (c *SysAppController) FindAppFunPage(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_FindAppFunPage(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // GetAppFunTree
 // @Title GetAppFunTree
-// @Description 获取APP功能树
+// @Description 获取APP功能树         
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /get_app_fun_tree  [get,post]
 func (c *SysAppController) GetAppFunTree(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_GetAppFunTree(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // AddRoleAppFun
 // @Title AddRoleAppFun
-// @Description 添加角色APP功能
-// @Param	    string  false  "功能"
+// @Description 添加角色APP功能         
+// @Param	    string  false  "功能"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /add_role_app_fun  [post,get,put]
 func (c *SysAppController) AddRoleAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_AddRoleAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // DelRoleAppFun
 // @Title DelRoleAppFun
-// @Description 删除角色APP功能
-// @Param	id    string  false  "APP功能ID"
+// @Description 删除角色APP功能         
+// @Param	id    string  false  "APP功能ID"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /del_role_app_fun  [post,get,put]
 func (c *SysAppController) DelRoleAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_DelRoleAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // UpdateRoleAppFun
 // @Title UpdateRoleAppFun
-// @Description 更新角色APP功能
-// @Param	    string  false  "功能"
+// @Description 更新角色APP功能         
+// @Param	    string  false  "功能"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /update_role_app_fun  [post,get,put]
 func (c *SysAppController) UpdateRoleAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_UpdateRoleAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // GetRoleAppFun
 // @Title GetRoleAppFun
-// @Description 获取角色APP功能
-// @Param	role_id    string  false  "角色id"
+// @Description 获取角色APP功能         
+// @Param	role_id    string  false  "角色id"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /get_role_app_fun  [get]
 func (c *SysAppController) GetRoleAppFun(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_GetRoleAppFun(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // FindRoleAppFunPage
 // @Title FindRoleAppFunPage
-// @Description 分页获取角色APP功能
+// @Description 分页获取角色APP功能         
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /find_role_app_fun_page  [get,post]
 func (c *SysAppController) FindRoleAppFunPage(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_FindRoleAppFunPage(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // GetRoleAppFunTree
 // @Title GetRoleAppFunTree
-// @Description 获取角色APP功能树
+// @Description 获取角色APP功能树         
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /get_role_app_fun_tree  [get,post]
 func (c *SysAppController) GetRoleAppFunTree(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_GetRoleAppFunTree(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // GetDomainAppFunTree
 // @Title GetDomainAppFunTree
-// @Description 域添加APP功能
-// @Param	domain_id    string  false  "域id"
+// @Description 域添加APP功能         
+// @Param	domain_id    string  false  "域id"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /get_domain_app_fun_tree  [get,put]
 func (c *SysAppController) GetDomainAppFunTree(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_GetDomainAppFunTree(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // AddDomainAppFuns
 // @Title AddDomainAppFuns
-// @Description 域添加菜单
-// @Param	      false  "添加域app_fun"
+// @Description 域添加菜单         
+// @Param	      false  "添加域app_fun"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /add_domain_app_funs  [post,get,put]
 func (c *SysAppController) AddDomainAppFuns(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysApp_AddDomainAppFuns(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
+

+ 19 - 13
controllers/gen/SysAttachmentController_gen.go

@@ -1,10 +1,13 @@
+
 package gen
 
 import (
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 
 // SysAttachmentController operations for SysAttachment
@@ -17,53 +20,56 @@ func NewSysAttachmentController(e *engine.ApiEngine) *SysAttachmentController {
 	return controller
 }
 
+
+
 // Get
 // @Title Get
-// @Description 获取附件信息
-// @Param	id    string  false  "附件id"
+// @Description 获取附件信息         
+// @Param	id    string  false  "附件id"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /get  [get]
 func (c *SysAttachmentController) Get(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysAttachment_Get(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // Upload
 // @Title Upload
-// @Description 上传文件
+// @Description 上传文件         
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /upload  [post]
 func (c *SysAttachmentController) Upload(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysAttachment_Upload(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // Download
 // @Title Download
-// @Description 下载文件
-// @Param	id    string  false  "文件ID"
+// @Description 下载文件         
+// @Param	id    string  false  "文件ID"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /download  [get]
 func (c *SysAttachmentController) Download(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysAttachment_Download(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
 // Delete
 // @Title Delete
-// @Description 删除文件
-// @Param	id    string  false  "文件ID"
+// @Description 删除文件         
+// @Param	id    string  false  "文件ID"  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /delete  [get]
 func (c *SysAttachmentController) Delete(ctx *gin.Context) {
 	//
-	db := c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
 	partial.SysAttachment_Delete(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
+

+ 45 - 4
controllers/gen/SystemController_gen.go

@@ -4,7 +4,9 @@ package gen
 import (
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/partial"
+	
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 
@@ -978,6 +980,44 @@ func (c *SystemController) GetOptionsetByCode(ctx *gin.Context) {
 	partial.System_GetOptionsetByCode(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
 
+// AddTableColUser
+// @Title AddTableColUser
+// @Description 添加用户可见列         
+// @Param	      false  "用户可见列"  
+// @Success 200 {object} sysReturn
+// @Failure 403 :id is empty
+// @router /add_table_col_user  [post,get,put]
+func (c *SystemController) AddTableColUser(ctx *gin.Context) {
+	//
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	partial.System_AddTableColUser(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
+}
+
+// UpdateTableColUser
+// @Title UpdateTableColUser
+// @Description 修改用户可见列         
+// @Param	      false  "用户可见列"  
+// @Success 200 {object} sysReturn
+// @Failure 403 :id is empty
+// @router /update_table_col_user  [post,get,put]
+func (c *SystemController) UpdateTableColUser(ctx *gin.Context) {
+	//
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	partial.System_UpdateTableColUser(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
+}
+
+// FindTableColUserpage
+// @Title FindTableColUserpage
+// @Description 分页获取用户可见列         
+// @Success 200 {object} sysReturn
+// @Failure 403 :id is empty
+// @router /find_table_col_userpage  [get,post]
+func (c *SystemController) FindTableColUserpage(ctx *gin.Context) {
+	//
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	partial.System_FindTableColUserpage(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
+}
+
 // AddDataPermission
 // @Title AddDataPermission
 // @Description 添加数据权限         
@@ -1032,12 +1072,13 @@ func (c *SystemController) FindDataPermissionPage(ctx *gin.Context) {
 // ModifyPassword
 // @Title ModifyPassword
 // @Description 修改密码         
-// @Param  body    models.ModifyPassword  true  ""  
+// @Param	body    models.ModifyPassword  true  ""  
 // @Success 200 {object} sysReturn
 // @Failure 403 :id is empty
 // @router /modify_password  [post]
 func (c *SystemController) ModifyPassword(ctx *gin.Context) {
-   //
-   db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
-   partial.System_ModifyPassword(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
+	//
+	db:=c.apiengine.BusinessOrmEngine[ctx.GetString("domain")]
+	partial.System_ModifyPassword(&entitys.CtrlContext{c.apiengine, ctx, db, c.apiengine.PlatformOrmEngine})
 }
+

+ 49 - 0
controllers/partial/PayCallbackController.go

@@ -0,0 +1,49 @@
+
+package partial
+
+import (
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/third/wx"
+
+	//sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+    //sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
+	//"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	//__import_packages__
+)
+
+
+
+
+// _Wxpay
+// @Title _Wxpay
+// @Description 微信支付回调
+// @Success 200 {object} Account
+// @Failure 403 :id is empty
+func PayCallback_Wxpay(c *entitys.CtrlContext) {
+
+	r := wx.CallWxPayCallbackHandler(c)
+
+	if r.Code != 200{
+		c.Ctx.JSON(500, r)
+	}else{
+		c.Ctx.JSON(200, r)
+	}
+}
+
+// _Alipay
+// @Title _Alipay
+// @Description 支付宝支付回调
+// @Success 200 {object} Account
+// @Failure 403 :id is empty
+func PayCallback_Alipay(c *entitys.CtrlContext) {
+
+	ret := __none_func_pay_callback__()
+	if ret{
+		c.Ctx.String(200,"")
+	}
+}
+
+
+func __none_func_pay_callback__(params ... interface{}) bool{
+	return true
+}

+ 32 - 0
routers/pay_callback_gen.go

@@ -0,0 +1,32 @@
+
+package routers
+
+import (
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
+	
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers/gen"
+)
+
+func init(){
+	addRegisterHandler(registerPayCallbackRouter)
+}
+
+func registerPayCallbackRouter(e *engine.ApiEngine){
+	api:=e.GinEngine.Group("/api")
+	v1:=api.Group("/v1/pay_callback")
+	
+	if len(_router["pay_callback"]) >0 {
+		v1.Use(_router["pay_callback"]...)
+	}
+	ctrler := gen.NewPayCallbackController(e)
+
+
+
+	//v1.GET("/wxpay",ctrler.Wxpay)
+	v1.POST("/wxpay",ctrler.Wxpay)
+
+	//v1.GET("/alipay",ctrler.Alipay)
+	v1.POST("/alipay",ctrler.Alipay)
+
+}
+

+ 91 - 0
third/wx/global.go

@@ -0,0 +1,91 @@
+package wx
+
+import (
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"strconv"
+	"time"
+
+	"github.com/silenceper/wechat"
+	"github.com/silenceper/wechat/cache"
+)
+
+var wc *wechat.Wechat
+
+func init() {
+	c := &LocalCache{}
+	wxpayCallback := config.AppConfig.GetKey("wxpay_callback") // 完整微信回调url,
+	appId := config.AppConfig.GetKey("app_id")					// 公众号appid
+	appSecret := config.AppConfig.GetKey("app_secret")			// 公众号app secret
+	token := config.AppConfig.GetKey("token")
+	encodingAseKey := config.AppConfig.GetKey("encoding_aes_key")
+	payMchId := config.AppConfig.GetKey("mch_id")				// 商户号id
+	payKey := config.AppConfig.GetKey("pay_key")				// 商户支付设置的key
+
+	config := &wechat.Config{appId, appSecret, token, encodingAseKey, payMchId, wxpayCallback, payKey, c}
+	wc = wechat.NewWechat(config)
+}
+
+/*********************local cache*************************/
+type LocalCache struct {
+	cache.Cache
+	m map[string]string
+}
+
+func (this *LocalCache) Get(key string) interface{} {
+	if this.m == nil {
+		return nil
+	}
+
+	tokenTime := this.m["timeout"]
+	if tokenTime == "" {
+		return nil
+	}
+
+	tInt64, _ := strconv.ParseInt(tokenTime, 10, 64)
+
+	if time.Now().After(time.Unix(tInt64, 0)) {
+		return nil
+	}
+
+	return this.m[key]
+}
+
+func (this *LocalCache) Set(key string, val interface{}, timeout time.Duration) error {
+	if this.m == nil {
+		this.m = make(map[string]string)
+	}
+
+	t := time.Now().Add(timeout).Unix()
+
+	this.m["timeout"] = strconv.FormatInt(t, 10)
+	this.m[key] = val.(string)
+	return nil
+}
+/*********************************************************/
+
+// 支付参数
+type PayParams struct{
+	// 请求上下文
+	Ctx *entitys.CtrlContext
+	// 价格(以分为单位)
+	TotalFee int
+	// 商品描述,默认body
+	Body string
+	// 额外信息,默认位user_id
+	Attach string
+	// 交易单号(最长36位)
+	OutTradeNo string
+	// 用户openid,再jsapi支付下必填,其他的可不填
+	OpenId string
+}
+
+// jsapy 支付配置,用于返回给网页设置api参数
+ type JSAPIPayConfig struct {
+	Timestamp string `json:"timeStamp"` // 此处用string,ios下用int是错误的
+	NonceStr  string `json:"nonceStr"`
+	Package   string `json:"package"`
+	SignType  string `json:"signType"`
+	PaySign   string `json:"paySign"`
+	OutTradeNo   string `json:"outTradeNo"`
+}

+ 107 - 0
third/wx/wx.go

@@ -0,0 +1,107 @@
+package wx
+
+import (
+	"fmt"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
+	"github.com/pkg/errors"
+	"github.com/silenceper/wechat/pay"
+	"github.com/silenceper/wechat/util"
+	"strconv"
+)
+
+var wxPayCallbackHandler func(result *pay.NotifyResult)models.SysReturn = nil
+
+// 注册微信支付回调处理函数
+func RegisterWxPayCallbackHandler(handler func(result *pay.NotifyResult)models.SysReturn){
+	wxPayCallbackHandler = handler
+}
+
+func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{
+	if wxPayCallbackHandler == nil{
+		return models.SysReturn{500, "微信支付回调处理函数为空", nil}
+	}
+	notifyRet := pay.NotifyResult{}
+	err := c.Ctx.BindXML(&notifyRet)
+	if err != nil{
+		fmt.Println("******************----》微信支付回调bindxml错误", err.Error())
+		return models.SysReturn{500, err.Error(), nil}
+	}
+	return wxPayCallbackHandler(&notifyRet)
+}
+
+// 扫码支付
+func PayNative(params *PayParams)(*pay.PayResult, error){
+	ip := utils.GetIP(params.Ctx)
+	attach := params.Attach
+	if attach == ""{
+		attach = params.Ctx.Ctx.GetString("user_id")
+		if attach == ""{
+			attach = "attach"
+		}
+	}
+	body := params.Body
+	if body == ""{
+		body = "body"
+	}
+	if params.OutTradeNo == ""{
+		return nil, errors.New("交易单号为空")
+	}
+	parParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, ""}
+	return wc.GetPay().PreNative(&parParams)
+}
+
+// jsapi 支付
+func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
+	openId := params.OpenId
+	if openId == ""{
+		return nil, errors.New("openid 为空")
+	}
+	if params.OutTradeNo == ""{
+		return nil, errors.New("交易单号为空")
+	}
+
+	attach := params.Attach
+	if attach == ""{
+		attach = params.Ctx.Ctx.GetString("user_id")
+		if attach == ""{
+			attach = "attach"
+		}
+	}
+	body := params.Body
+	if body == ""{
+		body = "body"
+	}
+	ip := utils.GetIP(params.Ctx)
+
+	payParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, params.OpenId}
+	payObj := wc.GetPay()
+	prePayID, err := payObj.PrePayID(&payParams)
+	if err != nil{
+		fmt.Println("----------------->prepayid error", err.Error())
+		return nil, err
+	}
+
+	nonceStr := util.RandomStr(32)
+	timestamp := util.GetCurrTs()
+	pack := "prepay_id=" + prePayID
+	template := "appId=%s&nonceStr=%s&package=%s&signType=MD5&timeStamp=%s&key=%s"
+	str := fmt.Sprintf(template, payObj.AppID, nonceStr, pack, strconv.FormatInt(timestamp, 10), payObj.PayKey)
+	sign := util.MD5Sum(str)
+
+	payCfg := pay.Config{timestamp, nonceStr, prePayID, "MD5", sign}
+	exPayConfig := JSAPIPayConfig{}
+	exPayConfig.NonceStr = payCfg.NonceStr
+	exPayConfig.OutTradeNo = params.OutTradeNo
+	exPayConfig.Package = "prepay_id=" + payCfg.PrePayID
+	exPayConfig.PaySign = payCfg.Sign
+	exPayConfig.SignType = payCfg.SignType
+	exPayConfig.Timestamp = strconv.Itoa(int(payCfg.Timestamp))
+
+	if err==nil {
+		return &exPayConfig, nil
+	}else{
+		return nil, err
+	}
+}

+ 26 - 1
utils/utils.go

@@ -5,11 +5,14 @@ import (
 	"crypto/sha1"
 	"encoding/hex"
 	"git.qianqiusoft.com/qianqiusoft/go-uuid/uuid"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/logs"
 	"github.com/gin-gonic/gin"
+	"math/rand"
 	"net/url"
 	"regexp"
 	"strings"
+	"time"
 )
 
 const (
@@ -87,4 +90,26 @@ func GetHostnames(ctx *gin.Context)[]string{
 		// 直接返回ip
 		return []string{hostname}
 	}
-}
+}
+
+// 获取ip
+func GetIP(c *entitys.CtrlContext)string{
+	ip := c.Ctx.Request.RemoteAddr
+	end := strings.Index(ip, ":")
+	rs := []rune(ip)
+	ip = string(rs[0:end])
+
+	return ip
+}
+
+//RandomStr 随机生成字符串
+func RandomStr(length int) string {
+	str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+	bytes := []byte(str)
+	result := []byte{}
+	r := rand.New(rand.NewSource(time.Now().UnixNano()))
+	for i := 0; i < length; i++ {
+		result = append(result, bytes[r.Intn(len(bytes))])
+	}
+	return string(result)
+}