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

问题描述

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

问题是:

  • 最初设置时,没有为发送到 API 的数据/对象上的 Reference 字段选择模板/选项

最初做网站的人然后尝试联系这个现在不受支持的插件的原始开发者,他们被发送了一些代码以放入另一个名为 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,TRUE );
        //$vendordata['_reference_field'] = $reference; ### Commented as I'm unsure if this is correct
    }
    
    return $vendordata;
}

在进行了大量测试和小的更改后,Opayo 本身的 Reference 字段中似乎仍然没有显示任何内容?

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

解决方法

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

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

您需要找出通过 opayo_direct_custom_field_vendordata 过滤器挂钩将该自定义字段值合并到供应商数据所需的关键 slug。

尝试以下(其中我使用“引用”作为关键slug,用正确的slug替换)

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',$order ) {
    $reference = get_post_meta($order->get_id(),'_reference_field',true);

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

它可以更好地工作......

,

好的,所以,我亲自联系了 Opayo,以了解 Opayo 网站上 Mapping 列的 Reference 是什么,以及发送到 API 的哪些数据映射到该 {{1} } 表中的列。

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

所以,为了解决这个问题,我不得不:

  1. 在 Wordpress 上打开插件编辑器
  2. 选择 VendorData 插件
  3. 导航并选择 woocommerce-gateway-sagepay-form 文件

然后我滚动到 woocommerce-gateway-sagepay-form/classes/direct/sagepay-direct-request-class.php 数组内的 Line 335,然后添加了 $end 的字段,如下面的代码所示:

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 以显示在支付表的 ####### 列中的值。

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

Line 378

保存此内容,然后在进行订单/购买时,Opayo 网站上的 // Customiseable fields $end['TransType'] = apply_filters( 'opayo_direct_custom_field_transtype','01',$order ); //$end['VendorData'] = apply_filters( 'opayo_direct_custom_field_vendordata','',$order ); 字段将填充我将 Reference 设置为的内容。

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

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


我希望我的问题和解决方案对未来的人有所帮助,并为我浪费了任何人的时间感到抱歉!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...