Unverified Commit 562d35ec authored by Fernando Takagi's avatar Fernando Takagi Committed by GitHub
Browse files

Add IAP purchase validation support for FB Instant Games. (#1126)

parent 6b413939
Loading
Loading
Loading
Loading
+182 −168

File changed.

Preview size limit exceeded, changes collapsed.

+85 −0
Original line number Diff line number Diff line
@@ -3719,6 +3719,40 @@ func local_request_Nakama_ValidatePurchaseHuawei_0(ctx context.Context, marshale

}

func request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
	var protoReq api.ValidatePurchaseFacebookInstantRequest
	var metadata runtime.ServerMetadata

	newReader, berr := utilities.IOReaderFactory(req.Body)
	if berr != nil {
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
	}
	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
	}

	msg, err := client.ValidatePurchaseFacebookInstant(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
	return msg, metadata, err

}

func local_request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
	var protoReq api.ValidatePurchaseFacebookInstantRequest
	var metadata runtime.ServerMetadata

	newReader, berr := utilities.IOReaderFactory(req.Body)
	if berr != nil {
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
	}
	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
	}

	msg, err := server.ValidatePurchaseFacebookInstant(ctx, &protoReq)
	return msg, metadata, err

}

func request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
	var protoReq api.WriteLeaderboardRecordRequest
	var metadata runtime.ServerMetadata
@@ -5938,6 +5972,31 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser

	})

	mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
		ctx, cancel := context.WithCancel(req.Context())
		defer cancel()
		var stream runtime.ServerTransportStream
		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
		var err error
		var annotatedContext context.Context
		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant"))
		if err != nil {
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
			return
		}
		resp, md, err := local_request_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, inboundMarshaler, server, req, pathParams)
		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
		if err != nil {
			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
			return
		}

		forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)

	})

	mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
		ctx, cancel := context.WithCancel(req.Context())
		defer cancel()
@@ -7817,6 +7876,28 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli

	})

	mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
		ctx, cancel := context.WithCancel(req.Context())
		defer cancel()
		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
		var err error
		var annotatedContext context.Context
		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant"))
		if err != nil {
			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
			return
		}
		resp, md, err := request_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, inboundMarshaler, client, req, pathParams)
		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
		if err != nil {
			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
			return
		}

		forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)

	})

	mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
		ctx, cancel := context.WithCancel(req.Context())
		defer cancel()
@@ -8067,6 +8148,8 @@ var (

	pattern_Nakama_ValidatePurchaseHuawei_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "huawei"}, ""))

	pattern_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "facebookinstant"}, ""))

	pattern_Nakama_WriteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, ""))

	pattern_Nakama_WriteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, ""))
