105 lines
5.0 KiB
Go
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)
|
|
}
|
|
}
|