WHCS价格通过API与动态数组

时间:2017-07-16 15:19:46

标签: php api whmcs

我想知道如何通过WHMCS API获得WHMCS Price。

我已经创建了一个小脚本来通过API获得价格工作正常但是当我在外部WHMCS页面上更新脚本时,需要花费更多时间来更新每个页面上的功能我的简单问题是获得价格通过API而不定义第一个数组,请参见下面的示例。

Array
(
    [result] => success
    [totalresults] => xxx
    [products] => Array
        (
            [product] => Array
                (
                    [0] => Array // how can I call it dynamically
                        (
                            [pid] => 1
                            [gid] => 1
                            [type] => hostingaccount
                            [name] => Plan Name
                            [description] => Plan Description
                            [module] => cpanel
                            [paytype] => recurring
                            [pricing] => Array
                                (
                                    [USD] => Array
                                        (
                                            [prefix] => $
                                            [suffix] => USD
                                            [msetupfee] => 0.00
                                            [qsetupfee] => 0.00
                                            [ssetupfee] => 0.00
                                            [asetupfee] => 0.00
                                            [bsetupfee] => 0.00
                                            [tsetupfee] => 0.00
                                            [monthly] => 0.14
                                            [quarterly] => 0.39
                                            [semiannually] => 0.73
                                            [annually] => 1.32
                                            [biennially] => 2.39
                                            [triennially] => 3.20
                                        )

                                )

                        )
                )
        )
)

我只想在定义[pid]后得到价格,然后我会创建一个像

这样的函数

GetPrice($pid, $billingcycle); // to get produce price according to tenure

我的剧本:

$identifier = "IDENTIFIER";
$secret = "SECRET";
$APIURL = "mydomain/whmcs_directory/includes/api.php"; // it is with HTTPS

$postfields = array(
    'username' => $identifier,
    'password' => $secret,
    'action' => 'GetProducts',
    'responsetype' => 'json',
);

// Call the API
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $APIURL);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postfields));
$response = curl_exec($ch);
if (curl_error($ch)) {
    die('Unable to connect: ' . curl_errno($ch) . ' - ' . curl_error($ch));
}
curl_close($ch);

// Decode response
$jsonData = json_decode($response, true);

然后我想使用函数来根据产品ID&获得价格如前所定义的任期,但完整的功能看起来像这样。

function GetPrice($pid, $billingcycle){

    // $pid will be product ID
    // $billingcycle will be 1,3,6,12,24,36 accordingly.

    /**
     * It would be great if I could just remove "["products"]["product"]" 
     * But I understand to call API I have define them so it's Okay.
     */

    $monthly        =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["monthly"];
    $quarterly      =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["quarterly"];
    $semiannually   =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["semiannually"];
    $annually       =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["annually"];
    $biennially     =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["biennially"];
    $triennially    =   $jsonData["products"]["product"][$pid]["pricing"]["USD"]["triennially"];

    if( $billingcycle == "1"  ){
        echo $monthly;
    }

    if( $billingcycle == "3"  ){
        echo $quarterly;
    }

    if( $billingcycle == "6"  ){
        echo $semiannually;
    }

    if( $billingcycle == "12"  ){
        echo $annually;
    }

    if( $billingcycle == "24"  ){
        echo $biennially;
    }

    if( $billingcycle == "36"  ){
        echo $triennially;
    }
}

我从WHMCS API Reference获得了帮助

这已经完成了php,请在需要时改进我的代码。

1 个答案:

答案 0 :(得分:2)

我使用以下代码实现了这一点,这些代码动态工作并与产品ID配合使用。

PHP功能

function GetPrice($product_id, $billingcycle){

    $identifier = "WHMCS_IDENTIFIER";
    $secret = "WHMCS_SECRET";
    $APIURL = "YOURDOMAIN.com/WHMCS_DIRECTORY/includes/api.php"; // use HTTPS

    $postfields = array(
        'username'      =>  $identifier,
        'password'      =>  $secret,
        'action'        =>  'GetProducts',
        'pid'           =>  $product_id, // Product id
        'responsetype'  =>  'json',
    );

    // Call the API
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $APIURL);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // SET to 0 for non SSL
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postfields));
    $response = curl_exec($ch);
    if (curl_error($ch)) {
        //die('Unable to connect: ' . curl_errno($ch) . ' - ' . curl_error($ch));
        die("Out of Stock");
    }
    curl_close($ch);

    // Decode response
    $jsonData = json_decode($response, true);

    $monthly        =   $jsonData["products"]["product"][0]["pricing"]["USD"]["monthly"];
    $quarterly      =   $jsonData["products"]["product"][0]["pricing"]["USD"]["quarterly"];
    $semiannually   =   $jsonData["products"]["product"][0]["pricing"]["USD"]["semiannually"];
    $annually       =   $jsonData["products"]["product"][0]["pricing"]["USD"]["annually"];
    $biennially     =   $jsonData["products"]["product"][0]["pricing"]["USD"]["biennially"];
    $triennially    =   $jsonData["products"]["product"][0]["pricing"]["USD"]["triennially"];

    if( $billingcycle == "1"  ){
        echo round( str_replace('.00', '', $monthly), 2 );
    }

    if( $billingcycle == "3"  ){
        echo round( str_replace('.00', '', $quarterly) / 3, 2 );
    }

    if( $billingcycle == "6"  ){
        echo round( str_replace('.00', '', $semiannually) / 6, 2 );
    }

    if( $billingcycle == "12"  ){
        echo round( str_replace('.00', '', $annually) / 12, 2 );
    }

    if( $billingcycle == "24"  ){
        echo round( str_replace('.00', '', $biennially) / 24, 2 );
    }

    if( $billingcycle == "36"  ){
        echo round( str_replace('.00', '', $triennially) / 36, 2 );
    }
}

使用功能

echo GetPrice( 1 , 1 );

<强>输出

1.99