English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
حديثاً،يتطلب المشروع إضافة وظيفة الحوافز إلى جانب الدردشة،المطلوب:مثل واتساب (بدون رسائل)،لكن يمكن استخدام رصيد الحساب فقط لإرسال الحوافز.لذا،استخدمت حوافز واتساب عدة مرات لفهم جميع واجهات التفاعل والاحتياجات التجارية،مثل عرض المعلومات،تصنيف (شخصي،مجموعة عادية،مجموعة لعب الشير)،محدودية العدد (100)،محدودية المبلغ (200)،وقت انتهاء الصلاحية (24 ساعة) وما إلى ذلك،ثم بدأت في التطوير،والما ذكرته في الأسفل هو جميع واجهات التطبيق،بما أنني مبرمج بـphp.
أولاً،تصميم جدول البيانات كما يلي
CREATE TABLE `red_packet` ( id int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'معرف المستخدم', `for_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'المستفيد (معرف المستخدم أو معرف المجموعة)', `pay_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'حالة الدفع: 0 لم يتم الدفع،1 تم الدفع', `type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'النوع: 1 شخصي،2 مجموعة عادية،3 مجموعة لعب الشير', intro varchar(255) NOT NULL DEFAULT '' COMMENT '简介', number tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '个数', total_money decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '总金额', single_money decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '单个红包金额(群拼手气时为0)', return_money decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '退还金额', is_cli_handle tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否经过cli退款处理:0否,1是', expend_time mediumint(1) unsigned NOT NULL DEFAULT '0' COMMENT '领取消耗时间', add_time int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', pay_time int(10) unsigned NOT NULL DEFAULT '0' COMMENT '支付时间', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `pay_status` (`pay_status`), KEY `pay_time` (`pay_time`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='红包发放表'; CREATE TABLE `red_packet_log` ( id int(10) unsigned NOT NULL AUTO_INCREMENT, rp_id int(10) unsigned NOT NULL DEFAULT '0' COMMENT '红包id', `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'معرف المستلم' `money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT 'مبلغ الاستلام', `is_good` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'هل الحظ جيد: 0 لا، 1 نعم', `add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'وقت الإضافة', `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'وقت الاستلام', PRIMARY KEY (`id`), KEY `rp_id` (`rp_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='جدول سجلات الاستلام الحزم المالية';
ثانيًا، إرسال الحزم المالية
بسبب أن الحزم المالية يتم إرسالها على الفور إلى واجهة المحادثة بعد النجاح في الدفع، لذلك عند
ثالثًا، الاستلام الحزم المالية (هذا التحليل ينطبق فقط على الحزم المالية الجماعية)
مقدمات التحقق المختلفة للانتقال إلى الحزم المالية يجب أن يتم التفكير فيها بنفسك، هنا يتم مناقشة مشكلة التنافسية في الاستيلاء على الحزم المالية الجماعية (حيث يستلم العشرات من الأشخاص عدة حزم مالية)، ويتم استدعاء نظام المعالجة الموزعة (MQ) لحلها. عند إرسال الحزم المالية، يتم كتابة عدد الحزم المالية بشكل متتابع في نظام المعالجة الموزعة، مثل إرسال 3 حزم مالية، يتم كتابة 1،2،3 بشكل متتابع. عند الاستيلاء على الحزم المالية، يتم سحب القيم من نظام المعالجة الموزعة، والقيمة التي يتم سحبها تشير إلى أنك كنت الأول الذي استلم الحزمة المالية، وتبين الحزمة المالية في جدول red_packet_log، والخطوة التالية هي تحديث جدول red_packet_log بخصوص الشخص المستلم والتوقيت المستلم، وإضافة الأموال وإدخال السجلات، ثم إرجاع نتيجة الاستلام؛ إذا لم يتم سحب أي رقم، فإن ذلك يعني أنك لم تستلم الحزمة المالية، ويتم عرض واجهة
صفحة استلام الحقيبة النقدية لـ واتساب (أي صفحة عرض الحظ) تحتوي على أنواع عديدة: الفرق بين النوع الفردي والجماعي، الفرق بين الشخص الذي يرسل الحقيبة النقدية والشخص الذي يأخذها، الفرق بين الحقيبة النقدية الفردي والجماعية عند انتهاء الصلاحية، إلخ، لن أقوم بتقديمها جميعًا، حيث تكون معظمها استعلامات قاعدة البيانات بناءً على الشاشة.
أربعة، تغيير الطلب، إضافة دفع الطرف الثالث
عند الحديث عن الدفع عبر الطرف الثالث، يجب ذكر الرد الفوري والرد المتأخر، بالإضافة إلى فجوة الوقت بينهما. عند نجاح الرد الفوري في تطبيق الهاتف المحمول، يتم إرسال الحقيبة النقدية (الرد الفوري للدفع في تطبيق الهاتف المحمول يتم من خلال استدعاء callback مباشرة)، إذا كان الرد المتأخر بطيئًا ببضع ثوانٍ، فإن المستخدم سيتمكن من سرقة الحقيبة النقدية التي تكون حالة الدفع لها 0. إذا كان يُطلب من تطبيق الهاتف المحمول التحقق من نجاح الرد المتأخر من خلال واجهة الاتصال الطويل، فإن تجربة المستخدم ستكون سيئة.
# إدخال حالة وسطية تعديل جدول `red_packet` تعديل عمود `pay_status` صغير الحجم من النوع tinyint(1) غير الموقوف غير المطلوب DEFAULT 0 تعليق 'حالة الدفع: 0 لم يتم الدفع، 1 تم الدفع، 2 ينتظر الدفع' بعد `for_id`, تعديل عمود `pay_type` صغير الحجم من النوع tinyint(1) غير المطلوب DEFAULT 0 تعليق 'طريقة الدفع: 0 غير معروف، 1 آلبي، 2 واتساب، 3 يونيون' بعد `pay_status`, إضافة عمود `trade_no` من النوع varchar(30) غير المطلوب DEFAULT '' تعليق 'رقم معاملة الطرف الثالث للدفع' بعد `pay_type`; تعديل جدول `red_packet_log` إضافة عمود `is_into_account` صغير الحجم من النوع tinyint(1) غير الموقوف غير المطلوب DEFAULT 0 تعليق 'هل تم الدفع: 0 لا، 1 نعم' بعد `is_good`;
عندما يحقق المستخدم في الرسوم، يتم تحديد قيمة is_into_account بناءً على حالة الدفع pay_status;
عند استدعاء استدعاء سينخري إلى تطبيق الهاتف المحمول، يتم استدعاء واجهة للتحويل حالة الدفع pay_status إلى 2;
عند استدعاء استدعاء آلي إلى النظام الأساسي، يتم تغيير حالة الدفع pay_status إلى 1، وإجراء معالجة سجلات red_packet_log التي لديها is_into_account=1.
لكن يجب تنفيذ عملية FOR UPDATE على استعلام red_packet في هذه الخطوات الثلاث، وإلا قد تكون هناك مشاكل في وقت التنفيذ والترتيب، مما يؤدي إلى عدم وصول بعض سجلات red_packet_log إلى is_into_account=0؛ بالإضافة إلى ذلك، سينتج النظام المفتاح الذي يجعل عملية حصول المستخدم على الرسوم بطيئة، لأنه يجب انتظار إطلاق المفتاح.
تحسينات كما يلي: (لا يتم استخدام FOR UPDATE في المدة الكاملة)
عندما يحقق المستخدم في الرسوم، يتم تحديد قيمة is_into_account بناءً على حالة الدفع pay_status;
عند استدعاء استدعاء سينخري إلى تطبيق الهاتف المحمول، يتم استدعاء واجهة للتحويل حالة الدفع pay_status إلى 2;
عند استدعاء استدعاء آلي إلى النظام الأساسي، يتم تغيير حالة الدفع pay_status إلى 1، وإدخال id للرسوم (مفتاح رئيسي لـ red_packet) في MQ;
سكربت آلي في الخلفية، بعد الحصول على id للرسوم من MQ، يتم معالجة سجلات is_into_account=0 للرسوم، ثم يتم إعادة كتابة id للرسوم في MQ بعد تأخير 5 ثواني لمعالجة مرة أخرى، لضمان وصول جميع البيانات.
خامسًا: استعادة الرسوم الممنوحة عند انتهاء صلاحية الرسوم
هناك سكربت آلي واحد، ي�断د بناءً على pay_time في جدول red_packet ما إذا كان قد مر أكثر من 24 ساعة ولم يتم استلام الأموال بعد، ويقوم بإرجاع الأموال إلى رصيد المستخدم.
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر مملوكة للمالك الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت وتم تحميله بشكل مستقل، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا اكتشفت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بشكل فوري.