我在传递给我之前发布了这段代码,但这次我有一个不同的问题。我们正在与一家名为GiveX的公司进行集成,该公司给我的文档很少。雇用我的公司必须签署一份保密协议,所以我认为我不能透露他们向我们透露的大部分文件。我将努力尽可能清楚地表明我正在努力实现的目标。我将把我的所有代码放在我的问题下面,并在Wordpress中带有文件命名的标题。
-
例如,如何控制台记录
integrate.php
文件中gi_check_balance()
函数的$result
? 我想知道的是 giveX 发回给我们的是什么。现在,即使这个函数正在发送一个post
请求来给X,我什至无法判断。我应该在哪里看到这个控制台? 在订单完成页面上? 还是在某处的某些日志中? -
这条线
add_action( 'wp_ajax_gi_check_balance', 'gi_check_balance' );
做什么?我看到在 Wordpress 文档中add_action
是一个在某个点触发的钩子,第一个值应该是string
,第二个值是一个函数,我看到这是真的,但是创建这个钩子有什么意义,我没有看到字符串在其他任何地方引用的第一个值, 那么它是如何触发的呢?或者该函数何时运行,或者仅为其指定string
名称和函数是否允许该函数运行? - 同样有两个函数
gi_check_balance()
和gi_secure_register()
我怎么知道它们何时被触发? 这些函数如何连接到check-balance.js
文件和secure-register.js
文件(现在我对gi_secure_register()
函数的理解是它仅用于测试目的,我知道的唯一区别是在 post 请求中发送的代码标记为method
一个是904
和 一个是994
,他们应该做不同的事情,但通读 giveX 文档,我真的无法分辨出区别。 - 现在我知道还有一个 webhook,它似乎基于 wooCommerce 中在
integrate.php
文件中定义的自定义主题运行。这个网络钩子似乎也发出了 GIVE X url 的 post 请求,现在我一辈子都无法理解为什么我们要发出 3 次 post 请求,一次在integrate.php
插件文件本身,一次在webhook.php
文件中,另一个在任何一个js
文件中。我知道很难有人为我确定这一点,但是如果我能知道在woocommerce已完成的订单中,这些帖子请求将被触发什么场景? 这将帮助我理解为什么有三种不同的。 - Webhook 发送的电子邮件的此部分当前
<b>Card Number:</b> ' . $response->result[3] . '<br /> <b>PIN:</b> ' . $response_reference[1] . '<br /> <b>Card Amount:</b> ' . $response->result[4] . '<br /> <b>Reference Number:</b> ' . $response_reference[0] . '</p>'
电子邮件中返回空变量。我想弄清楚为什么 giveX 不发回数据?我希望能够在我可以看到从 giveX 返回的任何错误的地方控制台记录此结果。 - 所以基本上,当某些函数根据woocommerce/wordpress中的事件被触发时,我希望得到一些帮助。我也想知道实际触发了哪些
post
请求,因为我认为我们只需要向 giveX 发送一个请求即可订购这些礼品卡购买。
好的,这是代码(非常感谢提前:)
plugins/givex/integrate.php
// Get grouped product ID from child product ID
function get_parent_grouped_id( $children_id ){
global $wpdb;
$results = $wpdb->get_col("SELECT post_id FROM {$wpdb->prefix}postmeta
WHERE meta_key = '_children' AND meta_value LIKE '%$children_id%'");
// Will only return one product Id or false if there is zero or many
return sizeof($results) == 1 ? reset($results) : false;
}
/**
* add_new_topic_hooks will add a new webhook topic hook.
* @param array $topic_hooks Esxisting topic hooks.
*/
function add_new_topic_hooks( $topic_hooks ) {
// Array that has the topic as resource.event with arrays of actions that call that topic.
$new_hooks = array(
'order.gift_card' => array(
'order_gift_card_filter',
),
);
return array_merge( $topic_hooks, $new_hooks );
}
add_filter( 'woocommerce_webhook_topic_hooks', 'add_new_topic_hooks' );
/**
* add_new_topic_events will add new events for topic resources.
* @param array $topic_events Existing valid events for resources.
*/
function add_new_topic_events( $topic_events ) {
// New events to be used for resources.
$new_events = array(
'gift_card',
);
return array_merge( $topic_events, $new_events );
}
add_filter( 'woocommerce_valid_webhook_events', 'add_new_topic_events' );
/**
* add_new_webhook_topics adds the new webhook to the dropdown list on the Webhook page.
* @param array $topics Array of topics with the i18n proper name.
*/
function add_new_webhook_topics( $topics ) {
// New topic array to add to the list, must match hooks being created.
$new_topics = array(
'order.gift_card' => __( 'Order Gift Card', 'woocommerce' ),
);
return array_merge( $topics, $new_topics );
}
add_filter( 'woocommerce_webhook_topics', 'add_new_webhook_topics' );
/**
* my_order_item_check will check an order when it is created through the checkout form,
* if it has product ID 1030 as one of the items, it will fire off the action `order_gift_card_filter`
*
* @param int $order_id The ID of the order that was just created.
* @param array $posted_data Array of all of the data that was posted through checkout form.
* @param object $order The order object.
* @return null
*/
function my_order_item_check( $order_id, $posted_data, $order ) {
$order = wc_get_order( $order_id );
$order_status = $order->status;
$items = $order->get_items();
foreach ( $items as $item ) {
if ( is_a( $item, 'WC_Order_Item_Product' ) ) {
if ( 1457 === $item->get_product_id() ) {
$item_data = $item->get_data();
$item_meta_data_group = $item_data['meta_data'];
$gift_card_data = array();
foreach ( $item_meta_data_group as $item_meta_data ) {
$gift_card_data[$item_meta_data->key] = $item_meta_data->value;
}
do_action( 'order_gift_card_filter', $order_id, $posted_data, $order );
}
}
}
}
//The two below actions are what the order.created webhook is tied into, it is up to you to use these if you wish.
//add_action( 'woocommerce_payment_complete', 'my_order_item_check', 10, 4 );
add_action( 'woocommerce_checkout_order_processed', 'my_order_item_check', 10, 3 );
//add_action( 'woocommerce_process_shop_order_meta', 'my_order_item_check', 10, 2 );
add_action( 'wp_enqueue_scripts', 'add_ajax_script' );
function add_ajax_script() {
wp_enqueue_script( 'check-balance', plugins_url( '/check-balance.js', __FILE__ ), array('jquery'), '1.0', true );
wp_enqueue_script( 'secure-register', plugins_url( '/secure-register.js', __FILE__ ), array('jquery'), '1.0', true );
wp_localize_script( 'check-balance', 'gi_check_balance', array( 'ajax_url' => admin_url('admin-ajax.php') ) );
wp_localize_script( 'secure-register', 'gi_secure_register', array( 'ajax_url' => admin_url('admin-ajax.php') ) );
}
add_action( 'wp_ajax_nopriv_gi_check_balance', 'gi_check_balance' );
add_action( 'wp_ajax_gi_check_balance', 'gi_check_balance' );
function gi_check_balance() {
$gx_url_1 = 'https://givexurl-1.com';
$gx_url_2 = 'https://givexurl-2.com';
$gx_port_1 = port;
$gx_port_2 = port;
$gx_post_url_1 = $gx_url_1 . ':' . $gx_port_1;
$gx_post_url_2 = $gx_url_2 . ':' . $gx_port_2;
$gx_user = 'user';
$gx_password = 'pass';
$gx_card_number = $_POST['gx_card_number'];
$data = array(
'method' => '994',
'params' => [
'en',
'rc1',
//null,
$gx_user,
$gx_password,
$gx_card_number,
$gx_card_pin,
null
],
'id' => 'test'
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode( $data )
)
);
$context = stream_context_create( $options );
$result = file_get_contents( $gx_post_url_1, false, $context );
if ( $result == false ) {
$result = file_get_contents( $gx_post_url_2, false, $context );
}
$response = json_decode( $result );
echo $result;
//echo json_encode($result) ;
//var_dump( $response );
//echo $response;
die();
}
// function only for dev testing purposes
//add_action( 'wp_ajax_gi_secure_register', 'gi_secure_register' );
function gi_secure_register() {
$gx_url_1 = 'https://givexurl-1.com';
$gx_url_2 = 'https://givexurl-2.com';
$gx_port_1 = port;
$gx_port_2 = port;
$gx_post_url_1 = $gx_url_1 . ':' . $gx_port_1;
$gx_post_url_2 = $gx_url_2 . ':' . $gx_port_2;
$gx_user = 'user';
$gx_password = 'pass';
$gx_register_amount = $_POST['gx_register_amount'];
$data = array(
'method' => '904',
'params' => [
'en',
'rc2',
//null,
$gx_user,
$gx_password,
$gx_register_amount,
null,
null,
null
],
'id' => 'test'
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode( $data )
)
);
$context = stream_context_create( $options );
$result = file_get_contents( $gx_post_url_1, false, $context );
if ( $result == false ) {
$result = file_get_contents( $gx_post_url_2, false, $context );
}
$response = json_decode( $result );
echo json_encode($result);
die();
}
plugins/givex/webhook.php
<?php
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
$passed = false;
$request_body = file_get_contents('php://input');
$secret = 'P&_(e>P _I?%/aOW?wv0H.U149+Eyv8bh~qXd<6XrIY8+K0oo]';
$sig = base64_encode(hash_hmac('sha256', $request_body, $secret, true));
if( !function_exists('apache_request_headers') ) {
function apache_request_headers() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) <> 'HTTP_') {
continue;
}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
}
$header = apache_request_headers();
foreach ( $header as $headers => $value ) {
if( $headers == 'X-Wc-Webhook-Signature' ) {
if ( $value == $sig ) {
$passed = true;
}
}
}
if( $passed !== true ) {
header("Location: https://our-url.com");
} else {
$gx_url_1 = 'https://givexurl-1.com';
$gx_url_2 = 'https://givexurl-2.com';
$gx_port_1 = port;
$gx_port_2 = port;
$gx_post_url_1 = $gx_url_1 . ':' . $gx_port_1;
$gx_post_url_2 = $gx_url_2 . ':' . $gx_port_2;
$gx_user = 'user';
$gx_password = 'pass';
$data = json_decode(file_get_contents('php://input'), true);
foreach( $data['line_items'] as $item ) {
if( $item['product_id'] == 1457 ) {
$item_meta_data_group = $item['meta_data'];
$gift_card_data = array();
foreach( $item_meta_data_group as $item_meta_data ) {
$gift_card_data[$item_meta_data['key']] = $item_meta_data['value'];
}
$data_modified = array(
'method' => '904',
'params' => [
'en',
null,
$gx_user,
$gx_password,
str_replace(array(',', '$', ' '), '', $gift_card_data['gift-card-amount']),
null,
null,
null
],
'id' => 'test'
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => json_encode( $data_modified )
)
);
$context = stream_context_create( $options );
//$result = file_get_contents( $gx_post_url, false, $context );
$result = file_get_contents( $gx_post_url_1, false, $context );
if ( $result == false ) {
$result = file_get_contents( $gx_post_url_2, false, $context );
}
$response = json_decode( $result );
$response_reference = explode(':', $response->result[2]);
echo $result;
$to = $gift_card_data['recipient_email'];
$subject_decoded = 'You received a gift card ';
$subject = '=?UTF-8?B?' . base64_encode( $subject_decoded ) . '?=';
$subject1 = 'test';
$message = '<table border="0" cellspacing="0" cellpadding="0" width="100%" style="width: 100%; border-collapse: collapse;"><tbody><tr><td style="padding: 40px 40px 20px; background-color: #f9f9f9;" align="center"><table border="0" cellspacing="0" cellpadding="0" width="600" style="border-collapse: collapse;"><tbody>';
$message .= '<tr><td align="center" valign="bottom" style="padding: 0 0 20px;">';
$message .= '</td></tr>';
$message .= '<tr><td align="center" style="padding: 10px 40px 20px; background-color: #ffffff; color: #676767; font-family: Helvetica, Arial, sans-serif;">';
$message .= '<h2 style="font-family: Garamond, serif; font-size: 28px; font-weight: 600; color: #444444;">' . (!empty($gift_card_data['recipient_name']) ? $gift_card_data['recipient_name'] : 'Whoa') . ', you’ve got ' . $gift_card_data['gift-card-amount'] . ' to spend at!</h2>';
$message .= '<p style="color: #676767;">' . (!empty($gift_card_data['sender']) ? $gift_card_data['sender'] : 'Someone') . ' sent you a gift card' . (!empty($gift_card_data['message']) ? ' with the following message:' : '.') . '</p>';
if( !empty($gift_card_data['message']) ) {
$message .= '<p style="color: #676767;"><i><br />' . nl2br($gift_card_data['message']) . '<br /><br /></i></p>';
}
//$message .= '<img src="https://www.barcodesinc.com/generator/image.php?code=' . $response->result[3] . '&style=68&type=C39&width=300&height=50&xres=1&font=4" alt="" />';
// barcode generator website: https://www.barcodesinc.com/generator/index.php
$message .= '<p style="color: 676767; font-size: 1.25em;"><b>Card Number:</b> ' . $response->result[3] . '<br /> <b>PIN:</b> ' . $response_reference[1] . '<br /> <b>Card Amount:</b> ' . $response->result[4] . '<br /> <b>Reference Number:</b> ' . $response_reference[0] . '</p>';
$message .= '</td></tr>';
$message .= '<tr><td align="center" style="padding: 20px 0 0;">';
$message .= '<p style="color: #676767;"><b>We look forward to you dining with us!</b></p>';
$message .= '</td></tr>';
$message .= '</tbody></table></td></tr></tbody></table>';
$headers = "From: Gift Cards <test.com>rn";
$headers .= "Reply-To: noreply@test.comrn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "Content-Type: text/html; charset=ISO-8859-1rn";
mail($to, $subject, $message, $headers);
}
} // end foreach
} // end if else '$passed !== true'
plugins/givex/check-balance.js
jQuery(document).ready(function($) {
// checks card balance
$('.gi-check-balance').submit(function() {
var gx_card_number = $(this).find('[name=card-number]').val()
var gx_card_pin = $(this).find('[name=card-pin]').val()
$.ajax({
url: gi_check_balance.ajax_url,
type: 'post',
data: {
action: 'gi_check_balance',
gx_card_number: gx_card_number,
gx_card_pin: gx_card_pin
},
dataType: 'json',
success: function(response) {
console.log(response)
$('.gi-check-balance-result').text(response['result'][2])
//$('.gi-check-balance-result').text(JSON.stringify(response))
$('.gi-check-balance-result').show()
}
})
return false
})
})
plugins/givex/secure-register.js
jQuery(document).ready(function($) {
// registers gift card
$('.gi-secure-register').submit(function() {
var gx_register_amount = $(this).find('[name=register-amount]').val()
$.ajax({
url: gi_secure_register.ajax_url,
type: 'post',
data: {
action: 'gi_secure_register',
gx_register_amount: gx_register_amount
},
dataType: 'json',
success: function(response) {
//$('.gi-secure-register-result').html('Reference Number: ' + response['result'][2] + '<br>' + 'Card Number: ' + response['result'][3] + '<br>' + 'Card Amount: ' + response['result'][4])
$('.gi-secure-register-result').text(response)
$('.gi-secure-register-result').show();
console.log(response);
}
})
return false
})
})
更新
首先注意到错误。看起来因为我在本地主机上,所以我是 从 HTTPS 连接被拒绝?现在我知之甚少 关于SSL,我将如何使其在本地工作。我需要什么吗 离网址更远,我也在发送请求?
[22-Nov-2019 02:59:00 UTC] PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /Users/anderskitson/Local Sites/river-cafe/app/public/wp-content/plugins/givex-integrate/webhook.dev.php on line 94
上面的错误在这里 https://stackoverflow.com/a/58924492/2949184 解决了,并解决了我一直遇到的主要问题。
-
当涉及到控制台日志记录时,我使用
error_log();
然后查看PHP错误日志文件。 请参阅 https://www.loggly.com/ultimate-guide/php-logging-basics/ -
当我想知道钩子在哪里使用时,我取第一个字符串,
'wp_ajax_gi_check_balance'
并在 *.php 文件中搜索整个网站(如果我知道在哪里查找,则更少(,并查找一行说do_action('wp_ajax_gi_check_balance'...
.
我稍后会发布更多。
更新
我意识到我对你的其他问题并不比你更精明。我认为至少错误日志记录可以让您进一步发现它的工作原理。我要睡觉了,但我明天可能会再检查一下,以防你有更新。
更新 2
关于您的 SSL 错误:file_get_contents((:SSL 操作失败,代码为 1,无法启用加密
您是否尝试自己在谷歌上搜索错误?