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())
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
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)
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