Giter Club home page Giter Club logo

stymiee / authnetjson Goto Github PK

View Code? Open in Web Editor NEW
17.0 3.0 10.0 1.11 MB

Library that abstracts Authorize.Net's JSON APIs. This includes the Advanced Integration Method (AIM), Automated Recurring Billing (ARB), Customer Information Manager (CIM), Transaction Reporting, Simple Integration Method (SIM), and Webhooks.

Home Page: http://www.johnconde.net/blog/tutorial-integrate-all-authorize-net-json-apis-with-one-universal-php-class-aim-arb-cim-transaction-details/

License: Apache License 2.0

PHP 100.00%
php json-api webhook capture-transaction authorize-net authorizenet payment payment-gateway

authnetjson's Introduction

Hi, I'm John Conde!

  • 🔭 I’m currently working at Dealer Inspire (Cars.com) as a Manager, Website Platform (Engineering)
  • 😄 Pronouns: He/Him/His

Trophies

Github Stats

Find me around the web:

Technology & Programming Social
stymiee.dev Untappd
John Conde .net LinkedIn
Stack Overflow @stymiee (Twitter)
Webmasters @SOHotQuestions (Twitter)
Github Last.fm
Packagist Instagram
Sitepoint (author) Pinterest
PHP Classes Steam
GOG

Read some of my blog articles

Hits since January 26, 2022

authnetjson's People

Contributors

mmeyer2k avatar stymiee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

authnetjson's Issues

Suggestion: more robust error code / message handling

For transactions with response codes 2-4 I'm interested in logging the error/message code and text. AuthnetJsonResponse::getErrorCode() and getErrorText() is basically what I want, but those are conditional on isError().

In some of the transactions I'm seeing, the Authorize.net API call was successful, but the transaction failed (card declined). So the above functions return empty strings, even though there is a transactionResponse->errors or transactionResponse->messages in the response.

I'm not sure the best way to add this functionality, but perhaps adding something like getTransactionErrorCode and getTransactionErrorText functions that always return those values, regardless of the isError.

I can manually work around this for now, just wanted to make a suggestion.

Error when trying to create webhook or getting notification for ARB with webhooks

Authnetjson\AuthnetJsonResponse Object
(
    [response:Authnetjson\AuthnetJsonResponse:private] => stdClass Object
        (
            [messages] => stdClass Object
                (
                    [resultCode] => Error
                    [message] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [code] => E00003
                                    [text] => The 'AnetApi/xml/v1/schema/AnetApiSchema.xsd:createWebhooks' element is not declared.
                                )

                        )

                )

        )

    [responseJson:Authnetjson\AuthnetJsonResponse:private] => {"messages":{"resultCode":"Error","message":[{"code":"E00003","text":"The 'AnetApi/xml/v1/schema/AnetApiSchema.xsd:createWebhooks' element is not declared."}]}}
    [transactionInfo:Authnetjson\AuthnetJsonResponse:private] => 
    [transactionInfoArray:Authnetjson\AuthnetJsonResponse:private] => 
)

code for creating webhook:

$request = AuthnetApiFactory::getJsonApiHandler(
                    MERCHANT_LOGIN_ID,
    				MERCHANT_TRANSACTION_KEY,
                    AuthnetApiFactory::USE_PRODUCTION_SERVER
                );
        $response = $request->createWebhooks([
            "net.authorize.customer.subscription.expiring",
            "net.authorize.customer.subscription.suspended",
            "net.authorize.payment.authcapture.created",
            "net.authorize.payment.authorization.created",
            "net.authorize.payment.capture.created",
            "net.authorize.payment.fraud.approved",
            "net.authorize.payment.fraud.declined",
            "net.authorize.payment.fraud.held",
            "net.authorize.payment.priorAuthCapture.created",
            "net.authorize.payment.refund.created",
            "net.authorize.payment.void.created"
        ], 'http://www.example.com:55950/api/webhooks', 'active');
        
        echo "<pre>";
        print_r($response);

Code for webhook Notification:

        $payload = file_get_contents("php://input");
        $webhook = new AuthnetWebhook(AUTHNET_SIGNATURE, $payload);
        if ($webhook->isValid()) {
            // Get the transaction ID
            $transactionId = $webhook->payload->id;
         
            // Here you can get more information about the transaction
            $request = AuthnetApiFactory::getJsonApiHandler(
                    MERCHANT_LOGIN_ID,
    				MERCHANT_TRANSACTION_KEY,
                    AuthnetApiFactory::USE_DEVELOPMENT_SERVER
                );
            $response = $request->getTransactionDetailsRequest([
                'transId' => $transactionId
            ]);
         
            /* You can put these response values in the database or whatever your business logic dictates.
            $response->transaction->transactionType
            $response->transaction->transactionStatus
            $response->transaction->authCode
            $response->transaction->AVSResponse
            */
        }

