Laravel 使用cybersource 插件 cybersource/rest-client-php

我的环境是PHP 7.4,laravel版本是5.8,使用composer 安装,

composer require cybersource/rest-client-php "0.0.23"

如果环境是PHP8 的话,未必适合这个版本的,所以建议 执行 composer 的时候不要填写版本号,系统会根据你的坏境选择最适合的

安装完后,会在vendor 中多了一个cybersource 的包,如图

打开composer.json,会看见一个Homepage,这里可以查看基本的教程

如果需要API 教程,地址是这个:

https://developer.cybersource.com/api-reference-assets/index.html#transaction-search

因为我这次的主要目的是查询订单的状态,所以就使用查询功能

步骤1:

首先创建一个配置文件 ,在app\Libs 创建 CyberSourceExternalConfiguration.php

<?php
/*
* Purpose : passing Authentication config object to the configuration
*/
namespace App\Libs;
use CyberSource;
use CyberSource\Configuration;

class CyberSourceExternalConfiguration
{
    //initialize variable on constructor
    function __construct()
    {


            $this->merchantID = $cyber['mid'];
            $this->apiKeyID = $cyber['key_id'];
            $this->secretKey = $cyber['seckey'];

            if($cyber['environment'] == 'sandbox'){
                $this->runEnv = 'apitest.cybersource.com';
            }else if($cyber['environment'] == 'production'){
                $this->runEnv = 'api.cybersource.com';
            }
        


        $this->authType = "http_signature";//http_signature/jwt
        $this->enableLog = false;
        $this->logSize = "1048576";
        $this->logFile = "Log";
        $this->logFilename = "Cybs.log";      
        // meta key config         
        $this->useMetaKey = false;
        $this->portfolioID = "";
        // end meta key config
        $this->keyAlias = "testrest";
        $this->keyPass = "testrest";
        $this->keyFilename = "testrest";
        $this->keyDirectory = "Resources/";
        // $this->runEnv = "apitest.cybersource.com";
        //OAuth related config
        $this->enableClientCert = false;
        $this->clientCertDirectory = "Resources/";
        $this->clientCertFile = "";
        $this->clientCertPassword = "";
        $this->clientId = "";
        $this->clientSecret = "";
        $this->merchantConfigObject();
    }
    //creating merchant config object
    function merchantConfigObject()
    {     
            $config = new \CyberSource\Authentication\Core\MerchantConfiguration();
            if(is_bool($this->enableLog))
                  $confiData = $config->setDebug($this->enableLog);
            $confiData = $config->setLogSize(trim($this->logSize));
            // $confiData = $config->setDebugFile(trim(__DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . $this->logFile));
            $confiData = $config->setDebugFile(public_path($this->logFile));

            $confiData = $config->setLogFileName(trim($this->logFilename));
            $confiData = $config->setauthenticationType(strtoupper(trim($this->authType)));
            $confiData = $config->setMerchantID(trim($this->merchantID));
            $confiData = $config->setApiKeyID($this->apiKeyID);
            $confiData = $config->setSecretKey($this->secretKey);
            $confiData = $config->setKeyFileName(trim($this->keyFilename));
            $confiData = $config->setKeyAlias($this->keyAlias);
            $confiData = $config->setKeyPassword($this->keyPass);
            $confiData = $config->setUseMetaKey($this->useMetaKey);
            $confiData = $config->setPortfolioID($this->portfolioID);
            $confiData = $config->setEnableClientCert($this->enableClientCert);
            $confiData = $config->setClientCertDirectory($this->clientCertDirectory);
            $confiData = $config->setClientCertFile($this->clientCertFile);
            $confiData = $config->setClientCertPassword($this->clientCertPassword);
            $confiData = $config->setClientId($this->clientId);
            $confiData = $config->setClientSecret($this->clientSecret);
            $confiData = $config->setKeysDirectory(__DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . $this->keyDirectory);
            $confiData = $config->setRunEnvironment($this->runEnv);
            $config->validateMerchantData($confiData);
            return $config;
    }

