jcloud/dashboard/src2/components/billing/BuyCreditsRazorpay.vue
2025-04-12 17:39:38 +08:00

124 lines
3.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<span
v-if="team.pg.currency === 'CNY'"
class="mt-2.5 inline-flex gap-2 text-base text-gray-700"
>
<FeatherIcon name="info" class="my-1 h-4" />
<span class="leading-5">
如果您选择 Razorpay您可以使用信用卡借记卡网上银行UPI钱包等方式支付如果您使用网上银行余额可能需要最多 5 天才能反映
</span>
</span>
<ErrorMessage class="mt-3" :message="createRazorpayOrder.error" />
<div class="mt-8">
<Button
v-if="!isPaymentComplete"
class="w-full"
size="md"
variant="solid"
label="继续使用 Razorpay 支付"
:loading="createRazorpayOrder.loading"
@click="createRazorpayOrder.submit()"
/>
<Button
v-else
class="w-full"
size="md"
label="确认支付中"
variant="solid"
:loading="isVerifyingPayment"
/>
</div>
</div>
</template>
<script setup>
import { Button, ErrorMessage, FeatherIcon, createResource } from 'jingrow-ui';
import { ref, onMounted, onBeforeUnmount, inject } from 'vue';
import { toast } from 'vue-sonner';
import { DashboardError } from '../../utils/error';
const props = defineProps({
amount: {
type: Number,
default: 0
},
minimumAmount: {
type: Number,
default: 0
}
});
const emit = defineEmits(['success']);
const team = inject('team');
const isPaymentComplete = ref(false);
const isVerifyingPayment = ref(false);
const razorpayCheckoutJS = ref(null);
onMounted(() => {
razorpayCheckoutJS.value = document.createElement('script');
razorpayCheckoutJS.value.setAttribute(
'src',
'https://checkout.razorpay.com/v1/checkout.js'
);
razorpayCheckoutJS.value.async = true;
document.head.appendChild(razorpayCheckoutJS.value);
});
onBeforeUnmount(() => {
razorpayCheckoutJS.value?.remove();
});
const createRazorpayOrder = createResource({
url: 'jcloud.api.billing.create_razorpay_order',
params: {
amount: props.amount
},
onSuccess: data => processOrder(data),
validate: () => {
if (props.amount < props.minimumAmount) {
throw new DashboardError('Amount less than minimum amount required');
}
}
});
const handlePaymentFailed = createResource({
url: 'jcloud.api.billing.handle_razorpay_payment_failed',
onSuccess: () => {
console.log('Payment Failed.');
}
});
function processOrder(data) {
const options = {
key: data.key_id,
order_id: data.order_id,
name: '今果 Jingrow',
image: 'https://jingrow.com/files/cloud.png',
prefill: { email: team.pg?.user },
handler: handlePaymentSuccess,
theme: { color: '#171717' }
};
const rzp = new Razorpay(options);
// Opens the payment checkout frame
rzp.open();
// Attach failure handler
rzp.on('payment.failed', handlePaymentFailure);
// rzp.on('payment.success', this.handlePaymentSuccess);
}
function handlePaymentFailure(response) {
handlePaymentFailed.submit({ response });
toast.error('支付失败');
}
function handlePaymentSuccess() {
isPaymentComplete.value = true;
emit('success');
toast.success('支付成功');
}
</script>