error at: $webhook = new AuthnetWebhook(AUTHNET_SIGNATURE, $payload); // code does not pass here.

CURL Class not found

Hii

Im using authnet
when i run /examples/aim/createTransactionRequest_authCapture.php file ....

giving an error

Class 'Curl\Curl' not found in src\authnet\AuthnetApiFactory.php on line 63

Namespacing for Exception folder isn't quite right.

Changing namespaces was a big BC change and should have been done under a 5.0 release. Anyway, the new namespace isn't quite PSR-0/4 compliant. It should be:

"autoload": {
    "psr-4": {
        "Authnetjson\\": "src/Authnetjson/"
    }
},

And the namespace for the Exceptions folder should be:

namespace Authnetjson/Exception;

image

If you don't get to it, I'll try to make a PR by the end of the week.

Webhook returned as not valid if apache_request_headers isn't defined

The getAllHeaders() method in AuthnetWebhook provides a workaround for situations where apache_request_headers() isn't defined, but it's incorrect.

protected function getAllHeaders()
    {
        if (function_exists('apache_request_headers')) {
            $headers = apache_request_headers();
        } else {
            $headers = array_filter($_SERVER, function($key) {
                return strpos($key, 'HTTP_') === 0;
            }, ARRAY_FILTER_USE_KEY);
        }
        return $headers;
    }

The headers array when using the non-Apache method is different to the Apache version. For one, all the header keys start with HTTP_ and they also use underscores instead of dashes. i.e.

HTTP_X_ANET_SIGNATURE instead of X-ANET-SIGNATURE

Hence, the isset() check in isValid() fails.

AuthnetJsonResponse.php getErrorText() & getErrorCode() bug

I believe there is a bug based on Authorize.Net documentation. In both functions getErrorText() and getErrorCode() you have this code block:

if (@$this->transactionResponse->errors[0]->errorText) {
    $message = $this->transactionResponse->errors[0]->errorText;
}

Looking at the Authorize.Net documentation for the Response I see errors outlined as such:

errors | This element contains one or more error elements.

So I believe the above code block should be written as such:

if (@$this->transactionResponse->errors->error[0]->errorText) {
    $message = $this->transactionResponse->errors->error[0]->errorText;
}

getTransactionDetailsRequest Sample Code Not Working

I am having some difficulty with the getTransactionDetailsRequest part of your sample code. Whenever I run the following the results from transactionType and transactionStatus are empty:

$transactionId = $webhook->payload->id;
    $merchantrefid = $webhook->payload->merchantReferenceId;
    $eventtype = $webhook->eventType;
    // Here you can get more information about the transaction
    $request  = AuthnetApiFactory::getJsonApiHandler(\SampleCodeConstants::MERCHANT_LOGIN_ID, \SampleCodeConstants::MERCHANT_TRANSACTION_KEY);
    $response = $request->getTransactionDetailsRequest(array(
        'transId' => $transactionId,
    ));
    $transtype = $response->transaction->transactionType;
    $transstatus = $response->transaction->transactionStatus;
    if($eventtype == 'net.authorize.payment.authcapture.created')
    {
        print_log('TID = ' . $transactionId.' RefID = '.$merchantrefid.' EventType = '.$eventtype.' TransactionType = '.$transtype.' TransactionStatus = '.$transstatus);
    }

Fatal error: Unsupported operand types in authnetjson-php56\src\authnet\AuthnetJsonRequest.php on line 159

I have this error when create subscription by ARBCreateSubscriptionRequest

My data:

$charge = [
	'refId' => 'DNHKTXU5AWC7P3IB4',
        'subscription' => [
            'name' => 'DNHKTXU5AWC7P3IB4',
            'paymentSchedule' => [
                'interval' => [
			'length' => 1,
			'unit'   => 'months'
                ],
                'startDate' => date('Y-m-d'),
                'totalOccurrences' => 6,
                'trialOccurrences' => 0
            ],
            'trialAmount' => 0,
            'amount' => 9,
	    'payment' => [
	            'creditCard' => [
                            'cardNumber' => '4111111111111111',
                            'expirationDate' => '2022-10',
                            'cardCode' => '123'
                    ],
	        ],
            'order' => [
		'invoiceNumber' => 'DNHKTXU5AWC7P3IB4',
		'description'   => 'Sell Movie Tickets Online for VIP: Monthly',
            ]
        ]
];

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.