|
@@ -1,13 +1,24 @@
|
|
|
"use client";
|
|
"use client";
|
|
|
|
|
|
|
|
import { useRouter } from 'next/navigation'
|
|
import { useRouter } from 'next/navigation'
|
|
|
|
|
+import { useRef } from 'react';
|
|
|
|
|
+import { Payment } from "@airwallex/components-sdk";
|
|
|
import PaypalButton from "./PaymentButton/PaypalButton";
|
|
import PaypalButton from "./PaymentButton/PaypalButton";
|
|
|
import { overlayLoading } from "@/components/theme/ui/kernel/loading/api";
|
|
import { overlayLoading } from "@/components/theme/ui/kernel/loading/api";
|
|
|
-import { PlaceOrderFunction } from "@/types/checkout/type";
|
|
|
|
|
|
|
+import { PlaceOrderFunction,KlarnaOtherData } from "@/types/checkout/type";
|
|
|
import { useCustomToast } from "@/utils/hooks/useToast";
|
|
import { useCustomToast } from "@/utils/hooks/useToast";
|
|
|
import { usePlaceOrder } from "@/utils/hooks/usePlaceOrder";
|
|
import { usePlaceOrder } from "@/utils/hooks/usePlaceOrder";
|
|
|
import { confirmDialog } from "@/components/theme/ui/kernel/confirm/api";
|
|
import { confirmDialog } from "@/components/theme/ui/kernel/confirm/api";
|
|
|
import { useConfig } from '@utils/hooks/useConfig';
|
|
import { useConfig } from '@utils/hooks/useConfig';
|
|
|
|
|
+import KlarnaButton from "./PaymentButton/KlarnaButton";
|
|
|
|
|
+import { CartAddress } from "@/types/cart/type";
|
|
|
|
|
+
|
|
|
|
|
+interface TestKlarnaData {
|
|
|
|
|
+ billingAddress: CartAddress | undefined;
|
|
|
|
|
+ shippingAddress: CartAddress | undefined;
|
|
|
|
|
+ webOrderId: string;
|
|
|
|
|
+ verifyToken: string;
|
|
|
|
|
+}
|
|
|
export default function CheckoutPlaceOrder({
|
|
export default function CheckoutPlaceOrder({
|
|
|
paymentMethod,
|
|
paymentMethod,
|
|
|
clickPlaceOrder,
|
|
clickPlaceOrder,
|
|
@@ -25,7 +36,15 @@ export default function CheckoutPlaceOrder({
|
|
|
const paypalCreateOrder = async () => {
|
|
const paypalCreateOrder = async () => {
|
|
|
overlayLoading.start();
|
|
overlayLoading.start();
|
|
|
const valid = await validateCheckout();
|
|
const valid = await validateCheckout();
|
|
|
- if(!valid) {overlayLoading.stop();}
|
|
|
|
|
|
|
+ if(!valid) {
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ return {
|
|
|
|
|
+ error: true,
|
|
|
|
|
+ msg: '',
|
|
|
|
|
+ orderId: '',
|
|
|
|
|
+ webOrderId: ''
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
// 校验通过
|
|
// 校验通过
|
|
|
const placeOrderRes = await clickPlaceOrder();
|
|
const placeOrderRes = await clickPlaceOrder();
|
|
|
if(placeOrderRes.data !== null) {
|
|
if(placeOrderRes.data !== null) {
|
|
@@ -49,7 +68,10 @@ export default function CheckoutPlaceOrder({
|
|
|
const airwallexPlaceOrder = async () => {
|
|
const airwallexPlaceOrder = async () => {
|
|
|
overlayLoading.start();
|
|
overlayLoading.start();
|
|
|
const valid = await validateCheckout();
|
|
const valid = await validateCheckout();
|
|
|
- if(!valid) {overlayLoading.stop();}
|
|
|
|
|
|
|
+ if(!valid) {
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const placeOrderRes = await clickPlaceOrder({
|
|
const placeOrderRes = await clickPlaceOrder({
|
|
|
paymentSuccessUrl: window.location.origin + '/paymentresult/result'
|
|
paymentSuccessUrl: window.location.origin + '/paymentresult/result'
|
|
@@ -63,9 +85,12 @@ export default function CheckoutPlaceOrder({
|
|
|
const cardAirwallexPlaceOrder = async () => {
|
|
const cardAirwallexPlaceOrder = async () => {
|
|
|
overlayLoading.start();
|
|
overlayLoading.start();
|
|
|
const valid = await validateCheckout();
|
|
const valid = await validateCheckout();
|
|
|
- if(!valid) {overlayLoading.stop();}
|
|
|
|
|
|
|
+ if(!valid) {
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- const placeOrderRes = await clickPlaceOrder();
|
|
|
|
|
|
|
+ const placeOrderRes = await clickPlaceOrder<Payment.CardNumberElementType>();
|
|
|
if(placeOrderRes.data !== null && placeOrderRes.otherData !== null) {
|
|
if(placeOrderRes.data !== null && placeOrderRes.otherData !== null) {
|
|
|
const webOrderId = placeOrderRes.data.orderId;
|
|
const webOrderId = placeOrderRes.data.orderId;
|
|
|
const cardNumberElement = placeOrderRes.otherData;
|
|
const cardNumberElement = placeOrderRes.otherData;
|
|
@@ -94,7 +119,10 @@ export default function CheckoutPlaceOrder({
|
|
|
if(window.AfterPay) {
|
|
if(window.AfterPay) {
|
|
|
overlayLoading.start();
|
|
overlayLoading.start();
|
|
|
const valid = await validateCheckout();
|
|
const valid = await validateCheckout();
|
|
|
- if(!valid) {overlayLoading.stop();}
|
|
|
|
|
|
|
+ if(!valid) {
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const placeOrderRes = await clickPlaceOrder({
|
|
const placeOrderRes = await clickPlaceOrder({
|
|
|
paymentSuccessUrl: window.location.origin + '/paymentresult/result',
|
|
paymentSuccessUrl: window.location.origin + '/paymentresult/result',
|
|
@@ -166,6 +194,178 @@ export default function CheckoutPlaceOrder({
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ const klarnaTestRef= useRef<TestKlarnaData| null>(null);
|
|
|
|
|
+ const klarnaPlaceOrder = async () => {
|
|
|
|
|
+ overlayLoading.start();
|
|
|
|
|
+ const valid = await validateCheckout();
|
|
|
|
|
+ if(!valid) {
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const placeOrderRes = await clickPlaceOrder<KlarnaOtherData>({
|
|
|
|
|
+ paymentSuccessUrl: window.location.origin + '/paymentresult/result',
|
|
|
|
|
+ paymentCancelUrl: window.location.origin + '/paymentresult/result'
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ if(placeOrderRes.data !== null && placeOrderRes.otherData) {
|
|
|
|
|
+ const klarnaToken = placeOrderRes.data.gatewayOrderId;
|
|
|
|
|
+ const webOrderId = placeOrderRes.data.orderId;
|
|
|
|
|
+ const {billingAddress, shippingAddress} = placeOrderRes.otherData;
|
|
|
|
|
+
|
|
|
|
|
+ const klarnaClientToken = klarnaToken.split("|")[0];
|
|
|
|
|
+ const klarnaVerifyToken = klarnaToken.split("|")[1];
|
|
|
|
|
+
|
|
|
|
|
+ klarnaTestRef.current = {
|
|
|
|
|
+ billingAddress: billingAddress,
|
|
|
|
|
+ shippingAddress: shippingAddress,
|
|
|
|
|
+ webOrderId: webOrderId,
|
|
|
|
|
+ verifyToken: klarnaVerifyToken
|
|
|
|
|
+ };
|
|
|
|
|
+ console.log('klarna otherData ---- ', placeOrderRes.otherData);
|
|
|
|
|
+ window.Klarna.Payments.init({
|
|
|
|
|
+ client_token: klarnaClientToken,
|
|
|
|
|
+ });
|
|
|
|
|
+ //klarna-widget-container
|
|
|
|
|
+ window.Klarna.Payments.load({
|
|
|
|
|
+ container: '#klarna-widget-container',
|
|
|
|
|
+ }, (response) => {
|
|
|
|
|
+ console.log('Widget loaded:', response.show_form ? 'Success' : 'Warning');
|
|
|
|
|
+ if(!response.show_form) { // klarna不可用
|
|
|
|
|
+ // 跳转结果页
|
|
|
|
|
+ router.replace('/paymentresult/result?orderId=' + webOrderId + '&return_result=failure');
|
|
|
|
|
+ } else {
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ window.Klarna.Payments.authorize(
|
|
|
|
|
+ {},
|
|
|
|
|
+ {
|
|
|
|
|
+ // billing_address: {
|
|
|
|
|
+ // given_name: billingAddress.firstName,
|
|
|
|
|
+ // family_name: billingAddress.lastName,
|
|
|
|
|
+ // email: billingAddress.email,
|
|
|
|
|
+ // phone: billingAddress.phone,
|
|
|
|
|
+ // street_address: billingAddress.address,
|
|
|
|
|
+ // postal_code: billingAddress.postcode,
|
|
|
|
|
+ // city: billingAddress.city,
|
|
|
|
|
+ // country: billingAddress.country
|
|
|
|
|
+ // },
|
|
|
|
|
+ shipping_address: {
|
|
|
|
|
+ given_name: shippingAddress.firstName,
|
|
|
|
|
+ family_name: shippingAddress.lastName,
|
|
|
|
|
+ email: shippingAddress.email,
|
|
|
|
|
+ street_address: shippingAddress.address,
|
|
|
|
|
+ postal_code: shippingAddress.postcode,
|
|
|
|
|
+ city: shippingAddress.city,
|
|
|
|
|
+ phone: shippingAddress.phone,
|
|
|
|
|
+ region: shippingAddress.state,
|
|
|
|
|
+ country: shippingAddress.country
|
|
|
|
|
+ },
|
|
|
|
|
+ // customer: {
|
|
|
|
|
+ // date_of_birth: "1941-03-21",
|
|
|
|
|
+ // },
|
|
|
|
|
+ },
|
|
|
|
|
+ async function(res) {
|
|
|
|
|
+ console.debug(res);
|
|
|
|
|
+ if(res.approved && res.authorization_token) { // 可以支付
|
|
|
|
|
+
|
|
|
|
|
+ const resCallback = await createPaymentCallback({
|
|
|
|
|
+ orderId: Number(webOrderId),
|
|
|
|
|
+ gatewayOrderId: res.authorization_token,
|
|
|
|
|
+ verifyToken: klarnaVerifyToken,
|
|
|
|
|
+ status: "success",
|
|
|
|
|
+ });
|
|
|
|
|
+ // 跳转结果页
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ if(!resCallback.error) {
|
|
|
|
|
+ router.replace('/paymentresult/result?orderId=' + webOrderId + '&return_result=success');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // callback 失败,提示错误
|
|
|
|
|
+ confirmDialog({
|
|
|
|
|
+ title: "Somthing Wrong",
|
|
|
|
|
+ content: resCallback.msg + " Please contact customer service." + " OrderId: "+ webOrderId,
|
|
|
|
|
+ noCancel: true,
|
|
|
|
|
+ }).then(() => {
|
|
|
|
|
+ router.replace('/');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // if(res.show_form) { // klarna可用,但是有报错
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // // klarna 不可用 跳转结果页
|
|
|
|
|
+ // }
|
|
|
|
|
+ overlayLoading.stop();
|
|
|
|
|
+ router.replace('/paymentresult/result?orderId=' + webOrderId + '&return_result=failure');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const testKlarna = () => {
|
|
|
|
|
+ if(klarnaTestRef.current === null) return;
|
|
|
|
|
+ const billingAddress = klarnaTestRef.current.billingAddress;
|
|
|
|
|
+ const shippingAddress = klarnaTestRef.current.shippingAddress;
|
|
|
|
|
+ const webOrderId = klarnaTestRef.current.webOrderId;
|
|
|
|
|
+ const verifyToken = klarnaTestRef.current.verifyToken;
|
|
|
|
|
+ window.Klarna.Payments.authorize(
|
|
|
|
|
+ {},
|
|
|
|
|
+ {
|
|
|
|
|
+ billing_address: {
|
|
|
|
|
+ given_name: billingAddress?.firstName,
|
|
|
|
|
+ family_name: billingAddress?.lastName,
|
|
|
|
|
+ email: billingAddress?.email,
|
|
|
|
|
+ phone: billingAddress?.phone,
|
|
|
|
|
+ street_address: billingAddress?.address,
|
|
|
|
|
+ postal_code: billingAddress?.postcode,
|
|
|
|
|
+ city: billingAddress?.city,
|
|
|
|
|
+ country: billingAddress?.country
|
|
|
|
|
+ },
|
|
|
|
|
+ shipping_address: {
|
|
|
|
|
+ given_name: shippingAddress?.firstName,
|
|
|
|
|
+ family_name: shippingAddress?.lastName,
|
|
|
|
|
+ email: shippingAddress?.email,
|
|
|
|
|
+ street_address: shippingAddress?.address,
|
|
|
|
|
+ postal_code: shippingAddress?.postcode,
|
|
|
|
|
+ city: shippingAddress?.city,
|
|
|
|
|
+ phone: shippingAddress?.phone,
|
|
|
|
|
+ country: shippingAddress?.country
|
|
|
|
|
+ },
|
|
|
|
|
+ // customer: {
|
|
|
|
|
+ // date_of_birth: "1941-03-21",
|
|
|
|
|
+ // },
|
|
|
|
|
+ },
|
|
|
|
|
+ async function(res) {
|
|
|
|
|
+ console.debug(res);
|
|
|
|
|
+ if(res.approved && res.authorization_token) { // 可以支付
|
|
|
|
|
+
|
|
|
|
|
+ const resCallback = await createPaymentCallback({
|
|
|
|
|
+ orderId: Number(webOrderId),
|
|
|
|
|
+ gatewayOrderId: res.authorization_token,
|
|
|
|
|
+ verifyToken: verifyToken,
|
|
|
|
|
+ status: "success",
|
|
|
|
|
+ });
|
|
|
|
|
+ // @todu 跳转结果页
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // if(res.show_form) { // klarna可用,但是有报错
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // // klarna 不可用 跳转结果页
|
|
|
|
|
+ // }
|
|
|
|
|
+ router.replace('/paymentresult/result?orderId=' + webOrderId + '&return_result=failure');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
<>
|
|
<>
|
|
|
<div className="relative w-full">
|
|
<div className="relative w-full">
|
|
@@ -195,6 +395,14 @@ export default function CheckoutPlaceOrder({
|
|
|
Place Order
|
|
Place Order
|
|
|
</button>
|
|
</button>
|
|
|
}
|
|
}
|
|
|
|
|
+ {paymentMethod === 'klarna' &&
|
|
|
|
|
+ <>
|
|
|
|
|
+ <button className="flex items-center justify-center w-25 h-12 bg-ly-green text-white text-ly-12 font-bold"
|
|
|
|
|
+ onClick={testKlarna}
|
|
|
|
|
+ >Test</button>
|
|
|
|
|
+ <KlarnaButton clickHandler={klarnaPlaceOrder} />
|
|
|
|
|
+ </>
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|