@ -9,6 +9,9 @@ import (
"encoding/json"
"encoding/json"
"errors"
"errors"
"fmt"
"fmt"
"net/http"
"net/url"
"reflect"
"strconv"
"strconv"
"strings"
"strings"
@ -46,6 +49,9 @@ func GainWechatToken(systemApp, key string, isAgain int) (token string, err erro
case "school" :
case "school" :
redisFileKey = fmt . Sprintf ( "%v_%v_%v" , redisFileKey , systemApp , overall . CONSTANT_CONFIG . WechatSchool . Agentid )
redisFileKey = fmt . Sprintf ( "%v_%v_%v" , redisFileKey , systemApp , overall . CONSTANT_CONFIG . WechatSchool . Agentid )
secretStr = overall . CONSTANT_CONFIG . WechatSchool . Secret
secretStr = overall . CONSTANT_CONFIG . WechatSchool . Secret
case "stzl" :
redisFileKey = fmt . Sprintf ( "%v_%v_%v" , redisFileKey , systemApp , overall . CONSTANT_CONFIG . ShuTongZhiLian . Agentid )
secretStr = overall . CONSTANT_CONFIG . ShuTongZhiLian . Secret
default :
default :
redisFileKey = fmt . Sprintf ( "%v_%v" , redisFileKey , systemApp )
redisFileKey = fmt . Sprintf ( "%v_%v" , redisFileKey , systemApp )
}
}
@ -202,3 +208,198 @@ func (a *ApiMethod) LookOnePeopleArchives(c *gin.Context) {
}
}
publicmethod . Result ( 0 , sendData , c )
publicmethod . Result ( 0 , sendData , c )
}
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2024 - 10 - 23 15 : 04 : 38
@ 功能 : 构造企业微信网页授权code
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func ( a * ApiMethod ) ObtainAuthorization ( c * gin . Context ) {
//保障获取渠道一致
md5Token := GainTokenKey ( c )
//来源于哪个系统
systemApp := c . Query ( "systemapp" )
if systemApp == "" {
systemApp = "stzl"
}
isAgain := c . Query ( "isagain" ) //是否强制重新授权
isAgainInt , _ := strconv . Atoi ( isAgain )
if isAgainInt == 0 {
isAgainInt = 1
}
//获取token
token , err := GainWechatToken ( systemApp , md5Token , isAgainInt )
if err != nil {
publicmethod . Result ( 1 , err , c , "身份认证失败" )
return
}
//组装企业微信重定向地址参数
var urlRedirectKey [ ] string
urlRedirectKey = append ( urlRedirectKey , fmt . Sprintf ( "systemapp=%v" , systemApp ) )
urlRedirectKey = append ( urlRedirectKey , fmt . Sprintf ( "isagain=%v" , isAgainInt ) )
userNum := c . Query ( "userid" )
if userNum != "" {
urlRedirectKey = append ( urlRedirectKey , fmt . Sprintf ( "userid=%v" , userNum ) )
}
urlParameter := strings . Join ( urlRedirectKey , "&" ) //合并成参数字符串
//企业微信重定向地址
watchWorkCallBackUrl := url . QueryEscape ( fmt . Sprintf ( "%v/systemapi/wechat/wechatCallBack?%v" , overall . CONSTANT_CONFIG . Appsetup . WebKpiUrl , urlParameter ) )
redirectUrl := fmt . Sprintf ( "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%v&redirect_uri=%v&response_type=code&scope=snsapi_base&state=%v#wechat_redirect" , overall . CONSTANT_CONFIG . WechatCompany . CompanyId , watchWorkCallBackUrl , token )
c . Redirect ( http . StatusMovedPermanently , redirectUrl )
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2024 - 10 - 23 14 : 41 : 12
@ 功能 : 企业微信参数地址重定向回调
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func ( a * ApiMethod ) WechatCallBack ( c * gin . Context ) {
code := c . Query ( "code" )
state := c . Query ( "state" )
if code == "" || state == "" {
publicmethod . Result ( 0 , code , c , "未能查询到您的信息!企业微信授权失败!" )
return
}
systemApp := c . Query ( "systemapp" )
if systemApp == "" {
systemApp = "stzl"
}
isAgain := c . Query ( "isagain" )
isAgainInt , _ := strconv . Atoi ( isAgain )
userNum := c . Query ( "userid" )
md5Token := GainTokenKey ( c ) //保障获取渠道一致
token , _ := GainWechatToken ( systemApp , md5Token , isAgainInt )
gainWechatInfo := fmt . Sprintf ( "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%v&code=%v" , token , code )
wechatInfoByte := publicmethod . CurlGet ( gainWechatInfo )
var callBackWechatInfo WorkWechatUserAuter
err := json . Unmarshal ( wechatInfoByte , & callBackWechatInfo )
if err != nil {
publicmethod . Result ( 0 , err , c , "未能查询到您的信息!企业微信授权失败!2" )
return
}
if callBackWechatInfo . Errcode != 0 {
if callBackWechatInfo . Errcode == 42001 {
a . ObtainAuthorization ( c )
return
}
publicmethod . Result ( 12 , callBackWechatInfo , c , "未能查询到您的信息!企业微信授权失败!3" )
return
}
var userWechatId string
if callBackWechatInfo . OpenId != "" {
userWechatId = callBackWechatInfo . OpenId
}
if callBackWechatInfo . Userid != "" {
userWechatId = callBackWechatInfo . Userid
}
if userWechatId == "" {
publicmethod . Result ( 1 , err , c , "未能查询到您的信息!企业微信授权失败!" )
return
}
wechatCont , err := SetUpWechatInfo ( userWechatId )
if err != nil {
publicmethod . Result ( 13 , err , c , "未能查询到您的信息!企业微信授权失败!" )
return
}
// callBackLoginUrl := fmt.Sprintf("%v/#/?callback=1&usernum=%v&openid=%v&userkey=%v&token=%v", overall.CONSTANT_CONFIG.Appsetup.WebKpiUrl, userNum, wechatCont.UserInfo.Number, wechatCont.UserKey, wechatCont.Token)
callBackLoginUrl := fmt . Sprintf ( "%v?callback=1&usernum=%v&openid=%v&userkey=%v&token=%v" , overall . CONSTANT_CONFIG . Appsetup . WebKpiUrl , userNum , wechatCont . UserInfo . Number , wechatCont . UserKey , wechatCont . Token )
c . Redirect ( http . StatusMovedPermanently , callBackLoginUrl )
}
// 获取token Key
func GainTokenKey ( c * gin . Context ) ( md5Token string ) {
host := c . Request . Header . Get ( "Host" )
userAgent := c . Request . Header . Get ( "User-Agent" )
wechatTokenStr := fmt . Sprintf ( "%v_%v" , host , userAgent )
var md5JiaMi publicmethod . Md5Encryption
md5JiaMi . Md5EncryptionInit ( wechatTokenStr )
md5Token = md5JiaMi . Md5EncryptionAlgorithm ( )
return
}
/ *
*
@ 作者 : 秦东
@ 时间 : 2024 - 01 - 20 14 : 06 : 00
@ 功能 : 获取登陆人员信息
@ 参数
#
@ 返回值
#
@ 方法原型
#
* /
func SetUpWechatInfo ( wechatOpenId string ) ( sendData WechatVerifyIdentity , err error ) {
err = overall . CONSTANT_DB_HR . Where ( "`wechat` = ? OR `work_wechat` = ?" , wechatOpenId , wechatOpenId ) . First ( & sendData . UserInfo ) . Error
if err != nil {
return
}
if ! publicmethod . IsInTrue [ int ] ( sendData . UserInfo . EmpType , [ ] int { 1 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ) {
err = errors . New ( "对不起!你没有权限进入!" )
return
}
// uuIdVal := overallhandle.OnlyOneNumber(3)
userAgent := overall . CONSTANT_CONFIG . Appsetup . AppKey
var md5JiaMi publicmethod . Md5Encryption
md5JiaMi . Md5EncryptionInit ( userAgent )
md5Token := md5JiaMi . Md5EncryptionAlgorithm ( )
//工号MD5加密
var md5JiaMiNumber publicmethod . Md5Encryption
md5JiaMiNumber . Md5EncryptionInit ( sendData . UserInfo . Number )
sendData . UserKey = md5JiaMiNumber . Md5EncryptionAlgorithm ( )
sha1Str := fmt . Sprintf ( "%v%v%v%v" , sendData . UserKey , sendData . UserInfo . Number , sendData . UserInfo . Password , md5Token )
sendData . Token = publicmethod . Sha1Encryption ( sha1Str )
//组成Token字符串进行
wechatUserToken := fmt . Sprintf ( "%v%v" , sendData . UserKey , sendData . Token )
var md5JiaMiWechat publicmethod . Md5Encryption
md5JiaMiWechat . Md5EncryptionInit ( wechatUserToken )
wechatRedisKey := md5JiaMiWechat . Md5EncryptionAlgorithm ( )
wechatRedisToekn := fmt . Sprintf ( "Wechat:UserToken:%v_%v" , wechatRedisKey , overall . CONSTANT_CONFIG . RedisPrefixStr . Alias )
saveInfo := publicmethod . MapOut [ string ] ( )
structValue := reflect . ValueOf ( sendData . UserInfo )
structType := structValue . Type ( )
for i := 0 ; i < structValue . NumField ( ) ; i ++ {
fieldValue := structValue . Field ( i )
fieldType := structType . Field ( i )
// fmt.Printf("%s: %v\n", fieldType.Name, fieldValue.Interface())
saveInfo [ fieldType . Name ] = fieldValue . Interface ( )
}
redisClient := grocerystore . RunRedis ( overall . CONSTANT_REDIS4 ) //设定redis库
redisClient . SetRedisTime ( 7200 )
redisClient . HashMsetAdd ( wechatRedisToekn , saveInfo )
return
}