@@ -8235,6 +8318,8 @@ var (

	forward_Nakama_ValidatePurchaseHuawei_0 = runtime.ForwardResponseMessage

	forward_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.ForwardResponseMessage

	forward_Nakama_WriteLeaderboardRecord_0 = runtime.ForwardResponseMessage

	forward_Nakama_WriteStorageObjects_0 = runtime.ForwardResponseMessage
+8 −0
Original line number Diff line number Diff line
@@ -706,6 +706,14 @@ service Nakama {
    };
  }

  // Validate FB Instant IAP Receipt
  rpc ValidatePurchaseFacebookInstant (api.ValidatePurchaseFacebookInstantRequest) returns (api.ValidatePurchaseResponse) {
    option (google.api.http) = {
      post: "/v2/iap/purchase/facebookinstant",
      body: "*"
    };
  }

  // Write a record to a leaderboard.
  rpc WriteLeaderboardRecord (api.WriteLeaderboardRecordRequest) returns (api.LeaderboardRecord) {
    option (google.api.http) = {
+50 −2
Original line number Diff line number Diff line
@@ -2225,6 +2225,39 @@
        ]
      }
    },
    "/v2/iap/purchase/facebookinstant": {
      "post": {
        "summary": "Validate FB Instant IAP Receipt",
        "operationId": "Nakama_ValidatePurchaseFacebookInstant",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/apiValidatePurchaseResponse"
            }
          },
          "default": {
            "description": "An unexpected error response.",
            "schema": {
              "$ref": "#/definitions/rpcStatus"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/apiValidatePurchaseFacebookInstantRequest"
            }
          }
        ],
        "tags": [
          "Nakama"
        ]
      }
    },
    "/v2/iap/purchase/google": {
      "post": {
        "summary": "Validate Google IAP Receipt",
@@ -4652,10 +4685,11 @@
      "enum": [
        "APPLE_APP_STORE",
        "GOOGLE_PLAY_STORE",
        "HUAWEI_APP_GALLERY"
        "HUAWEI_APP_GALLERY",
        "FACEBOOK_INSTANT_STORE"
      ],
      "default": "APPLE_APP_STORE",
      "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery",
      "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store",
      "title": "Validation Provider,"
    },
    "apiSubscriptionList": {
@@ -4989,6 +5023,20 @@
      },
      "title": "Apple IAP Purchases validation request"
    },
    "apiValidatePurchaseFacebookInstantRequest": {
      "type": "object",
      "properties": {
        "signedRequest": {
          "type": "string",
          "description": "Base64 encoded Facebook Instant signedRequest receipt data payload."
        },
        "persist": {
          "type": "boolean",
          "title": "Persist the purchase"
        }
      },
      "title": "Facebook Instant IAP Purchase validation request"
    },
    "apiValidatePurchaseGoogleRequest": {
      "type": "object",
      "properties": {
+40 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.3.0
// - protoc             v4.24.2
// - protoc             v4.24.4
// source: apigrpc.proto

package apigrpc
@@ -115,6 +115,7 @@ const (
	Nakama_ValidatePurchaseGoogle_FullMethodName            = "/nakama.api.Nakama/ValidatePurchaseGoogle"
	Nakama_ValidateSubscriptionGoogle_FullMethodName        = "/nakama.api.Nakama/ValidateSubscriptionGoogle"
	Nakama_ValidatePurchaseHuawei_FullMethodName            = "/nakama.api.Nakama/ValidatePurchaseHuawei"
	Nakama_ValidatePurchaseFacebookInstant_FullMethodName   = "/nakama.api.Nakama/ValidatePurchaseFacebookInstant"
	Nakama_WriteLeaderboardRecord_FullMethodName            = "/nakama.api.Nakama/WriteLeaderboardRecord"
	Nakama_WriteStorageObjects_FullMethodName               = "/nakama.api.Nakama/WriteStorageObjects"
	Nakama_WriteTournamentRecord_FullMethodName             = "/nakama.api.Nakama/WriteTournamentRecord"
@@ -278,6 +279,8 @@ type NakamaClient interface {
	ValidateSubscriptionGoogle(ctx context.Context, in *api.ValidateSubscriptionGoogleRequest, opts ...grpc.CallOption) (*api.ValidateSubscriptionResponse, error)
	// Validate Huawei IAP Receipt
	ValidatePurchaseHuawei(ctx context.Context, in *api.ValidatePurchaseHuaweiRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error)
	// Validate FB Instant IAP Receipt
	ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error)
	// Write a record to a leaderboard.
	WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error)
	// Write objects into the storage engine.
@@ -987,6 +990,15 @@ func (c *nakamaClient) ValidatePurchaseHuawei(ctx context.Context, in *api.Valid
	return out, nil
}

func (c *nakamaClient) ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) {
	out := new(api.ValidatePurchaseResponse)
	err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseFacebookInstant_FullMethodName, in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) {
	out := new(api.LeaderboardRecord)
	err := c.cc.Invoke(ctx, Nakama_WriteLeaderboardRecord_FullMethodName, in, out, opts...)
@@ -1172,6 +1184,8 @@ type NakamaServer interface {
	ValidateSubscriptionGoogle(context.Context, *api.ValidateSubscriptionGoogleRequest) (*api.ValidateSubscriptionResponse, error)
	// Validate Huawei IAP Receipt
	ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error)
	// Validate FB Instant IAP Receipt
	ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error)
	// Write a record to a leaderboard.
	WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error)
	// Write objects into the storage engine.
@@ -1416,6 +1430,9 @@ func (UnimplementedNakamaServer) ValidateSubscriptionGoogle(context.Context, *ap
func (UnimplementedNakamaServer) ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseHuawei not implemented")
}
func (UnimplementedNakamaServer) ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseFacebookInstant not implemented")
}
func (UnimplementedNakamaServer) WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) {
	return nil, status.Errorf(codes.Unimplemented, "method WriteLeaderboardRecord not implemented")
}
@@ -2824,6 +2841,24 @@ func _Nakama_ValidatePurchaseHuawei_Handler(srv interface{}, ctx context.Context
	return interceptor(ctx, in, info, handler)
}

func _Nakama_ValidatePurchaseFacebookInstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(api.ValidatePurchaseFacebookInstantRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(NakamaServer).ValidatePurchaseFacebookInstant(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: Nakama_ValidatePurchaseFacebookInstant_FullMethodName,
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(NakamaServer).ValidatePurchaseFacebookInstant(ctx, req.(*api.ValidatePurchaseFacebookInstantRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Nakama_WriteLeaderboardRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(api.WriteLeaderboardRecordRequest)
	if err := dec(in); err != nil {
@@ -3193,6 +3228,10 @@ var Nakama_ServiceDesc = grpc.ServiceDesc{
			MethodName: "ValidatePurchaseHuawei",
			Handler:    _Nakama_ValidatePurchaseHuawei_Handler,
		},
		{
			MethodName: "ValidatePurchaseFacebookInstant",
			Handler:    _Nakama_ValidatePurchaseFacebookInstant_Handler,
		},
		{
			MethodName: "WriteLeaderboardRecord",
			Handler:    _Nakama_WriteLeaderboardRecord_Handler,
Loading