Files
go-iap/hms/modifier.go
2020-09-16 14:03:08 +08:00

105 lines
5.0 KiB
Go

package hms
import (
"context"
"encoding/json"
"fmt"
"log"
)
// CancelSubscriptionRenewal Cancel a aubscription from auto-renew when expired.
// Note that this does not cancel the current subscription.
// If you want to revoke a subscription, use Client.RevokeSubscription() instead.
// Source code originated from https://github.com/HMS-Core/hms-iap-serverdemo/blob/92241f97fed1b68ddeb7cb37ea4ca6e6d33d2a87/demo/subscription.go#L54
// Document: https://developer.huawei.com/consumer/en/doc/HMSCore-References-V5/api-cancel-subscription-0000001050746115-V5
func (c *Client) CancelSubscriptionRenewal(ctx context.Context, purchaseToken, subscriptionID string, accountFlag int64) (success bool, responseMessage string, err error) {
bodyMap := map[string]string{
"subscriptionId": subscriptionID,
"purchaseToken": purchaseToken,
}
var resp ModifySubscriptionResponse
success, resp, err = c.modifySubscriptionQuery(ctx, bodyMap, accountFlag, "/sub/applications/v2/purchases/stop")
responseMessage = resp.ResponseMessage
return
}
// ExtendSubscription extend the current subscription expiration date without chanrging the customer.
// Source code originated from https://github.com/HMS-Core/hms-iap-serverdemo/blob/92241f97fed1b68ddeb7cb37ea4ca6e6d33d2a87/demo/subscription.go#L68
// Document: https://developer.huawei.com/consumer/en/doc/HMSCore-References-V5/api-refund-subscription-fee-0000001050986131-V5
func (c *Client) ExtendSubscription(ctx context.Context, purchaseToken, subscriptionID string, currentExpirationTime, desiredExpirationTime int64, accountFlag int64) (success bool, responseMessage string, newExpirationTime int64, err error) {
bodyMap := map[string]string{
"subscriptionId": subscriptionID,
"purchaseToken": purchaseToken,
"currentExpirationTime": fmt.Sprintf("%v", currentExpirationTime),
"desiredExpirationTime": fmt.Sprintf("%v", desiredExpirationTime),
}
var resp ModifySubscriptionResponse
success, resp, err = c.modifySubscriptionQuery(ctx, bodyMap, accountFlag, "/sub/applications/v2/purchases/delay")
responseMessage = resp.ResponseMessage
newExpirationTime = resp.NewExpirationTime
return
}
// RefundSubscription refund a subscription payment.
// Note that this does not cancel the current subscription.
// If you want to revoke a subscription, use Client.RevokeSubscription() instead.
// Source code originated from https://github.com/HMS-Core/hms-iap-serverdemo/blob/92241f97fed1b68ddeb7cb37ea4ca6e6d33d2a87/demo/subscription.go#L84
// Document: https://developer.huawei.com/consumer/en/doc/HMSCore-References-V5/api-refund-subscription-fee-0000001050986131-V5
func (c *Client) RefundSubscription(ctx context.Context, purchaseToken, subscriptionID string, accountFlag int64) (success bool, responseMessage string, err error) {
bodyMap := map[string]string{
"subscriptionId": subscriptionID,
"purchaseToken": purchaseToken,
}
var resp ModifySubscriptionResponse
success, resp, err = c.modifySubscriptionQuery(ctx, bodyMap, accountFlag, "/sub/applications/v2/purchases/returnFee")
responseMessage = resp.ResponseMessage
return
}
// RevokeSubscription will revoke and issue a refund on a subscription immediately.
// Source code originated from https://github.com/HMS-Core/hms-iap-serverdemo/blob/92241f97fed1b68ddeb7cb37ea4ca6e6d33d2a87/demo/subscription.go#L99
// Document: https://developer.huawei.com/consumer/en/doc/HMSCore-References-V5/api-unsubscribe-0000001051066056-V5
func (c *Client) RevokeSubscription(ctx context.Context, purchaseToken, subscriptionID string, accountFlag int64) (success bool, responseMessage string, err error) {
bodyMap := map[string]string{
"subscriptionId": subscriptionID,
"purchaseToken": purchaseToken,
}
var resp ModifySubscriptionResponse
success, resp, err = c.modifySubscriptionQuery(ctx, bodyMap, accountFlag, "/sub/applications/v2/purchases/withdrawal")
responseMessage = resp.ResponseMessage
return
}
// ModifySubscriptionResponse JSON response from {rootUrl}/sub/applications/v2/purchases/stop|delay|returnFee|withdrawal
type ModifySubscriptionResponse struct {
ResponseCode string `json:"responseCode"`
ResponseMessage string `json:"responseMessage;omitempty"`
NewExpirationTime int64 `json:"newExpirationTime;omitempty"`
}
// public method to query {rootUrl}/sub/applications/v2/purchases/stop|delay|returnFee|withdrawal
func (c *Client) modifySubscriptionQuery(ctx context.Context, requestBodyMap map[string]string, accountFlag int64, uri string) (success bool, response ModifySubscriptionResponse, err error) {
url := c.getRootSubscriptionURLByFlag(accountFlag) + uri
bodyBytes, err := c.sendJSONRequest(ctx, url, requestBodyMap)
if err != nil {
return false, response, err
}
// debug
log.Println("url:", url)
log.Println("request:", requestBodyMap)
log.Printf("%s", bodyBytes)
if err := json.Unmarshal(bodyBytes, &response); err != nil {
return false, response, err
}
switch response.ResponseCode {
case "0":
return true, response, nil
default:
return false, response, c.getResponseErrorByCode(response.ResponseCode)
}
}