Browse Source

Merge branch 'v2' of https://git.qianqiusoft.com/qianqiusoft/light-apiengine into v2

huangyh 6 years ago
parent
commit
1795c1efbd

+ 2 - 1
controllers/partial/SystemController.go

@@ -108,6 +108,7 @@ func System_FindUserPage(c *entitys.CtrlContext) {
 	login_id := c.Ctx.DefaultQuery("login_id", "")
 	org_id := c.Ctx.DefaultQuery("org_id", "")
 	cn_org_id := c.Ctx.DefaultQuery("cn_org_id", "")
+	role_name := c.Ctx.DefaultQuery("role_name", "")
 
 	var roleRule interface{}
 	rule_code := "org_tree"
@@ -128,7 +129,7 @@ func System_FindUserPage(c *entitys.CtrlContext) {
 		}
 	}
 
-	paramMap_i_t := map[string]interface{}{"page": page, "rows": rows, "name": name, "login_id": login_id, "org_id": org_id, "cn_org_id": cn_org_id, "user_id": user_id, "role_rule": roleRule}
+	paramMap_i_t := map[string]interface{}{"page": page, "rows": rows, "name": name, "login_id": login_id, "org_id": org_id, "cn_org_id": cn_org_id, "user_id": user_id, "role_name": role_name, "role_rule": roleRule}
 	result, err := sysutils.PageSearch(c.Db, "system", "find_user_page", "sys_user", paramMap_i_t)
 
 	if err != nil {

+ 11 - 0
sqlconfig/system_controller/system_find_user_page_count.tpl

@@ -9,6 +9,14 @@ left join
 on
     sys_user.org_id = sys_org.id
 {{end}}
+{{if ne .role_name ""}}
+left join
+    sys_user_role
+on sys_user_role.user_id = sys_user.id
+left join
+    sys_role
+on sys_role.id = sys_user_role.role_id
+{{end}}
 where
 	sys_user.del_flag = 0
 {{if ne .name ""}}
@@ -17,6 +25,9 @@ where
 {{if ne .login_id ""}}
     and sys_user.login_id like '%{{.login_id}}%'
 {{end}}
+{{if ne .role_name ""}}
+    and sys_role.name = '{{.role_name}}'
+{{end}}
 {{if ne .cn_org_id ""}}
     and sys_org.inheritance like '%{{.cn_org_id}}%'
 {{end}}

+ 3 - 0
sqlconfig/system_controller/system_find_user_page_select.tpl

@@ -25,6 +25,9 @@ where
 {{if ne .login_id ""}}
     and sys_user.login_id like '%{{.login_id}}%'
 {{end}}
+{{if ne .role_name ""}}
+    and sys_role.name = '{{.role_name}}'
+{{end}}
 {{if ne .cn_org_id ""}}
     and sys_org.inheritance like '%{{.cn_org_id}}%'
 {{end}}

+ 37 - 0
third/alipay/alipay.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"errors"
 	"github.com/smartwalle/alipay"
 )
 
@@ -56,3 +57,39 @@ func PayNavite(param *PayParams)(*alipay.TradePreCreateRsp, error){
 
 	return resp, nil
 }
+// 关闭订单
+// APP支付、手机网站支付和电脑网站支付产生的交易,可调用 alipay.trade.close(统一收单交易关闭接口)直接将未付款的交易进行关闭
+func CloseOrder(outTradeNo string)(*alipay.TradeCloseRsp, error){
+	tcparam := alipay.TradeClose{}
+	tcparam.OutTradeNo = outTradeNo
+	resp, err := alipayClient.TradeClose(tcparam)
+	if err != nil{
+		return resp, err
+	}
+	if resp.Content.Code == "10000"{
+		// 10000 处理成功
+		return resp, nil
+	}else{
+		fmt.Println("关闭订单失败", resp.Content.Code, resp.Content.Msg)
+		return resp, errors.New("关闭订单失败")
+	}
+}
+
+// 取消订单
+// 当面付产生的交易,支付交易返回失败或支付系统超时
+func CancelOrder(outTradeNo string)(*alipay.TradeCancelRsp, error){
+	tcparam := alipay.TradeCancel{}
+	tcparam.OutTradeNo = outTradeNo
+
+	resp, err := alipayClient.TradeCancel(tcparam)
+	if err != nil{
+		return resp, err
+	}
+	if resp.Content.Code == "10000"{
+		// 10000 处理成功
+		return resp, nil
+	}else{
+		fmt.Println("取消订单失败", resp.Content.Code, resp.Content.Msg)
+		return resp, errors.New("取消订单失败")
+	}
+}

