From e9d5da1f8f6bff09e3f0ff777a44fe617e45ae52 Mon Sep 17 00:00:00 2001 From: Jumpei Tsuji Date: Fri, 5 Aug 2016 11:43:55 +0900 Subject: [PATCH] Use interface argument for IAP response instead of the library defined struct --- README.md | 3 ++- appstore/model.go | 4 ++++ appstore/validator.go | 9 ++++----- appstore/validator_test.go | 12 +++++++----- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f94561d..62da3d3 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ func main() { req := appstore.IAPRequest{ ReceiptData: "your receipt data encoded by base64", } - resp, err := client.Verify(req) + resp := &IAPResponse{} + err := client.Verify(req, resp) } ``` diff --git a/appstore/model.go b/appstore/model.go index c484ef3..10bc420 100644 --- a/appstore/model.go +++ b/appstore/model.go @@ -73,6 +73,10 @@ type ( } // The IAPResponse type has the response properties + // We defined each field by the current IAP response, but some fields are not mentioned + // in the following Apple's document; + // https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html + // If you get other types or fileds from the IAP response, you should use the struct you defined. IAPResponse struct { Status int `json:"status"` Environment string `json:"environment"` diff --git a/appstore/validator.go b/appstore/validator.go index 83d8f0d..64d02ab 100644 --- a/appstore/validator.go +++ b/appstore/validator.go @@ -98,8 +98,7 @@ func NewWithConfig(config Config) Client { } // Verify sends receipts and gets validation result -func (c *Client) Verify(req IAPRequest) (IAPResponse, error) { - result := IAPResponse{} +func (c *Client) Verify(req IAPRequest, result interface{}) error { _, body, errs := gorequest.New(). Post(c.URL). Send(req). @@ -107,10 +106,10 @@ func (c *Client) Verify(req IAPRequest) (IAPResponse, error) { End() if errs != nil { - return result, fmt.Errorf("%v", errs) + return fmt.Errorf("%v", errs) } - err := json.NewDecoder(strings.NewReader(body)).Decode(&result) + err := json.NewDecoder(strings.NewReader(body)).Decode(result) - return result, err + return err } diff --git a/appstore/validator_test.go b/appstore/validator_test.go index fe28a78..c705a25 100644 --- a/appstore/validator_test.go +++ b/appstore/validator_test.go @@ -134,15 +134,16 @@ func TestNewWithConfigTimeout(t *testing.T) { func TestVerify(t *testing.T) { client := New() - expected := IAPResponse{ + expected := &IAPResponse{ Status: 21002, } req := IAPRequest{ ReceiptData: "dummy data", } - actual, _ := client.Verify(req) - if !reflect.DeepEqual(actual, expected) { - t.Errorf("got %v\nwant %v", actual, expected) + result := &IAPResponse{} + client.Verify(req, result) + if !reflect.DeepEqual(result, expected) { + t.Errorf("got %v\nwant %v", result, expected) } } @@ -156,7 +157,8 @@ func TestVerifyTimeout(t *testing.T) { } expected := errors.New("") - _, actual := client.Verify(req) + result := &IAPResponse{} + actual := client.Verify(req, result) if !reflect.DeepEqual(reflect.TypeOf(actual), reflect.TypeOf(expected)) { t.Errorf("got %v\nwant %v", actual, expected) }