1
0

mv-payment-handler.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { OrderType } from '@vendure/common/lib/generated-types';
  2. import {
  3. CreatePaymentResult,
  4. LanguageCode,
  5. PaymentMethodHandler,
  6. SettlePaymentErrorResult,
  7. SettlePaymentResult,
  8. } from '@vendure/core';
  9. import { MyConnectSdk } from '../payment/mv-connect-sdk';
  10. const sdk = new MyConnectSdk({ apiKey: 'MY_API_KEY' });
  11. export const multivendorPaymentMethodHandler = new PaymentMethodHandler({
  12. code: 'mv-connect-payment-method',
  13. description: [
  14. {
  15. languageCode: LanguageCode.en,
  16. value: 'Multivendor Payment Provider',
  17. },
  18. ],
  19. args: {},
  20. createPayment: async (ctx, order, amount, args, metadata) => {
  21. if (order.type === OrderType.Seller) {
  22. try {
  23. // Create a Transfer payment to the Seller's account
  24. const result = await sdk.createTransfer({
  25. amount,
  26. currency: order.currencyCode,
  27. connectedAccountId: metadata.connectedAccountId,
  28. transfer_group: metadata.transfer_group,
  29. });
  30. return {
  31. amount,
  32. state: 'Settled' as const,
  33. transactionId: result.transactionId,
  34. metadata,
  35. };
  36. } catch (err: any) {
  37. return {
  38. amount,
  39. state: 'Declined' as const,
  40. metadata: {
  41. errorMessage: err.message,
  42. },
  43. };
  44. }
  45. } else {
  46. try {
  47. // Create a payment to the platform's account,
  48. // and set the `transfer_group` option to later link
  49. // with the Seller transfers after the Seller orders
  50. // have been created.
  51. const result = await sdk.createPayment({
  52. amount,
  53. currency: order.currencyCode,
  54. transfer_group: order.code,
  55. });
  56. return {
  57. amount,
  58. state: 'Settled' as const,
  59. transactionId: result.transactionId,
  60. metadata: {
  61. transfer_group: order.code,
  62. },
  63. };
  64. } catch (err: any) {
  65. return {
  66. amount,
  67. state: 'Declined' as const,
  68. metadata: {
  69. errorMessage: err.message,
  70. },
  71. };
  72. }
  73. }
  74. },
  75. settlePayment: async (ctx, order, payment, args) => {
  76. return { success: true };
  77. },
  78. });