Имитация ошибок PayPal в учетной записи песочницы - PullRequest
0 голосов
/ 26 февраля 2019

Я интегрирую платеж PayPal в разрабатываемое веб-приложение.Мне нужно создать авторизацию для транзакции, в которой я блокирую определенную сумму (скажем, 20 €), затем в конце транзакции я завершаю транзакцию и беру только те деньги, которые мне нужны (поэтому, если транзакцияокончательная стоимость составляет 15 €, я возвращаю 5 € пользователю.)

Этот рабочий процесс в настоящее время работает с учетной записью песочницы, но теперь я хотел протестировать некоторые ошибки, которые могут возникнуть при запуске новой транзакции, напримернапример, когда у пользователя нет достаточной суммы денег (20 €), которую мне нужно заблокировать, чтобы начать новую транзакцию.

Я нашел эту документацию (https://developer.paypal.com/docs/api/test-values/#invoke-negative-testing), где онауказано To trigger the SENDER_EMAIL_UNCONFIRMED simulation response, set the items[0]/note value to ERRPYO002 in the POST v1/payments/payouts call. со следующим кодом:

curl -X POST https://api.sandbox.paypal.com/v1/payments/payouts \
  -H "content-type: application/json" \
  -H "Authorization: Bearer Access-Token" \
  -d '{
  "sender_batch_header": {
    "sender_batch_id": "1524086406556",
    "email_subject": "This email is related to simulation"
  },
  "items": [
  {
    "recipient_type": "EMAIL",
    "receiver": "payouts-simulator-receiver@paypal.com",
    "note": "ERRPYO002",
    "sender_item_id": "15240864065560",
    "amount": {
      "currency": "USD",
      "value": "1.00"
    }
  }]
}'

Поэтому я предполагаю, что мне нужно передать код ошибки (например, ERRPYO002) в поле note в моем теле запроса.

Я использую checkout sdk, и мой js-код в настоящее время выглядит следующим образом:

const buttonOpts = {
    env: 'sandbox',
    client: { production: $scope.key, sandbox: $scope.key },
    style: {
        label: 'paypal',
        size: 'medium',
        shape: 'rect',
        color: 'blue',
        tagline: false,
    },

    validate: actions => {
        // stuff
    },
    payment: (data, actions) => {
        return actions.payment.create({
            intent: 'authorize',
            payer: { payment_method: 'paypal' },
            transactions: [
                {
                    amount: {
                        total: '20.00',
                        currency: 'EUR',
                    },
                    description: 'My description',
                },
            ],
        });
    },
    onAuthorize: data => {
        // Sending data.paymentID and data.payerID to my backend to confirm the new transaction
    },
    onCancel: () => {
        // stuff
    },
    onError: err => {
        console.log(err);
        // stuff
    },
};

Paypal.Button.render(buttonOpts, '#paypal-button');

Я предполагаю, что мне нужно передать код, необходимый для имитации ошибки, моему actions.payment.create параметру объекта, но я не нашел, где именно, поскольку мой рабочий процесс отличается от того, что в документах.

Это коды, которые PayPal позволяет вам использовать для тестирования ошибок: https://developer.paypal.com/docs/payouts/integrate/test-payouts/#test-values

Любая помощь приветствуется.Большое спасибо.

1 Ответ

0 голосов
/ 26 февраля 2019

Хорошо, я действительно узнал, как решить эту проблему сразу после того, как опубликовал этот вопрос.Я просто опубликую свое решение здесь для всех, у кого может возникнуть эта проблема в будущем.

Объект опций, который я разместил, на самом деле правильный, как и сейчас, поэтому после того, как пользователь подтвердит, что он / она хочет запуститьновую транзакцию я получаю payerID и paymentID для отправки на мой бэкэнд.В моей бэкэнд-функции я изменил свой код так, что он выглядит следующим образом:

const paypal = require('paypal-rest-sdk');
const paymentId = event.paymentID;
const payerId = { payer_id: event.payerID };
paypal.configure({
    mode: process.env.PAYPAL_ENVIRONMENT, //sandbox or live
    client_id: '<MY_CLIENT_ID>',
    client_secret: '<MY_CLIENT_SECRET>',
});

paypal.payment.execute(
    paymentId,
    payerId,
    // START NEW CODE
    {
        headers: {
            'Content-Type': 'application/json',
            'PayPal-Mock-Response': '{"mock_application_codes": "INSUFFICIENT_FUNDS"}',
        },
    },
    // END NEW CODE
    (error, payment) => {
        console.error(JSON.stringify(error));
        console.error(JSON.stringify(payment));
        if (error) {
            /*
                {
                    "response": {
                        "name": "INSUFFICIENT_FUNDS",
                        "message": "Buyer cannot pay - insufficient funds.",
                        "information_link": "https://developer.paypal.com/docs/api/payments/#errors",
                        "debug_id": "a1b2c3d4e5f6g",
                        "details": [
                            {
                                "issue": "The buyer must add a valid funding instrument, such as a credit card or bank account, to their PayPal account."
                            }
                        ],
                        "httpStatusCode": 400
                    },
                    "httpStatusCode": 400
                }
            */
            return callback('unhandled_error', null);
        }
        if (payment.state === 'approved' && payment.transactions && payment.transactions[0].related_resources && payment.transactions[0].related_resources[0].authorization) {
            return callback(null, payment.transactions[0].related_resources[0].authorization.id);
        }
        console.log('payment not successful');
        return callback('unhandled_error', null);
    }
);

В заголовках запросов вам просто нужно поместить заголовок с именем PayPal-Mock-Response, содержащий код ошибки, который вы хотите проверить, иВот и все.

Надеюсь, это кому-нибудь поможет!

...