如何解决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 个字符限制,自由文本)
所以,为了解决这个问题,我不得不:
- 在 Wordpress 上打开插件编辑器
- 选择
VendorData
插件 - 导航并选择
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 个字符,并且只有 VendorData
或 Aa
,我在尝试时有几次尝试失败0-9
直到我搜索到我在此页面上收到的错误:
https://www.opayo.co.uk/support/error-codes?keyword=3189
我希望我的问题和解决方案对未来的人有所帮助,并为我浪费了任何人的时间感到抱歉!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。