jerry 6 anni fa
parent
commit
f970a51a08
5 ha cambiato i file con 98 aggiunte e 33 eliminazioni
  1. 19 19
      README.md
  2. 1 1
      model.go
  3. 11 0
      qq/client_test.go
  4. 57 0
      qq/service_api.go
  5. 10 13
      wechat/service_api.go

+ 19 - 19
README.md

@@ -12,17 +12,7 @@ QQ、微信、支付宝的Golang版本SDK
 ![Travis (.org)](https://img.shields.io/travis/iGoogle-ink/gopay)
 ![License](https://img.shields.io/github/license/iGoogle-ink/gopay)
 
-### 微信 Client
-
-* wechat.NewClient() => 初始化微信支付客户端
-
-```go
-import (
-	"github.com/iGoogle-ink/gopay/v2/wechat"
-)
-
-client := wechat.NewClient()
-```
+---
 
 ### 微信支付API
 
@@ -66,17 +56,25 @@ client := wechat.NewClient()
 
 ---
 
-### 支付宝 Client
+### QQ支付API
+
+* 提交付款码支付:client.MicroPay()
+* 撤销订单:client.Reverse()
+* 统一下单:client.UnifiedOrder()
+* 订单查询:client.OrderQuery()
+* 关闭订单:client.CloseOrder()
+* 申请退款:client.Refund()
+* 退款查询:client.RefundQuery()
+* 交易账单:client.StatementDown()
+* 资金账单:client.AccRoll()
 
-* client := alipay.NewClient() => 初始化支付宝支付客户端
+### QQ公共API
 
-```go
-import (
-	"github.com/iGoogle-ink/gopay/v2/alipay"
-)
+* qq.ParseNotifyResultToBodyMap() => 解析QQ支付异步通知的结果到BodyMap
+* qq.ParseNotifyResult() => 解析QQ支付异步通知的参数
+* qq.VerifySign() => QQ同步返回参数验签或异步通知参数验签
 
-client := alipay.NewClient()
-```
+---
 
 ### 支付宝支付API
 
@@ -116,6 +114,8 @@ client := alipay.NewClient()
 * alipay.DecryptOpenDataToStruct() => 解密支付宝开放数据到 结构体
 * alipay.DecryptOpenDataToBodyMap() => 解密支付宝开放数据到 BodyMap
 
+---
+
 # 一、安装
 
 ```bash

+ 1 - 1
model.go

@@ -7,7 +7,7 @@ const (
 	SUCCESS    = "SUCCESS"
 	FAIL       = "FAIL"
 	OK         = "OK"
-	Version    = "2.0.2"
+	Version    = "2.0.3"
 )
 
 type ReturnMessage struct {

+ 11 - 0
qq/client_test.go

@@ -40,3 +40,14 @@ func TestClient_MicroPay(t *testing.T) {
 	}
 	fmt.Println("qqRsp:", *qqRsp)
 }
+
+func TestNotifyResponse_ToXmlString(t *testing.T) {
+	n := new(NotifyResponse)
+	n.ReturnCode = "SUCCESS"
+	fmt.Println(n.ToXmlString())
+
+	n.ReturnCode = "FAIL"
+	n.ReturnMsg = "abc"
+	fmt.Println(n.ToXmlString())
+
+}

+ 57 - 0
qq/service_api.go

@@ -1,11 +1,15 @@
 package qq
 
 import (
+	"encoding/json"
 	"encoding/xml"
+	"errors"
 	"fmt"
 	"io"
 	"io/ioutil"
 	"net/http"
+	"reflect"
+	"strings"
 
 	"github.com/iGoogle-ink/gopay/v2"
 )
@@ -37,3 +41,56 @@ func ParseNotifyResult(req *http.Request) (notifyReq *NotifyRequest, err error)
 	}
 	return
 }
+
+// QQ同步返回参数验签或异步通知参数验签
+//    ApiKey:API秘钥值
+//    signType:签名类型(调用API方法时填写的类型)
+//    bean:微信同步返回的结构体 qqRsp 或 异步通知解析的结构体 notifyReq
+//    返回参数ok:是否验签通过
+//    返回参数err:错误信息
+func VerifySign(apiKey, signType string, bean interface{}) (ok bool, err error) {
+	if bean == nil {
+		return false, errors.New("bean is nil")
+	}
+	kind := reflect.ValueOf(bean).Kind()
+	if kind == reflect.Map {
+		bm := bean.(gopay.BodyMap)
+		bodySign := bm.Get("sign")
+		bm.Remove("sign")
+		return getReleaseSign(apiKey, signType, bm) == bodySign, nil
+	}
+
+	bs, err := json.Marshal(bean)
+	if err != nil {
+		return false, fmt.Errorf("json.Marshal(%s):%w", string(bs), err)
+	}
+	bm := make(gopay.BodyMap)
+	if err = json.Unmarshal(bs, &bm); err != nil {
+		return false, fmt.Errorf("json.Marshal(%s):%w", string(bs), err)
+	}
+	bodySign := bm.Get("sign")
+	bm.Remove("sign")
+	return getReleaseSign(apiKey, signType, bm) == bodySign, nil
+}
+
+type NotifyResponse struct {
+	ReturnCode string `xml:"return_code"`
+	ReturnMsg  string `xml:"return_msg"`
+}
+
+// 返回数据给QQ
+func (w *NotifyResponse) ToXmlString() (xmlStr string) {
+	var buffer strings.Builder
+	buffer.WriteString("<xml><return_code>")
+	buffer.WriteString(w.ReturnCode)
+	buffer.WriteString("</return_code>")
+	if w.ReturnMsg != gopay.NULL {
+		buffer.WriteString("<return_msg>")
+		buffer.WriteString(w.ReturnMsg)
+		buffer.WriteString("</return_msg>")
+	}
+	buffer.WriteString("</xml>")
+
+	xmlStr = buffer.String()
+	return
+}

+ 10 - 13
wechat/service_api.go

@@ -169,26 +169,23 @@ func VerifySign(apiKey, signType string, bean interface{}) (ok bool, err error)
 	if bean == nil {
 		return false, errors.New("bean is nil")
 	}
-	var (
-		bm       gopay.BodyMap
-		bs       []byte
-		kind     reflect.Kind
-		bodySign string
-	)
-	kind = reflect.ValueOf(bean).Kind()
+	kind := reflect.ValueOf(bean).Kind()
 	if kind == reflect.Map {
-		bm = bean.(gopay.BodyMap)
-		goto Verify
+		bm := bean.(gopay.BodyMap)
+		bodySign := bm.Get("sign")
+		bm.Remove("sign")
+		return getReleaseSign(apiKey, signType, bm) == bodySign, nil
 	}
-	if bs, err = json.Marshal(bean); err != nil {
+
+	bs, err := json.Marshal(bean)
+	if err != nil {
 		return false, fmt.Errorf("json.Marshal(%s):%w", string(bs), err)
 	}
-	bm = make(gopay.BodyMap)
+	bm := make(gopay.BodyMap)
 	if err = json.Unmarshal(bs, &bm); err != nil {
 		return false, fmt.Errorf("json.Marshal(%s):%w", string(bs), err)
 	}
-Verify:
-	bodySign = bm.Get("sign")
+	bodySign := bm.Get("sign")
 	bm.Remove("sign")
 	return getReleaseSign(apiKey, signType, bm) == bodySign, nil
 }