    function ConnectionHost()
    {
            $merchantConfig = $this->merchantConfigObject();
            $config = new Configuration();
            $config = $config->setHost($merchantConfig->getHost());
            $config = $config->setDebug($merchantConfig->getDebug());
            $config = $config->setDebugFile($merchantConfig->getDebugFile() . DIRECTORY_SEPARATOR . $merchantConfig->getLogFileName());
            return $config;
    }

    function FutureDate($format){
            if($format){
                    $rdate = date("Y-m-d",strtotime("+7 days"));
                    $retDate = date($format,strtotime($rdate));
            }
            else{
                    $retDate = date("Y-m",strtotime("+7 days"));
            }
            echo $retDate;
            return $retDate;
    }

    function CallTestLogging($testId, $apiName, $responseMessage){
            $runtime = date('d-m-Y H:i:s');
            $file = fopen("./CSV_Files/TestReport/TestResults.csv", "a+");
            fputcsv($file, array($testId, $runtime, $apiName, $responseMessage));
            fclose($file);
    }

    function downloadReport($downloadData, $fileName){
            $filePathName = __DIR__. DIRECTORY_SEPARATOR .$fileName;
            $file = fopen($filePathName, "w");
            fwrite($file, $downloadData);
            fclose($file);
            return __DIR__.'\\'.$fileName;
    }

    

}

?>

这是配置一些config 的参数,然后Controller 中调用

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Transaction;
use App\Config;
use DB;

use App\Libs\CyberSourceExternalConfiguration;
use CyberSource;


class CyberController extends Controller
{


    public function __construct(){

        
    }




    function commaSeparate ($dataToSign) {
        return implode(",",$dataToSign);
    }
    


    private function get_transctionDetail($invoice_id){


        //生成 查询ID
        $searchId = $this->getSearchId($invoice_id);
        //查询 结果
        $result = $this->GetSearchResults($searchId);

        $resp_content = array();
        //card info
        $card_bin = null;

        //遍历结果,检查是否付款成功
        if(@$result[0]['embedded']['transactionSummaries'] && count($result[0]['embedded']['transactionSummaries']) > 0){
            foreach($result[0]['embedded']['transactionSummaries'] as $k=>$l){

                //用户save 到log 表的内容
                if(@$l['applicationInformation']['applications'] && count(@$l['applicationInformation']['applications']) > 0){
                    foreach(@$l['applicationInformation']['applications'] as $key=>$v){
                        //找到对应的数据
                        if(in_array($v['name'],['ics_pa_enroll','ics_bill','ics_auth'])){
                            $resp_content[$key]['name'] = $v['name'];
                            $resp_content[$key]['reasonCode'] = $v['reasonCode'];
                            $resp_content[$key]['rCode'] = $v['rCode'];
                            $resp_content[$key]['rFlag'] = $v['rFlag'];
                            $resp_content[$key]['reconciliationId'] = $v['reconciliationId'];
                            $resp_content[$key]['rMessage'] = $v['rMessage'];
                            $resp_content[$key]['returnCode'] = $v['returnCode'];

                        }
                    }
                }

                //card info
                if(@$l['paymentInformation']['card']){
                    if(@$l['paymentInformation']['card']['prefix'] && @$l['paymentInformation']['card']['suffix']){
                        $card_bin = @$l['paymentInformation']['card']['prefix'].'******'.@$l['paymentInformation']['card']['suffix'];
                    }else{
                        $card_bin = '';
                    }
                }
            }
        }



        $payment_status = false;
        //检查是否全部 pass,付款成功3个值都是100
        if($resp_content){
            foreach($resp_content as $k=>$l){
                if($l['name'] == 'ics_bill'){
                    if($l['reasonCode'] == 100){
                        $payment_status = true;
                    }else{
                        $payment_status = false;
                        break;
                    }
                }

                if($l['name'] == 'ics_pa_enroll'){
                    if($l['reasonCode'] == 100){
                        $payment_status = true;
                    }else{
                        $payment_status = false;
                        break;
                    }
                }

                if($l['name'] == 'ics_auth'){
                    if($l['reasonCode'] == 100){
                        $payment_status = true;
                    }else{
                        $payment_status = false;
                        break;
                    }
                }
            }
        }

        //付款成功
        if($payment_status){
            $result['reasonCode'] = 100;
            $result['card_bin'] = $card_bin;
        }else{
            $result['reasonCode'] = 400;
        }
        return $result;
    }



