أتمتة الدعوات المجمعة

مرحباً بالجميع،
كنت أبحث عن ميزة في واجهة برمجة التطبيقات (API) تضيف مستخدماً إلى مجموعة أو مجموعتين بناءً على عنوان بريد إلكتروني معطى، وتدعوه إلى المنتدى إذا لم يكن لديه حساب مسبقاً. لم أستطع العثور على هذه الميزة، لكنني لاحظت أن هذا بالضبط ما تفعله ميزة “التحميل الجماعي” للدعوات. هذه الميزة غير موثقة في واجهة برمجة التطبيقات، لكنها هي ما يقوم به المتصفح.

لذلك قمت بنفس الشيء، باستخدام كود PHP التالي لإرسال ملف CSV عبر POST:

        $body = "--ossifrage\r
Content-Disposition: form-data; name=\"type\"\r
\r
csv\r
--ossifrage\r
Content-Disposition: form-data; name=\"files[]\"; filename=\"test.csv\"\r
Content-Type: text/csv\r
\r
$order_email,$group_names\r
\r
\r
--ossifrage--\r
";
$r=wp_remote_post( 'https://club.tidalcycles.org/invites/upload_csv.json', array(
                    'method' => 'POST',
                    'headers' => array('Content-Type' => 'multipart/form-data; boundary=ossifrage', 
                                       'Api-key' => '(مخفي)',
                                       'Api-Username' => 'yaxu'),
                    'body' => $body
                    )
                 ); 

كان هذا يعمل بشكل ممتاز لبضعة أشهر، لكنه توقف عن العمل مؤخراً، مع ظهور الخطأ التالي في سجلات discourse: Can't verify CSRF token authenticity.

هل هذا خطأ برمجي، حيث يجب أن أكون مصادقاً عليه عبر مفتاح واجهة برمجة التطبيقات؟ أم أنني أضيع وقتي في محاولة استخدام أجزاء غير موثقة من واجهة برمجة التطبيقات؟

فقط أتساءل إذا كان بإمكان أحد التأكيد عما إذا كانت هذه مشكلة محتمل إصلاحها أم لا؟ سأبدأ في البحث عن حل بديل على أي حال.

هل لديك أي أفكار حول هذا الموضوع @techAPJ؟

مرحبًا، شكرًا لاهتمامك. لقد تمكنت من تجميع شيء ما باستخدام واجهة البرمجة الموثقة (مع التركيز على كلمة “تجميع سريع”، لكن ربما يكون هذا مفيدًا لشخص آخر):

function tidal_process_order( $order_id ){
        $order = new WC_Order($order_id);
        $order_email = $order->get_billing_email();
        $group_names_arr = [];
        // الحصول على رموز المنتجات (SKUs) كأسماء مجموعات
        foreach ( $order->get_items() as $item ) {
          if ( $item['product_id'] > 0 ) {
            $_product = $item->get_product();
            $sku = $_product->get_sku();
            array_push($group_names_arr, $sku);
          }
        }

        $group_names = join(",",$group_names_arr);

        // التحقق مما إذا كان مستخدم discourse موجودًا بالفعل بالبريد الإلكتروني
        $r=wp_remote_get( "https://club.tidalcycles.org/admin/users/list/all.json?email=$order_email", array(
                          'headers' => array('Api-key' => 'redacted',
                                             'Api-Username' => 'redacted')
                                            )
                        );
        $matches = json_decode($r['body']);
        if (count($matches) > 0) {
          // المستخدم موجود، أضفه إلى المجموعات
          $user_id = $matches[0]->id;
          foreach($group_names_arr as $group) {
            // الحصول على معرف المجموعة من اسم المجموعة
            $r=wp_remote_get( "https://club.tidalcycles.org/groups/$group.json", array(
                              'headers' => array('Api-key' => 'redacted',
                                                 'Api-Username' => 'redacted')
                              )
                            );
            $group = json_decode($r['body']);
            $body = json_encode(array('group_id' => $group->group->id));
            // إضافة المستخدم إلى المجموعة
            $r=wp_remote_post( "https://club.tidalcycles.org/admin/users/$user_id/groups", array(
                               'headers' => array('Api-key' => 'redacted',
                                                  'Api-Username' => 'redacted',
                                                  'Content-Type' => 'application/json', 
                                                 ),
                               'body' => $body
                            ));
          }
        }
        else {
            // المستخدم غير موجود، أرسل له دعوة مع أسماء المجموعات
            $body = json_encode(array('email' => $order_email, 'group_names' => $group_names, "custom_message" => "مرحبًا!"));
            $r=wp_remote_post( "https://club.tidalcycles.org/invites", array(
                               'headers' => array('Api-key' => 'redacted',
                                                  'Api-Username' => 'redacted',
                                                  'Content-Type' => 'application/json', 
                                                 ),
                               'body' => $body
                            ));
        };
}

add_action( 'woocommerce_order_status_processing', 'tidal_process_order' );