+ 1 - 0
third/wx/global.go

@@ -127,6 +127,7 @@ type PayParams struct{
 	SignType  string `json:"signType"`
 	PaySign   string `json:"paySign"`
 	OutTradeNo   string `json:"outTradeNo"`
+	AppId string `json:"appId"`
 }
 
 // 微信oauth跳转信息,

+ 111 - 0
third/wx/verify.go

@@ -0,0 +1,111 @@
+package wx
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/xml"
+	"errors"
+	"fmt"
+	"io"
+	"net/url"
+	"sort"
+	"strings"
+)
+
+type XMLMap url.Values
+
+type xmlMapEntry struct {
+	XMLName xml.Name
+	Value   string `xml:",chardata"`
+}
+
+func (m XMLMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	for {
+		var e xmlMapEntry
+		err := d.Decode(&e)
+		if err == io.EOF {
+			break
+		} else if err != nil {
+			return err
+		}
+		(m)[e.XMLName.Local] = []string{e.Value}
+	}
+	return nil
+}
+
+func (v XMLMap) Get(key string) string {
+	if v == nil {
+		return ""
+	}
+	vs := v[key]
+	if len(vs) == 0 {
+		return ""
+	}
+	return vs[0]
+}
+
+func (v XMLMap) Set(key, value string) {
+	v[key] = []string{value}
+}
+
+func (v XMLMap) Add(key, value string) {
+	v[key] = append(v[key], value)
+}
+
+func (v XMLMap) Del(key string) {
+	delete(v, key)
+}
+
+func VerifyResponseData(data []byte, key string) (ok bool, err error) {
+	fmt.Println("------------------>1", string(data))
+
+	var param = make(XMLMap)
+	err = xml.Unmarshal(data, &param)
+	if err != nil {
+		fmt.Println("------------------>2")
+		return false, err
+	}
+
+	return VerifyResponseValues(url.Values(param), key)
+}
+
+func VerifyResponseValues(param url.Values, key string) (bool, error) {
+	fmt.Println("----------------------------------->2.0")
+	// 验证签名
+	var sign = param.Get("sign")
+	delete(param, "sign")
+	if sign == "" {
+		return false, errors.New("签名验证失败")
+	}
+
+	fmt.Println("----------------------------------->2.1")
+	var sign2 = SignMD5(param, key)
+	if sign == sign2 {
+		return true, nil
+	}
+	fmt.Println("------------------------------->2.3", sign, sign2)
+	return false, errors.New("签名验证失败")
+}
+
+func SignMD5(param url.Values, key string) (sign string) {
+	var pList = make([]string, 0, 0)
+	for key := range param {
+		var value = param.Get(key)
+		if len(value) > 0 {
+			pList = append(pList, key+"="+value)
+		}
+	}
+	sort.Strings(pList)
+	if key != "" {
+		pList = append(pList, "key="+key)
+	}
+
+	var src = strings.Join(pList, "&")
+	md5Ctx := md5.New()
+	md5Ctx.Write([]byte(src))
+	cipherStr := md5Ctx.Sum(nil)
+
+	sign = strings.ToUpper(hex.EncodeToString(cipherStr))
+	return sign
+}
+

