コード例 #1
0
    def test_transaction_ok(self, send_donation_email):
        payment = Payment.objects.create(
            person=self.data["people"]["user1"],
            price=1000,
            type=DonsConfig.PAYMENT_TYPE,
            mode=SystemPayPaymentMode.id,
        )

        self.client.force_login(self.data["people"]["user1"].role)

        res = self.client.get(reverse("payment_page", args=[payment.pk]))
        self.assertContains(res, "vads")
        self.assertEqual(
            1,
            SystemPayTransaction.objects.filter(payment=payment).count())

        res = self.client.get(reverse("payment_retry", args=[payment.pk]))
        self.assertContains(res, "vads")
        self.assertEqual(
            2,
            SystemPayTransaction.objects.filter(payment=payment).count())

        self.client.logout()

        order_id = SystemPayTransaction.objects.filter(
            payment=payment).last().pk
        systempay_data = webhookcall_data(
            order_id=order_id,
            trans_id=get_trans_id_from_order_id(order_id),
            operation_type="DEBIT",
            trans_status="AUTHORISED",
            amount=payment.price,
            cust_id=payment.person.pk,
        )

        res = self.client.post(reverse("system_pay:webhook"), systempay_data)
        self.assertEqual(res.status_code, 200)
        payment.refresh_from_db()
        self.assertEqual(payment.status, Payment.STATUS_COMPLETED)
        self.assertEqual(
            2,
            SystemPayTransaction.objects.filter(payment=payment).count())

        systempay_data = webhookcall_data(
            order_id=order_id,
            trans_id=get_trans_id_from_order_id(order_id),
            operation_type="DEBIT",
            trans_status="REFUSED",
            amount=payment.price,
            cust_id=payment.person.pk,
        )

        res = self.client.post(reverse("system_pay:webhook"), systempay_data)
        self.assertEqual(res.status_code, 200)
        payment.refresh_from_db()
        self.assertEqual(payment.status, Payment.STATUS_COMPLETED)
        self.assertEqual(
            2,
            SystemPayTransaction.objects.filter(payment=payment).count())
コード例 #2
0
    def get_form_for_transaction(cls, transaction, sp_config):
        person = transaction.subscription.person

        success_url = front_url(
            "subscription_return", kwargs={"pk": transaction.subscription_id}
        )
        failure_url = front_url(
            f"{transaction.subscription.mode}:failure", kwargs={"pk": transaction.pk}
        )

        person_data = {}
        if person is not None:
            person_data.update(
                {
                    f.name: getattr(person, f.name)
                    for f in person._meta.get_fields()
                    if not f.is_relation
                }
            )
        person_data.update(transaction.subscription.meta)

        form = cls(
            initial={
                "vads_site_id": sp_config["site_id"],
                "vads_ctx_mode": "PRODUCTION" if sp_config["production"] else "TEST",
                "vads_sub_currency": sp_config["currency"],
                "vads_order_id": transaction.pk,
                "vads_trans_id": get_trans_id_from_order_id(transaction.pk),
                "vads_trans_date": transaction.created.strftime("%Y%m%d%H%M%S"),
                "vads_sub_effect_date": transaction.created.strftime("%Y%m%d"),
                "vads_sub_amount": transaction.subscription.price,
                "vads_cust_email": person.email,
                "vads_cust_id": transaction.subscription.person_id,
                "vads_cust_first_name": person_data.get("first_name"),
                "vads_cust_last_name": person_data.get("last_name"),
                "vads_cust_address": ", ".join(
                    [
                        person_data.get("location_address1", ""),
                        person_data.get("location_address2", ""),
                    ]
                ).strip(),
                "vads_cust_zip": person_data.get("location_zip"),
                "vads_cust_city": person_data.get("location_city"),
                "vads_cust_state": person_data.get("location_state"),
                "vads_cust_country": person_data.get("location_country"),
                "vads_sub_desc": get_recurrence_rule(transaction.subscription),
                "vads_url_success": success_url,
                **{
                    f"vads_url_{status}": f"{failure_url}?status={status}"
                    for status in ["cancel", "error", "refused"]
                },
            }
        )

        form.update_signature(sp_config["certificate"])

        return form
