Compare commits
18 Commits
v2
...
purchasefl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96a12064d7 | ||
|
|
d8b160b5cb | ||
|
|
e811b02798 | ||
|
|
5b94718573 | ||
|
|
db9e8f1637 | ||
|
|
2b7d6c1820 | ||
|
|
d74d2cfd2c | ||
|
|
d5b4694461 | ||
|
|
b0a4ee19ee | ||
|
|
202310d2c3 | ||
|
|
45aa311b47 | ||
|
|
51a2c89640 | ||
|
|
36d117cd16 | ||
|
|
e28611afcb | ||
|
|
1fe1bd0f92 | ||
|
|
f0ee201e43 | ||
|
|
312aa41817 | ||
|
|
eb89375f2e |
@@ -82,9 +82,14 @@ type SubscriptionNotification struct {
|
||||
ExpirationIntent string `json:"expiration_intent"`
|
||||
|
||||
// Auto renew info
|
||||
AutoRenewStatus string `json:"auto_renew_status"` // false or true
|
||||
AutoRenewStatus string `json:"auto_renew_status"` // false or true
|
||||
AutoRenewProductID string `json:"auto_renew_product_id"`
|
||||
|
||||
// HACK (msyrus): Separate Subscriptiton Notification from Notification verification response
|
||||
Status int `json:"status,omitempty"`
|
||||
Receipt NotificationReceipt `json:"recipt"`
|
||||
SubscriptionRetryFlag string `json:"is_in_billing_retry_period,omitempty"`
|
||||
|
||||
// Posted if the notification_type is RENEWAL or INTERACTIVE_RENEWAL, and only if the renewal is successful.
|
||||
// Posted also if the notification_type is INITIAL_BUY.
|
||||
// Not posted for notification_type CANCEL.
|
||||
|
||||
@@ -96,64 +96,64 @@ func NewWithClient(client *http.Client) *Client {
|
||||
}
|
||||
|
||||
// Verify sends receipts and gets validation result
|
||||
func (c *Client) Verify(ctx context.Context, reqBody IAPRequest, result interface{}) error {
|
||||
func (c *Client) Verify(ctx context.Context, reqBody IAPRequest, result interface{}) (Environment, error) {
|
||||
b := new(bytes.Buffer)
|
||||
if err := json.NewEncoder(b).Encode(reqBody); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("POST", c.ProductionURL, b)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
req.Header.Set("Content-Type", ContentType)
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := c.httpCli.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
return c.parseResponse(resp, result, ctx, reqBody)
|
||||
}
|
||||
|
||||
func (c *Client) parseResponse(resp *http.Response, result interface{}, ctx context.Context, reqBody IAPRequest) error {
|
||||
func (c *Client) parseResponse(resp *http.Response, result interface{}, ctx context.Context, reqBody IAPRequest) (Environment, error) {
|
||||
// Read the body now so that we can unmarshal it twice
|
||||
buf, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(buf, &result)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
// https://developer.apple.com/library/content/technotes/tn2413/_index.html#//apple_ref/doc/uid/DTS40016228-CH1-RECEIPTURL
|
||||
var r StatusResponse
|
||||
err = json.Unmarshal(buf, &r)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
if r.Status == 21007 {
|
||||
b := new(bytes.Buffer)
|
||||
if err := json.NewEncoder(b).Encode(reqBody); err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("POST", c.SandboxURL, b)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
req.Header.Set("Content-Type", ContentType)
|
||||
req = req.WithContext(ctx)
|
||||
resp, err := c.httpCli.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
return json.NewDecoder(resp.Body).Decode(result)
|
||||
// 21007 is found when the receipt is from the test environment
|
||||
return Sandbox, json.NewDecoder(resp.Body).Decode(result)
|
||||
}
|
||||
|
||||
return nil
|
||||
return Production, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user