+ 44 - 3
third/wx/wx.go

@@ -1,6 +1,7 @@
 package wx
 
 import (
+	"encoding/xml"
 	"errors"
 	"fmt"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
@@ -10,6 +11,7 @@ import (
 	"github.com/silenceper/wechat/oauth"
 	"github.com/silenceper/wechat/pay"
 	"github.com/silenceper/wechat/util"
+	"io/ioutil"
 	"net/url"
 	"strconv"
 	"strings"
@@ -26,13 +28,34 @@ func CallWxPayCallbackHandler(c *entitys.CtrlContext)models.SysReturn{
 	if wxPayCallbackHandler == nil{
 		return models.SysReturn{500, "微信支付回调处理函数为空", nil}
 	}
+	data, err := ioutil.ReadAll(c.Ctx.Request.Body)
+	if err != nil{
+		fmt.Println("******************----》微信支付回调read request body错误", err.Error())
+		return models.SysReturn{500, err.Error(), nil}
+	}
 	notifyRet := pay.NotifyResult{}
-	err := c.Ctx.BindXML(&notifyRet)
+	err = xml.Unmarshal(data, &notifyRet)
+	//err = c.Ctx.BindXML(&notifyRet)
 	if err != nil{
 		fmt.Println("******************----》微信支付回调bindxml错误", err.Error())
 		return models.SysReturn{500, err.Error(), nil}
 	}
-	return wxPayCallbackHandler(&notifyRet)
+	if notifyRet.ResultCode == "SUCCESS" && notifyRet.ReturnCode == "SUCCESS"{
+		ok, err := VerifyResponseData(data, wxConfig.PayKey)
+		if err != nil{
+			fmt.Println("*****************---->微信支付回调验证错误", err.Error())
+			return models.SysReturn{500, err.Error(), nil}
+		}
+		if !ok{
+			fmt.Println("*****************---->微信支付回调验证错误, ok is false")
+			return models.SysReturn{500, "", nil}
+		}
+		return wxPayCallbackHandler(&notifyRet)
+	}else{
+		fmt.Println("------------------>微信支付失败", notifyRet)
+		return models.SysReturn{500, "", ""}
+	}
+
 }
 
 // 扫码支付
@@ -66,10 +89,13 @@ func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
 		return nil, errors.New("交易单号为空")
 	}
 
+
 	attach := params.Attach
 	if attach == ""{
+		fmt.Println("--------------------->1")
 		attach = params.Ctx.Ctx.GetString("user_id")
 		if attach == ""{
+			fmt.Println("--------------------->2")
 			attach = "attach"
 		}
 	}
@@ -79,7 +105,16 @@ func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
 	}
 	ip := utils.GetIP(params.Ctx)
 
-	payParams := pay.Params{strconv.Itoa(params.TotalFee), ip, body, attach, params.OutTradeNo, params.OpenId}
+	fmt.Println("params.Attach", params.Attach, "attach", attach)
+
+	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{
@@ -96,6 +131,7 @@ func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
 
 	payCfg := pay.Config{timestamp, nonceStr, prePayID, "MD5", sign}
 	exPayConfig := JSAPIPayConfig{}
+	exPayConfig.AppId = wxConfig.AppId
 	exPayConfig.NonceStr = payCfg.NonceStr
 	exPayConfig.OutTradeNo = params.OutTradeNo
 	exPayConfig.Package = "prepay_id=" + payCfg.PrePayID
@@ -110,6 +146,11 @@ func PayJSAPI(params *PayParams)(*JSAPIPayConfig, error){
 	}
 }
 
+// 关闭订单
+func CloseOrder(outTradeNo string)(*pay.CloseOrderResult, error){
+	return wc.GetPay().CloseOrder(outTradeNo)
+}
+
 // 获取微信OAuth认证参数
 func GetOAuthParams(paramMap map[string]string)(*WxOAuthConfig, error){
 	config := WxOAuthConfig{}