• Hi,

    I have installed the Antom Payment Plugin and registered for Antom Account. I have put in test credentials and I am testing with AlipayHK payment method however I cannot make it past the checkout. I have opened developer tools and I can see the request /?wc-ajax=checkout return a error 500.

    When I turn on WP_DEBUG, I can see the following error:

    [17-Oct-2024 05:27:34 UTC] PHP Fatal error: Uncaught TypeError: strlen(): Argument #1 ($string) must be of type string, array given in /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/model/order/antom-order-payment-method-model.php:295
    Stack trace: 0 /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/gateways/class-wc-gateway-antom-common.php(448): Antom_Order_Payment_Method_Model->set_extend_info(Array) 1 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-checkout.php(1062): WC_Gateway_Antom_Common->process_payment(19966) 2 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-checkout.php(1293): WC_Checkout->process_order_payment(19966, 'antom_alipay_hk') 3 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-ajax.php(520): WC_Checkout->process_checkout() 4 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(324): WC_AJAX::checkout('') 5 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array) 6 /nas/content/live/newmeowilld/wp-includes/plugin.php(517): WP_Hook->do_action(Array) 7 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-ajax.php(96): do_action('wc_ajax_checkou…') 8 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(324): WC_AJAX::do_wc_ajax('') 9 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters(false, Array) 10 /nas/content/live/newmeowilld/wp-includes/plugin.php(517): WP_Hook->do_action(Array) 11 /nas/content/live/newmeowilld/wp-includes/template-loader.php(13): do_action('template_redire…') 12 /nas/content/live/newmeowilld/wp-blog-header.php(19): require_once('/nas/content/li…') 13 /nas/content/live/newmeowilld/index.php(17): require('/nas/content/li…') 14 {main}

    thrown in /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/model/order/antom-order-payment-method-model.php on line 295

    I have followed the stack trace and I believe the issue comes from the file:

    File: antom-payments/includes/gateways/class-wc-gateway-common.php
    Line 332 - extend_info is a associative array and not a normal array
    $extend_info = array(
    'PaymentSource' => 'WooC',
    );
    Line 448 - when we try to call the method set_extend_info from the function below, it generates the error above due to data type mismatch

    File: antom-payments/includes/model/order/antom-order-payment-model.php
    Line 294 - The function strlen expects a string or a array of string, not an associative array.

    public function set_extend_info( $extendInfo ) {
    if ( strlen( $extendInfo ) > 2048 ) {
    throw new InvalidArgumentException( 'extendInfo must be less than 2049 characters' );
    }
    $this->offsetSet( 'extendInfo', $extendInfo );
    }

    Unfortunately I am unsure what is the intended data type in this situation, so I don’t know how to fix. Is it possible to get any assistance with this? I would really love to deploy this plugin and move to Antom. I am currently using stripe for alipay payments

    • This topic was modified 1 month, 1 week ago by Fenga.
