diff --git a/.github/workflows/maven-publish-release.yml b/.github/workflows/maven-publish-release.yml new file mode 100644 index 00000000..d1a2d42e --- /dev/null +++ b/.github/workflows/maven-publish-release.yml @@ -0,0 +1,43 @@ +# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path + +name: Publish package to the Maven Central Repository and GitHub Packages + +on: + release: + types: [ released ] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: 'adopt' + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + + - id: install-secret-key + name: Install GPG Secret Key + run: | + cat <(echo -e "${{ secrets.OSSRH_GPG_SECRET_KEY }}") | gpg --batch --import + gpg --list-secret-keys --keyid-format LONG + - id: publish-to-central + name: Publish to Central Repository + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }} + run: | + mvn \ + --no-transfer-progress \ + --batch-mode \ + -Dgpg.passphrase=${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} \ + clean deploy -P release diff --git a/.github/workflows/maven-publish-snapshot.yml b/.github/workflows/maven-publish-snapshot.yml new file mode 100644 index 00000000..a888b23b --- /dev/null +++ b/.github/workflows/maven-publish-snapshot.yml @@ -0,0 +1,44 @@ +# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path + +name: Publish SNAPSHOT package + +on: + release: + types: [ prereleased ] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v2 + with: + java-version: '8' + distribution: 'adopt' + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + + - id: install-secret-key + name: Install GPG Secret Key + run: | + cat <(echo -e "${{ secrets.OSSRH_GPG_SECRET_KEY }}") | gpg --batch --import + gpg --list-secret-keys --keyid-format LONG + - id: publish-to-central + name: Publish to Central Repository + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }} + run: | + mvn \ + --no-transfer-progress \ + --batch-mode \ + -Dgpg.passphrase=${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} \ + clean deploy diff --git a/pom.xml b/pom.xml index c6c46113..b0385e1b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.mercadopago sdk-java - 1.11.3-SNAPSHOT + 1.11.3 jar Mercadopago SDK diff --git a/src/main/java/com/mercadopago/resources/datastructures/payment/TransactionData.java b/src/main/java/com/mercadopago/resources/datastructures/payment/TransactionData.java index 637d2535..eeae96db 100644 --- a/src/main/java/com/mercadopago/resources/datastructures/payment/TransactionData.java +++ b/src/main/java/com/mercadopago/resources/datastructures/payment/TransactionData.java @@ -10,6 +10,7 @@ public class TransactionData { private Long bankTransferId; private Long financialInstitution; private BankInfo bankInfo; + private String ticketUrl; /** * @return QR code @@ -106,4 +107,12 @@ public TransactionData setBankInfo(BankInfo bankInfo) { this.bankInfo = bankInfo; return this; } + + public String getTicketUrl() { + return ticketUrl; + } + + public void setTicketUrl(String ticketUrl) { + this.ticketUrl = ticketUrl; + } } diff --git a/src/test/java/mercadopago/resources/PaymentTest.java b/src/test/java/mercadopago/resources/PaymentTest.java index 73d4781e..d2a4e970 100644 --- a/src/test/java/mercadopago/resources/PaymentTest.java +++ b/src/test/java/mercadopago/resources/PaymentTest.java @@ -38,6 +38,8 @@ public class PaymentTest extends BaseResourceTest { private static final String PAYMENT_BASE_JSON = "payment/payment_base.json"; + private static final String PAYMENT_PIX_JSON = "payment/payment_pix.json"; + private static final String PAYMENT_CAPTURED_JSON = "payment/payment_captured.json"; private static final String PAYMENT_CANCELLED_JSON = "payment/payment_cancelled.json"; @@ -136,6 +138,43 @@ public void paymentSaveRequestOptionsTest() throws MPException, IOException { assertNotNull(payment.getId()); } + @Test + public void paymentPixSaveTest() throws MPException, IOException { + + httpClientMock.mock(PAYMENT_PIX_JSON, HTTP_STATUS_CREATED, PAYMENT_PIX_JSON); + + Payment payment = newPixPayment(); + payment.save(); + assertNotNull(payment.getLastApiResponse()); + assertEquals(HTTP_STATUS_CREATED, payment.getLastApiResponse().getStatusCode()); + assertNotNull(payment.getId()); + assertEquals("pix", payment.getPaymentMethodId()); + assertEquals( + "https://www.mercadopago.com.br/payments/21071815560/ticket?caller_id=471763966&hash=abcd1234efgh5678", + payment.getPointOfInteraction().getTransactionData().getTicketUrl()); + assertNotNull(payment.getPointOfInteraction().getTransactionData().getQrCode()); + assertNotNull(payment.getPointOfInteraction().getTransactionData().getQrCodeBase64()); + } + + @Test + public void paymentPixSaveRequestOptionsTest() throws MPException, IOException { + + httpClientMock.mock(PAYMENT_PIX_JSON, HTTP_STATUS_CREATED, PAYMENT_PIX_JSON); + + MPRequestOptions requestOptions = newRequestOptions(); + Payment payment = newPixPayment(); + payment.save(requestOptions); + assertNotNull(payment.getLastApiResponse()); + assertEquals(HTTP_STATUS_CREATED, payment.getLastApiResponse().getStatusCode()); + assertNotNull(payment.getId()); + assertEquals("pix", payment.getPaymentMethodId()); + assertEquals( + "https://www.mercadopago.com.br/payments/21071815560/ticket?caller_id=471763966&hash=abcd1234efgh5678", + payment.getPointOfInteraction().getTransactionData().getTicketUrl()); + assertNotNull(payment.getPointOfInteraction().getTransactionData().getQrCode()); + assertNotNull(payment.getPointOfInteraction().getTransactionData().getQrCodeBase64()); + } + @Test public void capturePaymentTest() throws MPException, IOException { @@ -346,5 +385,14 @@ public static Payment newPayment(boolean capture) { .setFloor("floor") .setApartment("apartment")))); } + + public static Payment newPixPayment() { + return new Payment() + .setTransactionAmount(100f) + .setDateOfExpiration(new Date(2022, Calendar.FEBRUARY, 10, 10, 10, 10)) + .setPaymentMethodId("pix") + .setDescription("description") + .setPayer(new Payer().setEmail("test_user_1648059260@testuser.com")); + } } diff --git a/src/test/java/mercadopago/resources/mocks/request/payment/payment_pix.json b/src/test/java/mercadopago/resources/mocks/request/payment/payment_pix.json new file mode 100644 index 00000000..4fe64287 --- /dev/null +++ b/src/test/java/mercadopago/resources/mocks/request/payment/payment_pix.json @@ -0,0 +1,9 @@ +{ + "payer": { + "email": "test_user_1648059260@testuser.com" + }, + "description": "description", + "transaction_amount": 100.0, + "payment_method_id": "pix", + "date_of_expiration": "3922-02-10T10:10:10.000+0000" +} \ No newline at end of file diff --git a/src/test/java/mercadopago/resources/mocks/response/payment/payment_pix.json b/src/test/java/mercadopago/resources/mocks/response/payment/payment_pix.json new file mode 100644 index 00000000..d10ac003 --- /dev/null +++ b/src/test/java/mercadopago/resources/mocks/response/payment/payment_pix.json @@ -0,0 +1,130 @@ +{ + "id": 21071815560, + "date_created": "2022-01-10T10:10:10.000-00:00", + "date_approved": null, + "date_last_updated": "2022-01-10T10:10:10.000-00:00", + "date_of_expiration": "2022-02-10T10:10:10.000-00:00", + "money_release_date": null, + "operation_type": "regular_payment", + "issuer_id": null, + "payment_method_id": "pix", + "payment_type_id": "bank_transfer", + "status": "pending", + "status_detail": "pending_waiting_transfer", + "currency_id": "BRL", + "description": "description", + "live_mode": true, + "sponsor_id": null, + "authorization_code": null, + "money_release_schema": null, + "taxes_amount": 0, + "counter_currency": null, + "brand_id": null, + "shipping_amount": 0, + "pos_id": null, + "store_id": null, + "integrator_id": null, + "platform_id": null, + "corporation_id": null, + "collector_id": 471763966, + "payer": { + "type": null, + "id": "128185910", + "operator_id": null, + "email": "test_user_1648059260@testuser.com", + "identification": { + "type": null, + "number": null + }, + "phone": { + "area_code": null, + "number": null, + "extension": null + }, + "first_name": null, + "last_name": null, + "entity_type": null + }, + "marketplace_owner": null, + "metadata": {}, + "additional_info": { + "available_balance": null, + "nsu_processadora": null, + "authentication_code": null + }, + "order": {}, + "external_reference": null, + "transaction_amount": 100, + "transaction_amount_refunded": 0, + "coupon_amount": 0, + "differential_pricing_id": null, + "deduction_schema": null, + "callback_url": null, + "installments": 1, + "transaction_details": { + "payment_method_reference_id": null, + "net_received_amount": 0, + "total_paid_amount": 100, + "overpaid_amount": 0, + "external_resource_url": null, + "installment_amount": 0, + "financial_institution": null, + "payable_deferral_period": null, + "acquirer_reference": null, + "bank_transfer_id": null, + "transaction_id": null + }, + "fee_details": [], + "charges_details": [], + "captured": true, + "binary_mode": false, + "call_for_authorize_id": null, + "statement_descriptor": null, + "card": {}, + "notification_url": null, + "refunds": [], + "processing_mode": "aggregator", + "merchant_account_id": null, + "merchant_number": null, + "acquirer_reconciliation": [], + "point_of_interaction": { + "type": "OPENPLATFORM", + "business_info": { + "unit": "online_payments", + "sub_unit": "default" + }, + "location": { + "state_id": null, + "source": null + }, + "application_data": { + "name": null, + "version": null + }, + "transaction_data": { + "qr_code": "00020126580014br.gov.bcb.pix0136d58a7469-afb3-48dd-b279-5576754cd5f75204000053039865406100.005802BR5911TETE97814116009Sao Paulo62240520mpqrinter2107181556063044CC4", + "bank_transfer_id": null, + "transaction_id": null, + "financial_institution": null, + "bank_info": { + "payer": { + "account_id": null, + "id": null, + "long_name": null, + "external_account_id": null + }, + "collector": { + "account_id": null, + "long_name": null, + "account_holder_name": "Salazar Tucker", + "transfer_account_id": null + }, + "is_same_bank_account_owner": null, + "origin_bank_id": null, + "origin_wallet_id": null + }, + "qr_code_base64": "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", + "ticket_url": "https://www.mercadopago.com.br/payments/21071815560/ticket?caller_id=471763966&hash=abcd1234efgh5678" + } + } +} \ No newline at end of file