POST | /sales/paymentprofile/import | Import a Payment Method (using ProfileToken) | After a Payment Method is created in the Vault API (www.clubreadygateway.com), the information has to be imported into the ClubReady system. The Vault API will return a ProfileToken and AcctToken. This endpoint will import a ProfileToken as a separate step. If the ProfileToken is sent to any other endpoints, those endpoints will import the ProfileToken and this endpoint is not needed. ### ProfileToken * JSON Web Token (JWT) * Length is variable, but generally around 1,000 to 4,000 characters * Contains non-PCI information about the Payment Method * Signed by the Vault API, preventing modification * Must be sent to ClubReady API within 5 minutes of creation * Can only be used once (though retrying is allowed) * You can parse and read the JWT, but the format is subject to change without notice * You cannot validate the signature in the JWT as the public key is not available ### AcctToken * A short string that is used to reference the Payment Method in the ClubReady system * Usually around 60 to 80 characters * Should not be stored for long-term use as it can change |
---|
import 'package:servicestack/servicestack.dart';
class PaymentProfileImportRequest implements IConvertible
{
String? ProfileToken;
bool? DoNotUpdatePaymentTypePreference;
int? NewOwnerId;
PaymentProfileImportRequest({this.ProfileToken,this.DoNotUpdatePaymentTypePreference,this.NewOwnerId});
PaymentProfileImportRequest.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
ProfileToken = json['ProfileToken'];
DoNotUpdatePaymentTypePreference = json['DoNotUpdatePaymentTypePreference'];
NewOwnerId = json['NewOwnerId'];
return this;
}
Map<String, dynamic> toJson() => {
'ProfileToken': ProfileToken,
'DoNotUpdatePaymentTypePreference': DoNotUpdatePaymentTypePreference,
'NewOwnerId': NewOwnerId
};
getTypeName() => "PaymentProfileImportRequest";
TypeContext? context = _ctx;
}
// @ApiResponse(Description="", ResponseType=typeof(PaymentProfileImportResponse), StatusCode=200)
class PaymentProfileImportEndpoint extends PaymentProfileImportRequest implements IApiKeyEndpoint, IConvertible
{
/**
* IP address of the end user
*/
// @ApiMember(Description="IP address of the end user", Name="X-Forwarded-For", ParameterType="header")
String? XForwardedFor;
/**
* API Authentication Key
*/
// @ApiMember(Description="API Authentication Key", IsRequired=true, ParameterType="query")
String? ApiKey;
/**
* The ProfileToken JWT to import (see description above)
*/
// @ApiMember(Description="The ProfileToken JWT to import (see description above)", IsRequired=true)
String? ProfileToken;
/**
* When adding a PaymentMethod that is 'on-file' (`IsTemp == true`), the default behavior is toset this PaymentMethod as the preferred method. If you do not wish this to be the preferredmethod, you can set `DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can beomitted or `false`.For non 'on-file' PaymentMethods, this setting is ignored.
*/
// @ApiMember(Description="When adding a PaymentMethod that is 'on-file' (`IsTemp == true`), the default behavior is to\r\nset this PaymentMethod as the preferred method. If you do not wish this to be the preferred\r\nmethod, you can set `DoNotUpdatePaymentTypePreference` to `true`. Otherwise, this can be\r\nomitted or `false`.\r\n\r\nFor non 'on-file' PaymentMethods, this setting is ignored.")
bool? DoNotUpdatePaymentTypePreference;
/**
* **Conditionally Required** When importing a ProfileToken with an OwnerType of `TempStUser`, the ownership will be changed toOwnerType of `User` with the userId of the supplied `NewOwnerId`.This is needed when a PaymentMethod is created for a User that has not been selected or created, yet.
*/
// @ApiMember(Description="**Conditionally Required** \r\n\r\nWhen importing a ProfileToken with an OwnerType of `TempStUser`, the ownership will be changed to\r\nOwnerType of `User` with the userId of the supplied `NewOwnerId`.\r\n\r\nThis is needed when a PaymentMethod is created for a User that has not been selected or created, yet.")
int? NewOwnerId;
PaymentProfileImportEndpoint({this.XForwardedFor,this.ApiKey,this.ProfileToken,this.DoNotUpdatePaymentTypePreference,this.NewOwnerId});
PaymentProfileImportEndpoint.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
super.fromMap(json);
XForwardedFor = json['XForwardedFor'];
ApiKey = json['ApiKey'];
ProfileToken = json['ProfileToken'];
DoNotUpdatePaymentTypePreference = json['DoNotUpdatePaymentTypePreference'];
NewOwnerId = json['NewOwnerId'];
return this;
}
Map<String, dynamic> toJson() => super.toJson()..addAll({
'XForwardedFor': XForwardedFor,
'ApiKey': ApiKey,
'ProfileToken': ProfileToken,
'DoNotUpdatePaymentTypePreference': DoNotUpdatePaymentTypePreference,
'NewOwnerId': NewOwnerId
});
getTypeName() => "PaymentProfileImportEndpoint";
TypeContext? context = _ctx;
}
class PaymentProfile implements IFullNameContainer, IConvertible
{
int? PaymentProfileId;
String? AcctToken;
int? OwnerId;
int? OwnerTypeId;
int? AcctTypeId;
int? AcctClassId;
String? PrefixName;
String? FirstName;
String? MiddleName;
String? LastName;
String? SuffixName;
String? Address1;
String? Address2;
String? Urbanization;
String? City;
String? State;
String? PostalCode;
String? CountryCode;
String? Last4;
int? CcExpMonth;
int? CcExpYear;
bool? IsTemp;
bool? IsDisabled;
DateTime? OnHoldUtc;
int? OnHoldReasonCode;
String? OnHoldReasonDetail;
DateTime? AcctUpdaterFlagUtc;
int? CreatedBy;
DateTime? CreatedUtc;
int? ModifiedBy;
DateTime? ModifiedUtc;
bool? AcctUpdaterFlag;
int? EntryModeId;
bool? ExcludeFromAcctUpdater;
PaymentProfile({this.PaymentProfileId,this.AcctToken,this.OwnerId,this.OwnerTypeId,this.AcctTypeId,this.AcctClassId,this.PrefixName,this.FirstName,this.MiddleName,this.LastName,this.SuffixName,this.Address1,this.Address2,this.Urbanization,this.City,this.State,this.PostalCode,this.CountryCode,this.Last4,this.CcExpMonth,this.CcExpYear,this.IsTemp,this.IsDisabled,this.OnHoldUtc,this.OnHoldReasonCode,this.OnHoldReasonDetail,this.AcctUpdaterFlagUtc,this.CreatedBy,this.CreatedUtc,this.ModifiedBy,this.ModifiedUtc,this.AcctUpdaterFlag,this.EntryModeId,this.ExcludeFromAcctUpdater});
PaymentProfile.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
PaymentProfileId = json['PaymentProfileId'];
AcctToken = json['AcctToken'];
OwnerId = json['OwnerId'];
OwnerTypeId = json['OwnerTypeId'];
AcctTypeId = json['AcctTypeId'];
AcctClassId = json['AcctClassId'];
PrefixName = json['PrefixName'];
FirstName = json['FirstName'];
MiddleName = json['MiddleName'];
LastName = json['LastName'];
SuffixName = json['SuffixName'];
Address1 = json['Address1'];
Address2 = json['Address2'];
Urbanization = json['Urbanization'];
City = json['City'];
State = json['State'];
PostalCode = json['PostalCode'];
CountryCode = json['CountryCode'];
Last4 = json['Last4'];
CcExpMonth = json['CcExpMonth'];
CcExpYear = json['CcExpYear'];
IsTemp = json['IsTemp'];
IsDisabled = json['IsDisabled'];
OnHoldUtc = JsonConverters.fromJson(json['OnHoldUtc'],'DateTime',context!);
OnHoldReasonCode = json['OnHoldReasonCode'];
OnHoldReasonDetail = json['OnHoldReasonDetail'];
AcctUpdaterFlagUtc = JsonConverters.fromJson(json['AcctUpdaterFlagUtc'],'DateTime',context!);
CreatedBy = json['CreatedBy'];
CreatedUtc = JsonConverters.fromJson(json['CreatedUtc'],'DateTime',context!);
ModifiedBy = json['ModifiedBy'];
ModifiedUtc = JsonConverters.fromJson(json['ModifiedUtc'],'DateTime',context!);
AcctUpdaterFlag = json['AcctUpdaterFlag'];
EntryModeId = json['EntryModeId'];
ExcludeFromAcctUpdater = json['ExcludeFromAcctUpdater'];
return this;
}
Map<String, dynamic> toJson() => {
'PaymentProfileId': PaymentProfileId,
'AcctToken': AcctToken,
'OwnerId': OwnerId,
'OwnerTypeId': OwnerTypeId,
'AcctTypeId': AcctTypeId,
'AcctClassId': AcctClassId,
'PrefixName': PrefixName,
'FirstName': FirstName,
'MiddleName': MiddleName,
'LastName': LastName,
'SuffixName': SuffixName,
'Address1': Address1,
'Address2': Address2,
'Urbanization': Urbanization,
'City': City,
'State': State,
'PostalCode': PostalCode,
'CountryCode': CountryCode,
'Last4': Last4,
'CcExpMonth': CcExpMonth,
'CcExpYear': CcExpYear,
'IsTemp': IsTemp,
'IsDisabled': IsDisabled,
'OnHoldUtc': JsonConverters.toJson(OnHoldUtc,'DateTime',context!),
'OnHoldReasonCode': OnHoldReasonCode,
'OnHoldReasonDetail': OnHoldReasonDetail,
'AcctUpdaterFlagUtc': JsonConverters.toJson(AcctUpdaterFlagUtc,'DateTime',context!),
'CreatedBy': CreatedBy,
'CreatedUtc': JsonConverters.toJson(CreatedUtc,'DateTime',context!),
'ModifiedBy': ModifiedBy,
'ModifiedUtc': JsonConverters.toJson(ModifiedUtc,'DateTime',context!),
'AcctUpdaterFlag': AcctUpdaterFlag,
'EntryModeId': EntryModeId,
'ExcludeFromAcctUpdater': ExcludeFromAcctUpdater
};
getTypeName() => "PaymentProfile";
TypeContext? context = _ctx;
}
class PaymentProfileImportResponse implements IConvertible
{
bool? Success;
String? Message;
PaymentProfile? PaymentProfile;
PaymentProfileImportResponse({this.Success,this.Message,this.PaymentProfile});
PaymentProfileImportResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }
fromMap(Map<String, dynamic> json) {
Success = json['Success'];
Message = json['Message'];
PaymentProfile = JsonConverters.fromJson(json['PaymentProfile'],'PaymentProfile',context!);
return this;
}
Map<String, dynamic> toJson() => {
'Success': Success,
'Message': Message,
'PaymentProfile': JsonConverters.toJson(PaymentProfile,'PaymentProfile',context!)
};
getTypeName() => "PaymentProfileImportResponse";
TypeContext? context = _ctx;
}
TypeContext _ctx = TypeContext(library: 'www.clubready.com', types: <String, TypeInfo> {
'PaymentProfileImportRequest': TypeInfo(TypeOf.Class, create:() => PaymentProfileImportRequest()),
'PaymentProfileImportEndpoint': TypeInfo(TypeOf.Class, create:() => PaymentProfileImportEndpoint()),
'PaymentProfile': TypeInfo(TypeOf.Class, create:() => PaymentProfile()),
'PaymentProfileImportResponse': TypeInfo(TypeOf.Class, create:() => PaymentProfileImportResponse()),
});
Dart PaymentProfileImportEndpoint DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .xml suffix or ?format=xml
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /sales/paymentprofile/import HTTP/1.1
Host: www.clubready.com
Accept: application/xml
Content-Type: application/xml
Content-Length: length
<PaymentProfileImportEndpoint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Web.Api.Sales">
<DoNotUpdatePaymentTypePreference xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">false</DoNotUpdatePaymentTypePreference>
<NewOwnerId xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">0</NewOwnerId>
<ProfileToken xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments">String</ProfileToken>
<ApiKey>String</ApiKey>
<XForwardedFor>String</XForwardedFor>
</PaymentProfileImportEndpoint>
HTTP/1.1 200 OK Content-Type: application/xml Content-Length: length <PaymentProfileImportResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ClubReady.Payments"> <Message>String</Message> <PaymentProfile xmlns:d2p1="http://schemas.datacontract.org/2004/07/ClubReady.Payments.PaymentsDb"> <d2p1:AcctClassId>0</d2p1:AcctClassId> <d2p1:AcctToken>String</d2p1:AcctToken> <d2p1:AcctTypeId>0</d2p1:AcctTypeId> <d2p1:AcctUpdaterFlag>false</d2p1:AcctUpdaterFlag> <d2p1:AcctUpdaterFlagUtc>0001-01-01T00:00:00</d2p1:AcctUpdaterFlagUtc> <d2p1:Address1>String</d2p1:Address1> <d2p1:Address2>String</d2p1:Address2> <d2p1:CcExpMonth>0</d2p1:CcExpMonth> <d2p1:CcExpYear>0</d2p1:CcExpYear> <d2p1:City>String</d2p1:City> <d2p1:CountryCode>String</d2p1:CountryCode> <d2p1:CreatedBy>0</d2p1:CreatedBy> <d2p1:CreatedUtc>0001-01-01T00:00:00</d2p1:CreatedUtc> <d2p1:EntryModeId>0</d2p1:EntryModeId> <d2p1:ExcludeFromAcctUpdater>false</d2p1:ExcludeFromAcctUpdater> <d2p1:FirstName>String</d2p1:FirstName> <d2p1:IsDisabled>false</d2p1:IsDisabled> <d2p1:IsTemp>false</d2p1:IsTemp> <d2p1:Last4>String</d2p1:Last4> <d2p1:LastName>String</d2p1:LastName> <d2p1:MiddleName>String</d2p1:MiddleName> <d2p1:ModifiedBy>0</d2p1:ModifiedBy> <d2p1:ModifiedUtc>0001-01-01T00:00:00</d2p1:ModifiedUtc> <d2p1:OnHoldReasonCode>0</d2p1:OnHoldReasonCode> <d2p1:OnHoldReasonDetail>String</d2p1:OnHoldReasonDetail> <d2p1:OnHoldUtc>0001-01-01T00:00:00</d2p1:OnHoldUtc> <d2p1:OwnerId>0</d2p1:OwnerId> <d2p1:OwnerTypeId>0</d2p1:OwnerTypeId> <d2p1:PaymentProfileId>0</d2p1:PaymentProfileId> <d2p1:PostalCode>String</d2p1:PostalCode> <d2p1:PrefixName>String</d2p1:PrefixName> <d2p1:State>String</d2p1:State> <d2p1:SuffixName>String</d2p1:SuffixName> <d2p1:Urbanization>String</d2p1:Urbanization> </PaymentProfile> <Success>false</Success> </PaymentProfileImportResponse>