Viewing 15 replies - 1 through 15 (of 26 total)
  • Hello,

    We sincerely apologize for any inconvenience our plugin code has caused. We will locate the issue and fix it as soon as possible.

    In the meantime, to help you quickly test the payment process, I recommend temporarily removing the code $payment_method_model->set_extend_info( $extend_info ); from line 448 in antom-payments/includes/gateways/class-wc-gateway-common.php. After doing so, please proceed with your testing. This modification will not affect transactions initiated in either production or testing mode.

    Thank you very much for your feedback and support

    Additionally, would you mind letting me know the PHP version and WordPress version you are using? This will help us replicate the issue. Thank you very much!

    Thread Starter Fenga

    (@fungzhao)

    Hi @skyman2024 ,

    Thank you for the quick reply! I have actually temporarily removed the check for the strlen to see if that fixes it, the /?wc-ajax=checkout still returns error 500, however the stack trace is now different.

    Now the error is in

    PHP Fatal error:  Uncaught TypeError: strstr(): Argument #1 ($haystack) must be of type string, array given in /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/sdk/antom-alipay-client.php:191
    Stack trace:
    #0 /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/sdk/antom-alipay-client.php(191): strstr(Array, 'response-time')
    #1 /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/sdk/antom-alipay-client.php(45): Antom_Alipay_Client->sendRequest('https://open-se...', 'POST', Array, '{"extendInfo":"...')
    #2 /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/gateways/class-wc-gateway-antom-common.php(503): Antom_Alipay_Client->execute(Object(Antom_Alipay_Online_Request))
    #3 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-checkout.php(1062): WC_Gateway_Antom_Common->process_payment(19967)
    #4 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-checkout.php(1293): WC_Checkout->process_order_payment(19967, 'antom_alipay_hk')
    #5 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-ajax.php(520): WC_Checkout->process_checkout()
    #6 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(324): WC_AJAX::checkout('')
    #7 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
    #8 /nas/content/live/newmeowilld/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
    #9 /nas/content/live/newmeowilld/wp-content/plugins/woocommerce/includes/class-wc-ajax.php(96): do_action('wc_ajax_checkou...')
    #10 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(324): WC_AJAX::do_wc_ajax('')
    #11 /nas/content/live/newmeowilld/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters(false, Array)
    #12 /nas/content/live/newmeowilld/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
    #13 /nas/content/live/newmeowilld/wp-includes/template-loader.php(13): do_action('template_redire...')
    #14 /nas/content/live/newmeowilld/wp-blog-header.php(19): require_once('/nas/content/li...')
    #15 /nas/content/live/newmeowilld/index.php(17): require('/nas/content/li...')
    #16 {main}
    thrown in /nas/content/live/newmeowilld/wp-content/plugins/antom-payments/includes/sdk/antom-alipay-client.php on line 191

    Looking at the file at antom-payments/includes/sdk/antom-alipay-client.php

    Line 191 - Looks like for some reason, it is seeing the $headerItem as a array instead of a str. I'll try and add some debug logs, as the response information in the Dashboard doesn't show header details, but thought ill respond to you first

    foreach ( $headArr as $headerItem ) {
    if ( strstr( $headerItem, 'response-time' ) || strstr( $headerItem, 'signature' ) ) {
    $responseTime = $this->getResponseTime( $headerItem );
    if ( isset( $responseTime ) && null != $responseTime ) {
    $httpRpcResult->setRspTime( trim( $responseTime ) );
    } else {
    $signatureValue = $this->getResponseSignature( $headerItem );
    if ( isset( $signatureValue ) && null != $signatureValue ) {
    $httpRpcResult->setRspSign( $signatureValue );
    }
    }
    }
    Line 191
    foreach ( $headArr as $headerItem ) {
    if ( strstr( $headerItem, 'response-time' ) || strstr( $headerItem, 'signature' ) ) {
    $responseTime = $this->getResponseTime( $headerItem );
    if ( isset( $responseTime ) && null != $responseTime ) {
    $httpRpcResult->setRspTime( trim( $responseTime ) );
    } else {
    $signatureValue = $this->getResponseSignature( $headerItem );
    if ( isset( $signatureValue ) && null != $signatureValue ) {
    $httpRpcResult->setRspSign( $signatureValue );
    }
    }
    }

    The API call was successful as I see in my dashboard, however I guess the error occurs when parsing the response back.

    By the way, my PHP Version is 8.2 and WordPress Version 6.6.2

    Thread Starter Fenga

    (@fungzhao)

    Hi @skyman2024

    Again thank you for looking into this, much appreciated!

    I have more info, I did a print of the headers and it looks like it fails when it hits the cookie header, the cookie header is parsed as an array

    [
    'date' => '[MASKED]',
    'content-type' => '[MASKED]',
    'content-length' => '[MASKED]',
    'set-cookie' => [
    '[MASKED]',
    '[MASKED]',
    '[MASKED]',
    ],
    'strict-transport-security' => '[MASKED]',
    'signature' => '[MASKED]',
    'response-time' => '[MASKED]',
    'client-id' => '[MASKED]',
    'tracerid' => '[MASKED]',
    'via' => '[MASKED]',
    'origin-agent-cluster' => '[MASKED]',
    ]

    I have temporarily changed line 191 to below to get pass the issue.

    if ( is_string( $headerItem ) && strstr( $headerItem, 'response-time' ) || is_string( $headerItem ) && strstr( $headerItem, 'signature' ) ) {

    /?wc-ajax=checkout now returns 200 OK, however unfortunately my checkout page does not redirect to Alipay for QR Code scanning. Not too sure where to go from here.

    Thank you again for the help!

    Thread Starter Fenga

    (@fungzhao)

    Hi, Ignore the below, I cleared my cart and tried again and I got redirected, so it looks like the above 2 issues, are the main blocker

    ——————————————-

    Oh sorry! the /?wc-ajax=checkout returns 200 OK, but I checked the contents and it actually fails with the below response

    {
    "result": "failure",
    "messages": "\n<div class=\"wc-block-components-notice-banner is-error\" role=\"alert\">\n\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\">\n\t\t<path d=\"M12 3.2c-4.8 0-8.8 3.9-8.8 8.8 0 4.8 3.9 8.8 8.8 8.8 4.8 0 8.8-3.9 8.8-8.8 0-4.8-4-8.8-8.8-8.8zm0 16c-4 0-7.2-3.3-7.2-7.2C4.8 8 8 4.8 12 4.8s7.2 3.3 7.2 7.2c0 4-3.2 7.2-7.2 7.2zM11 17h2v-6h-2v6zm0-8h2V7h-2v2z\"><\/path>\n\t<\/svg>\n\t<div class=\"wc-block-components-notice-banner__content\">\n\t\tThe order is closed.\t<\/div>\n<\/div>\n",
    "refresh": false,
    "reload": false
    }
    • This reply was modified 1 month, 1 week ago by Fenga.

    Hello Fenga,

    The reason you received the “order_is_closed” response is that the payment order associated with this order has already been closed on our side, and a notification was sent to your website. It seems that your WordPress system did not correctly process the notification, which caused the WordPress payment plugin to believe that the payment order is still open. Due to idempotency, this triggered the request error.

    You now need to check the following:

    1. Ensure that the clientId configured in your system is correct and is not replaced or altered during the request and notification handling process.
    2. Clear the checkout and generate a new order number to initiate a new payment.

    Thank you.

    • This reply was modified 1 month, 1 week ago by skyman2024.
    Thread Starter Fenga

    (@fungzhao)

    Hi, @skyman2024

    Thank you very much! I am still trying to get the notification url working, it seems like it is not. The clientId is configured correctly.

    May I ask for the public key in the plugin, should that be the Antom Public Key? or should that be My Public Key that was generated with the private key? The documentation is not very clear on that. Does that impact the notification url?

    Thank you for the support!

    The public key need to be configured is Antom Public Key.
    We have identified that the issue may be related to the handling of certain request headers when receiving notifications. Along with the previous issue, we will work on locating the problem and releasing a fix as soon as possible. Thank you for your patience and support.

    Thread Starter Fenga

    (@fungzhao)

    Thank you for clarifying that! Appreciate it!

    That is wonderful to hear, will wait for a fix to come out, thank you for looking into it

    Hello Fenga
    Could you please tell me what server your WordPress site is deployed on? Is it Apache, Nginx, or another server?

    Thread Starter Fenga

    (@fungzhao)

    Hi @skyman2024,

    thank you for getting back to me! The web server my hosting uses is nginx server.

    please let me know if you need any other information

    @fungzhao
    We suspect that the issue is related to not being able to correctly retrieve headers on the Nginx server., which leads to the failure of notification signature verification. We have adjusted the plugin code and conducted tests on the Nginx server. It works properly for signature verification on our configured Nginx server.

    We have released the fixed version as version 1.0.1. We hope you can try it out at your convenience.

    Thank you very much for your patience and understanding. We will follow up promptly with any questions you may have.

    Thread Starter Fenga

    (@fungzhao)

    Hi @skyman2024 ,

    Thank you very much, let me take 1.0.1 for a spin, will let you know how I go

    Thanks again for the help!

    Thread Starter Fenga

    (@fungzhao)

    Just upgraded and everything works! The previous issues also disappeared too, Thank you!

    I did just noticed a couple of more things, not sure if its plugin related, but after a successful payment and I get redirected to the orders page, I notice that my cart is not cleared. The items that were purchased still remains in the cart. Is that something that the plugin is meant to clear? or perhaps something misconfigured in woocommerce?

    Just one more thing, I am using the test wallet to test the payment and it looks like it works when I have the AlipayHK payment method selected only. In a production scenario will the customer in China be able to pay with their alipay even though I have the AlipayHK payment method enabled?

    Thanks!

    Hello, @fungzhao

    The current logic of our plugin is as follows: When a user creates an order and has not yet made a payment, the order remains in the “pending payment” status, and the contents of the cart will not be cleared. Only when a successful payment notification is received will the order be set to either “PROCESSING” or “COMPLETED,” at which point the contents of the cart will be cleared.

    I also need to confirm some additional information. When you see that the contents of the cart have not been cleared, is the order still in the “pending payment” status? If the order has been set to “PROCESSING” or “COMPLETED” and the cart contents are still not cleared, this is a clear abnormal scenario that requires further inspection and testing.

    Regarding your second question, ALIPAY_HK is the most popular payment method in Hong Kong. In other regions of China, the widely used payment method is ALIPAY_CN. If you wish to provide payment options for users in regions outside of Hong Kong, you need to enable the ALIPAY_CN payment method in our plugin and log in to our merchant portal’s payment methods page to confirm that the ALIPAY_CN payment method has been activated (activation does not require any submission of materials; it will be automatically activated once you complete your KYC certification, though it may take several weeks for ALIPAY_CN to conduct the review).

    If you intend to sell to users in China, we recommend enabling both ALIPAY_CN and ALIPAY_HK payment methods in the plugin.

    Additionally, regarding the notification issue you encountered during plugin debugging, testing successful payment notifications in a production environment can be quite challenging. I am discussing with the product manager the possibility of setting the order to “on-hold” after the payment initiation. After the payment expires (usually defaulting to 15 minutes after initiation), we will send a failure notification and set the WooCommerce order status to “FAIL.” You can test whether production orders are set to “FAIL” in a timely manner to verify if the notifications are configured correctly. This may allow us to release a new version of the plugin, which you can download as needed.

    Thank you!

Viewing 15 replies - 1 through 15 (of 26 total)
  • You must be logged in to reply to this topic.