コード例 #3
0
    def test_subscription(self, send_donation_email, cancel_alias):
        subscription = Subscription.objects.create(
            person=self.data["people"]["user1"],
            price=1000,
            type=DonsConfig.PAYMENT_TYPE,
            mode=SystemPayPaymentMode.id,
        )

        self.client.force_login(self.data["people"]["user1"].role)

        res = self.client.get(
            reverse("subscription_page", args=[subscription.pk]))
        self.assertContains(res, "vads")
        self.assertEqual(
            1,
            SystemPayTransaction.objects.filter(
                subscription=subscription).count())

        self.client.logout()

        order_id = (SystemPayTransaction.objects.filter(
            subscription=subscription).last().pk)

        systempay_data = webhookcall_data(
            order_id=order_id,
            trans_id=get_trans_id_from_order_id(order_id),
            operation_type="VERIFICATION",
            trans_status="ACCEPTED",
            amount=0,
            cust_id=subscription.person.pk,
            generate_alias=True,
            generate_subscription=True,
        )

        res = self.client.post(reverse("system_pay:webhook"), systempay_data)

        self.assertEqual(res.status_code, 200)
        subscription.refresh_from_db()
        self.assertEqual(subscription.status, Subscription.STATUS_ACTIVE)
        self.assertEqual(subscription.payments.all().count(), 0)

        sp_sub = subscription.system_pay_subscriptions.get(active=True)
        alias = sp_sub.alias

        systempay_data = webhookcall_data(
            order_id=order_id,
            trans_id=get_trans_id_from_order_id(
                order_id + 10),  # new transaction, created by systempay
            operation_type="DEBIT",
            trans_status="CAPTURED",
            amount=1000,
            cust_id=subscription.person.pk,
            identifier=alias.identifier.hex,
            subscription=sp_sub.identifier,
        )

        res = self.client.post(reverse("system_pay:webhook"), systempay_data)

        self.assertEqual(res.status_code, 200)
        subscription.refresh_from_db()
        self.assertEqual(subscription.payments.all().count(), 1)
        self.assertEqual(Payment.objects.first().status,
                         Payment.STATUS_COMPLETED)
        self.assertEqual(Payment.objects.first().subscription, subscription)
        self.assertEqual(Payment.objects.first().price, 1000)

        # test indempotence
        res = self.client.post(reverse("system_pay:webhook"), systempay_data)
        self.assertEqual(res.status_code, 200)
        subscription.refresh_from_db()
        self.assertEqual(subscription.payments.all().count(), 1)
        self.assertEqual(Payment.objects.first().status,
                         Payment.STATUS_COMPLETED)
        self.assertEqual(Payment.objects.first().subscription, subscription)
        self.assertEqual(Payment.objects.first().price, 1000)

        # test refused payment
        trans_uuid = uuid.uuid4().hex
        systempay_data["vads_trans_uuid"] = trans_uuid
        systempay_data["vads_trans_status"] = "REFUSED"
        systempay_data["signature"] = get_signature(
            systempay_data, settings.SYSTEMPAY_CERTIFICATE)
        res = self.client.post(reverse("system_pay:webhook"), systempay_data)
        self.assertEqual(res.status_code, 200)
        subscription.refresh_from_db()
        self.assertEqual(subscription.payments.all().count(), 2)
        self.assertEqual(Payment.objects.first().status,
                         Payment.STATUS_REFUSED)
        self.assertEqual(Payment.objects.first().subscription, subscription)
        self.assertEqual(Payment.objects.first().price, 1000)

        # test payment card change
        res = self.client.get(
            reverse("subscription_page", args=[subscription.pk]))
        self.assertContains(res, "vads")
        self.assertEqual(
            2,
            SystemPayTransaction.objects.filter(
                subscription=subscription).count())

        order_id = (SystemPayTransaction.objects.filter(
            subscription=subscription).last().pk)

        systempay_data = webhookcall_data(
            order_id=order_id,
            trans_id=get_trans_id_from_order_id(order_id),
            operation_type="VERIFICATION",
            trans_status="ACCEPTED",
            amount=0,
            cust_id=subscription.person.pk,
            generate_alias=True,
            generate_subscription=True,
        )

        res = self.client.post(reverse("system_pay:webhook"), systempay_data)

        self.assertEqual(res.status_code, 200)
        subscription.refresh_from_db()
        self.assertEqual(subscription.status, Subscription.STATUS_ACTIVE)

        self.assertEqual(2, subscription.system_pay_subscriptions.count())
        self.assertEqual(
            1,
            subscription.system_pay_subscriptions.filter(active=True).count())

        cancel_alias.assert_called_with(
            subscription.system_pay_subscriptions.get(active=False).alias)
コード例 #4
0
    def get_form_for_transaction(cls, transaction, sp_config):
        person_id = (
            str(transaction.payment.person.pk)
            if transaction.payment.person
            else "anonymous"
        )

        success_url = front_url("payment_return", kwargs={"pk": transaction.payment_id})
        failure_url = front_url(
            f"{transaction.payment.mode}:failure", kwargs={"pk": transaction.pk}
        )

        form = cls(
            initial={
                "vads_site_id": sp_config["site_id"],
                "vads_ctx_mode": "PRODUCTION" if sp_config["production"] else "TEST",
                "vads_currency": sp_config["currency"],
                "vads_order_id": transaction.pk,
                "vads_trans_id": get_trans_id_from_order_id(transaction.pk),
                "vads_trans_date": transaction.created.strftime("%Y%m%d%H%M%S"),
                "vads_amount": transaction.payment.price,
                "vads_cust_email": transaction.payment.email,
                "vads_cust_id": person_id,
                "vads_cust_first_name": transaction.payment.first_name,
                "vads_cust_last_name": transaction.payment.last_name,
                "vads_cust_address": ", ".join(
                    [
                        transaction.payment.location_address1,
                        transaction.payment.location_address2,
                    ]
                ),
                "vads_cust_zip": transaction.payment.location_zip,
                "vads_cust_city": transaction.payment.location_city,
                "vads_cust_state": transaction.payment.location_state,
                "vads_cust_country": transaction.payment.location_country,
                "vads_ext_info_type": transaction.payment.type,
                "vads_url_success": success_url,
                **{
                    f"vads_url_{status}": f"{failure_url}?status={status}"
                    for status in ["cancel", "error", "refused"]
                },
            }
        )

        if transaction.payment.phone_number:
            if (
                phonenumberutil.number_type(transaction.payment.phone_number)
                == PhoneNumberType.MOBILE
            ):
                form.add_field(
                    "vads_cust_cell_phone", transaction.payment.phone_number.as_e164
                )
            else:
                form.add_field(
                    "vads_cust_phone", transaction.payment.phone_number.as_e164
                )

        for key in transaction.payment.meta:
            form.add_field("vads_ext_info_meta_" + key, transaction.payment.meta[key])

        form.update_signature(sp_config["certificate"])

        return form