    private function GetSearchResults($searchId){
        $commonElement = new CyberSourceExternalConfiguration();;
        $config = $commonElement->ConnectionHost();
        $merchantConfig = $commonElement->merchantConfigObject();

        $api_client = new CyberSource\ApiClient($config, $merchantConfig);
        $api_instance = new CyberSource\Api\SearchTransactionsApi($api_client);

        $result = null;
        try {
            $apiResponse = $api_instance->getSearch($searchId);
            // print_r(PHP_EOL);
            // print_r($apiResponse);

            return $apiResponse;
        } catch (Cybersource\ApiException $e) {
            // print_r($e->getResponseBody());
            // print_r($e->getMessage());
            return $e->getMessage();
        }
    }


    private function getSearchId($invoice_id){
        $requestObjArr = [
                "save" => false,
                "name" => "MRN",
                "timezone" => "America/Chicago",
                "query" => "clientReferenceInformation.code:".$invoice_id,
                "offset" => 0,
                "limit" => 100,
                "sort" => "id:asc,submitTimeUtc:asc"
        ];
        $requestObj = new \CyberSource\Model\CreateSearchRequest($requestObjArr);
        $commonElement = new CyberSourceExternalConfiguration();
        $config = $commonElement->ConnectionHost();
        $merchantConfig = $commonElement->merchantConfigObject();
        $api_client = new CyberSource\ApiClient($config, $merchantConfig);
        $api_instance = new CyberSource\Api\SearchTransactionsApi($api_client);
        $searchId = null;
        try {
            $apiResponse = $api_instance->createSearch($requestObj);
            $searchId = @$apiResponse[0]['searchId'];
            // print_r(PHP_EOL);
            // print_r($apiResponse);
            // return @$apiResponse[0]['searchId']
        } catch (Cybersource\ApiException $e) {
            // print_r($e->getResponseBody());
            // print_r($e->getMessage());
            $searchId = $e->getMessage();
        }
        return $searchId;
    }    


}

重点看 get_transctionDetail() 的方法,查询订单状态的逻辑应该,先根据条件生成一条 SearchId,然后通过SearchId 再向cybersource 查询订单状态

基本流程是这样!

相关推荐
s_nshine12 分钟前
将 build.gradle 配置从 Groovy 迁移到 Kotlin
android·开发语言·kotlin·gradle·groovy·build
Jerry_正弦13 分钟前
Kotlin中object关键字的作用
android·开发语言·kotlin
wjs202417 分钟前
R 绘图 - 饼图
开发语言
buyue__17 分钟前
Kotlin/Android中执行HTTP请求
android·开发语言·kotlin
Jerry_正弦17 分钟前
Kotlin模仿Rxjava进行数据的流式转换实现
开发语言·kotlin·rxjava
向宇it24 分钟前
【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感
开发语言·游戏·unity·游戏引擎
ZJ_.37 分钟前
Node.js 使用 gRPC:从定义到实现
java·开发语言·javascript·分布式·rpc·架构·node.js
concisedistinct1 小时前
大数据开发语言 Scala(四):面向对象编程
大数据·开发语言·后端·scala·编程语言·面向对象
_Rookie._1 小时前
java 单例模式
java·开发语言·单例模式