1729591588
2024-10-21 07:35:00
どこにでもあるトークン
特にクレジットカード決済の場合はそうです。 Optimizely Commerce にはクレジット カードによる支払い方法が含まれていますが、現在は使用できません。時代遅れとなり、条件を満たしていないため、すぐに削除されます PCIコンプライアンス。問題はどうやら次のようなところにあります クレジットカードデータの保存 プレーンテキストで。
最新のアプローチでは、クレジット カードの認証情報を安全な場所に保存する必要があります。 完全に暗号化されたストレージ、これにより、外部の専門サービスを使用することになります。 Optimizely のコードベースを詳しく調べると、ここで完全に使用できる、TokenizedPaymentMethod という名前の組み込みの支払い方法があることがわかります。ただし、これを書いている時点では、新しい API は安定していないことに注意してください。
独自のソリューション
この場合、もちろん独自の支払いを作成することもできます。残念ながら、それは思っているほど簡単ではありません。それには、他の人の経験を利用したり、Foundation などのパブリック リポジトリで利用可能な既存の支払い拡張機能を調べたりして、少し調査する必要があります。これが私が最近陥った状況です。この投稿では、私が発見したことと実装したことについて説明します。
実行する必要があるのは、シンプルで広く知られているロジックです。注文の送信時に請求されるクレジット カード データを入力できる支払いフォームのあるチェックアウト ページ。ここでフォームを紹介します。データを収集し、次のような外部システムに送信します。 ストライプまたはフォルティス それを保管するために。その代わりに、後でデータを取得できるようにするトークンを取得します。有効期限、クレジット カード番号の最初の 6 桁と最後の 4 桁などのデータ。トークンはコマースに保存する必要があります。最も適切な場所は支払いオブジェクトです。
コーディング時間
まず、カスタム支払いを作成する必要があります。このクラスは抽象 Payment クラスを継承しており、 [Serializable] 属性。
[Serializable]
public class TokenizedCreditCardPayment : Mediachase.Commerce.Orders.Payment
{
public static Lazy TokenizedCreditCardPaymentMetaClass => new(MetaClass.Load(OrderContext.MetaDataContext, TokenizedCreditCardPaymentMetaData.TokenizedPaymentMetaClassName));
public TokenizedCreditCardPayment() : base(TokenizedCreditCardPaymentMetaClass.Value)
{
PaymentType = PaymentType.CreditCard;
ImplementationClass = GetType().AssemblyQualifiedName;
}
protected TokenizedCreditCardPayment(SerializationInfo info, StreamingContext context) : base(info, context)
{
PaymentType = PaymentType.CreditCard;
ImplementationClass = GetType().AssemblyQualifiedName;
}
public string CreditCardToken
{
get => GetString(TokenizedCreditCardPaymentMetaData.TokenizedCreditCardTokenMetaField);
set => this[TokenizedCreditCardPaymentMetaData.TokenizedCreditCardTokenMetaField] = value;
}
}
示されているように、MetaClass を参照します。ここで本当に重要なことは、MetaClass が必要なすべてのフィールド (この場合は CreditCardToken) とともに初期化モジュールで最初に作成される必要があるということです。これなしでは動作しませんが、システムは実行中にエラーを出しません。ゴースト メタクラスが使用されていることを示す例外はありません。支払いを初期化したら、先に進んで支払い方法を作成できます。
実際の支払いが行われる場所
これは、Foundation コードベースで見られる非常に標準的な方法で実装されています。 CreatePayment メソッドで、新しい支払いオブジェクトを作成する必要があります。
ここで重要なのはコンストラクターです。これは、メソッドを実行するときの非常に標準的なものであることに気付きました (このロジックは、ほぼすべての例で見ることができます)。現在の市場のコマース管理ビューで構成されている利用可能なメソッドを見つける必要があります。見つかった場合は、オブジェクトに MethodId または Name を割り当てる必要があります。
public class TokenizedCreditCardPaymentMethod : IPaymentMethod
{
public Guid PaymentMethodId { get; }
public string Name { get; }
public string Description { get; }
public string SystemKeyword => "TokenizedCreditCard";
public TokenizedCreditCardPaymentMethod(IPaymentMethodsService paymentMethodsService)
{
var availablePaymentMethods = paymentMethodsService?.GetAvailablePaymentMethods();
var paymentMethod = availablePaymentMethods?.FirstOrDefault(x =>
string.Equals(x.SystemKeyword, SystemKeyword, StringComparison.InvariantCultureIgnoreCase));
if (paymentMethod == null)
{
return;
}
PaymentMethodId = paymentMethod.Id;
Name = paymentMethod.Name;
Description = paymentMethod.Description;
}
public bool ValidateData() => true;
public IPayment CreatePayment(decimal amount, IOrderGroup orderGroup)
{
var payment = new TokenizedCreditCardPayment
{
PaymentMethodName = SystemKeyword,
PaymentMethodId = PaymentMethodId,
Amount = amount,
TransactionType = TransactionType.Capture.ToString(),
Status = PaymentStatus.Pending.ToString(),
PaymentType = PaymentType.CreditCard
};
return payment;
}
}
利用可能なメソッドをすべて取得するには、静的クラスである PaymentManager を使用する必要があります。これは最善のものではないため、より柔軟でテストしやすくするために、IPaymentMethodsService でラップされています。
あと一つだけ
新しい支払いフローを使用する前に、いくつかの構成を実行する必要があります。
まず、次のことを行う必要があります。 お支払い方法を登録してください .NET の他のサービス (services.addTransient) と同様に DI に保存されるので、必要なときにいつでもロードできます。ロード自体については、登録されているすべてのメソッドを取得し、特定のシナリオで使用可能なメソッドの解決を試みる単純なローダー サービスを実装できます。タイプまたはメソッド ID によって検索できます。
internal class PaymentMethodLoader : IPaymentMethodLoader
{
private readonly IEnumerable _paymentMethods;
private readonly IPaymentMethodsService _paymentMethodsService;
public PaymentMethodLoader(IEnumerable paymentMethods, IPaymentMethodsService paymentMethodsService )
{
_paymentMethods = paymentMethods;
_paymentMethodsService = paymentMethodsService;
}
public T GetPaymentMethodT>(string systemKeyword) where T : class, IPaymentMethod
{
var availableMethods = _paymentMethodsService.GetAvailablePaymentMethods();
var resultMethodDefinition = availableMethods.FirstOrDefault(x => x.SystemKeyword == systemKeyword);
if (resultMethodDefinition == null)
{
return default;
}
var resultMethod = _paymentMethods.FirstOrDefault(x => x.PaymentMethodId == resultMethodDefinition.Id);
return resultMethod as T;
}
}
次のステップは、新しいメソッドを利用できるようにすることです。これを行うには、Web サイトを実行し、支払い設定を見つけることができるコマース管理者に移動する必要があります。新しい支払い方法を追加し、それをアクティブにして、目的の市場で利用できるようにする必要があります。
これで、フローを実装する準備が整いました。これは完全にカスタマイズできます。たとえば、 APIエンドポイント /チェックアウト/支払い 支払いを更新できる場所。この API は、ローダー サービスから支払い方法を取得し、支払いを作成し、カート/注文に追加して保存します。
次は何でしょうか?
クレジット カード トークンは、支払いオブジェクト内の注文フォームに保存されます。そのおかげで、必要に応じていつでも外部サービスに保存されているクレジット カードの詳細を問い合わせることができ、たとえばチェックアウトのレビュー ステップ ページに限られたクレジット カード データを表示することができます。
#Optimizely #Commerce #のカスタム支払い