Woocommerce 和 Opayo:向发送到 API 的数据添加自定义字段

Woocommerce & Opayo: Add a custom field to the data sent to the API

非常具体的问题,但是,我被拖到我们公司的 Wordpress / Woocommerce 网站上的支付网关问题上,我们在该网站上使用 Opayo 插件(对于 Opayo Direct)。

问题是:

最初做网站的人然后尝试联系这个现在不受支持的插件的原始开发人员,他们收到了一些代码以放入另一个名为 PHP Injection 的插件中,代码类似于以下内容:

add_filter( 'opayo_direct_custom_field_vendordata', 'my_opayo_direct_custom_field_vendordata', 10, 2 );

function my_opayo_direct_custom_field_vendordata ( $vendordata, $order ) {

    // Get Order ID
    $order_id = $order->get_order_number();
    $reference = "test_" . $order_id;

    // Get the reference field - set '_reference_field' to the meta_key from your order
    if( isset( get_post_meta( $order_id, '_reference_field', TRUE ) ) ) {
        $vendordata = get_post_meta( $order_id , '_reference_field', TRUE );
        //$vendordata['_reference_field'] = $reference; ### Commented as I'm unsure if this is correct
    }
    
    return $vendordata;
}

经过无数次测试和小改动后,Opayo 本身的 Reference 字段似乎仍然没有显示任何内容?

请告诉我以前有人遇到过这种情况或者知道我可能遗漏了什么,我已经有一段时间没有接触了PHP

首先,您在尝试获取订单元数据时不能使用 $order->get_order_number(),而是使用带有 get_post_meta() 函数的 $order->get_id()

现在您还可以使用 WC_Data 方法 get_meta() 用于 $order 对象变量。

您需要找出的是您需要用来通过 opayo_direct_custom_field_vendordata 过滤器挂钩将该自定义字段值合并到供应商数据中的密钥块。

尝试以下 (我使用 'reference' 作为键别名,将替换为正确的别名)

add_filter( 'opayo_direct_custom_field_vendordata', 'my_opayo_direct_custom_field_vendordata', 10, 2 );

function my_opayo_direct_custom_field_vendordata ( $vendor_data, $order ) {
    $reference = $order->get_meta('_reference_field');

    if ( ! empty($reference) ) {
        $vendor_data['reference'] = $reference;
    }
    
    return $vendor_data;
}

或使用get_post_meta()函数:

add_filter( 'opayo_direct_custom_field_vendordata', 'my_opayo_direct_custom_field_vendordata', 10, 2 );

function my_opayo_direct_custom_field_vendordata ( $vendor_data, $order ) {
    $reference = get_post_meta($order->get_id(), '_reference_field', true);

    if ( ! empty($reference) ) {
        $vendor_data['reference'] = $reference;
    }
    
    return $vendor_data;
}

它可以更好地工作……

好的,所以,我自己联系了Opayo,看看Opayo网站上的Reference列的Mapping是什么,发送到API的数据是什么映射table.

中的 Reference

显然发送到 API 的值对应于 VendorData(不需要,200 个字符限制,自由文本)

所以,要解决这个问题,我必须:

  1. 在 Wordpress 上打开插件编辑器
  2. Select woocommerce-gateway-sagepay-form 插件
  3. 导航并 select woocommerce-gateway-sagepay-form/classes/direct/sagepay-direct-request-class.php 文件

然后我滚动到 $end 数组内的 Line 335,然后我添加了 VendorData 的字段,如下面的代码所示:

            $end = array(
                "CustomerEMail"     =>  $order->get_billing_email(),
                "ClientIPAddress"   =>  $this->get_ipaddress(),
                "AccountType"       =>  $this->accounttype,
                "ReferrerID"        =>  $this->referrerid,
                "Website"           =>  site_url(),
                "VendorData"        =>  '#######',
                "Crypt"             =>  MD5( $this->open_salt . $order->get_order_key() . $this->close_salt ),
            );

然后将 ####### 设置为我需要发送到 Opayo 以显示在付款 table 的 Reference 列中的值 table。

然后只是为了确保它不会被修剪(同样,有一段时间没有触及 PHP,我去了(现在)Line 378 并将其注释掉,见下文:

// Customiseable fields
            $end['TransType'] = apply_filters( 'opayo_direct_custom_field_transtype', '01', $order );
            //$end['VendorData'] = apply_filters( 'opayo_direct_custom_field_vendordata', '', $order );

保存它,然后在下订单/购买时,Opayo 网站上的 Reference 字段填充了我设置的 VendorData

快速说明VendorData 字段最多 200 个字符,只有 Aa0-9,我有几次失败了当我尝试 _ 时尝试,直到我搜索了我在此页面上收到的错误:

https://www.opayo.co.uk/support/error-codes?keyword=3189


我希望我的问题和解决方案对以后的人有所帮助,对于我浪费了大家的时间,我深表歉意!