Medusa plugins
P
Paypal
Paypal payment provider for Medusa v2
Medusa-plugin-paypal
medusa-plugin-paypal is a integration of payment provider for Paypal.
⚠️ Warn
| Requires Medusa v2.7.0 or later.
Installaction
Backend
// medusa-config.js...modules:[{resolve: "@medusajs/medusa/payment",options: {providers: [{resolve: "medusa-plugin-paypal/providers/paypal-payment",id: "payment-paypal",options: {intent:{'CAPTURE' | 'AUTHORIZE'}clientId: {string},clientSecret: {string},sandbox: {boolean},webhookId: {string}},}]}}]plugins: [{resolve: "medusa-paypal-payment",options: {intent:{'CAPTURE' | 'AUTHORIZE'}clientId: {string},clientSecret: {string},sandbox: {boolean},webhookId: {string}},}]
Store
- Create
"use client"import { HttpTypes } from "@medusajs/types"import { createContext } from "react"import {PayPalScriptProvider,ReactPayPalScriptOptions,} from "@paypal/react-paypal-js"type PaypalWrapperProps = {paymentSession: HttpTypes.StorePaymentSessionclientId: stringchildren: React.ReactNode}export const PaypalContext = createContext(false)const PaypalWrapper: React.FC<PaypalWrapperProps> = ({paymentSession,clientId,children,}) => {const initialOptions: ReactPayPalScriptOptions = {clientId,currency: paymentSession.currency_code.toLocaleUpperCase(),intent: "capture",components:"buttons",debug:false}return (<PayPalScriptProvider deferLoading={false} options={initialOptions}>{children}</PayPalScriptProvider>)}export default PaypalWrapper
- Update
// add// !!!isPaypal() is 'pp_paypal'if (isPaypal(paymentSession?.provider_id) && paymentSession) {return (<PaypalWrapperpaymentSession={paymentSession}clientId={paypaylClientId}>{children}</PaypalWrapper>)}
- Update
// add paypal buttonconst PaypalPaymentButton = ({cart,notReady,"data-testid": dataTestId,}: {cart: HttpTypes.StoreCartnotReady: boolean"data-testid"?: string}) => {const [submitting, setSubmitting] = useState(false)const [errorMessage, setErrorMessage] = useState<string | null>(null)const onPaymentCompleted = async () => {await placeOrder()}const handlePayment = async (_data: OnApproveData,actions: OnApproveActions) => {setSubmitting(true)await actions?.order?.capture().then((authorization) => {if (authorization.status !== "COMPLETED") {setSubmitting(false)setErrorMessage(`An error occurred, status: ${authorization.status}`)return}onPaymentCompleted()}).catch((error) => {setErrorMessage(`An unknown error occurred, please try again.`)setSubmitting(false)})}const session = cart.payment_collection?.payment_sessions?.find((s) => s.status === "pending")return (<><PayPalButtonsdisabled={submitting}createOrder={async (data, actions) => {return session?.data.id as string}}onApprove={handlePayment}onError={(err) => {console.error("PayPal Checkout onError", err)}}style={styles}/><ErrorMessageerror={errorMessage}data-testid="paypal-payment-error-message"/></>)}// Update PaymentButtonconst PaymentButton: React.FC<PaymentButtonProps> = ({...switch (true) {...case isPaypal(paymentSession?.provider_id):return (<PaypalPaymentButtonnotReady={notReady}cart={cart}data-testid={dataTestId}/>)...}...})