INS read receipt response
Overview
Message types
1
Message Invoice
{
"sale_id":"1",
"sale_date_placed":"1990-01-01 12:00:00",
"recurring":1,
"payment_type":"credit card",
"list_currency":"USD",
"fraud_status":"pass",
"order_ref":"1",
"order_no":"1",
"vendor_id":"TESTVENDORID",
"vendor_order_id":"",
"invoice_id":"100000000000",
"invoice_status":"approved",
"invoice_list_amount":"100",
"invoice_usd_amount":"100",
"invoice_cust_amount":"100",
"item_count":1,
"auth_exp":"2022-01-01",
"customer_first_name":"John",
"customer_last_name":"Doe",
"customer_name":"Jane Doe",
"customer_email":"john.doe@test.com",
"customer_phone":"",
"customer_ip":"1.1.1.1",
"customer_ip_country":null,
"cust_currency":"USD",
"bill_city":"TestCity",
"bill_country":"NER",
"bill_postal_code":"",
"bill_state":"",
"bill_street_address":"TestStreet",
"bill_street_address2":"",
"ship_status":"",
"ship_tracking_number":"",
"ship_name":"Doe John",
"ship_street_address":"TestStreet",
"ship_street_address2":"",
"ship_city":"TestCity",
"ship_state":"",
"ship_postal_code":"",
"ship_country":"NER",
"message_id":1,
"message_type":"INVOICE_STATUS_CHANGED",
"message_description":"Invoice status changed",
"timestamp":"2021-01-01 12:00:00 EEST",
"key_count":1,
"item_name_1":"Electronically Delivered Software",
"item_id_1":"",
"item_list_amount_1":"100",
"item_usd_amount_1":"100",
"item_cust_amount_1":"100",
"item_type_1":"bill",
"item_duration_1":"Forever",
"item_recurrence_1":"1 Month",
"item_rec_list_amount_1":"100",
"item_rec_status_1":"live",
"item_rec_date_next_1":"",
"item_rec_install_billed_1":"1",
"hash":"3B2EF87601E548597155C6751FFCCF76"
}2
Message Product
{
"message_id":1,
"message_type":"CATALOGUE_PRODUCT_CREATED",
"message_description":"New catalogue product created",
"timestamp":"2021-01-01 12:00:00 EEST",
"key_count": 1,
"avangate_id":"1",
"enabled":true,
"fulfillment":"NO_DELIVERY",
"fulfillment_information":{
"is_start_after_fulfillment":false,
"is_electronic_code":false,
"is_download_link":false,
"is_backup_media":false,
"is_download_insurance_service":false,
"is_instant_delivery_thank_you_page":false,
"is_display_in_partners_c_panel":false,
"code_list":null,
"backup_media":null,
"product_file":null,
"additional_information_by_email":null,
"additional_information_email_translations":{
},
"additional_thank_you_page":null,
"additional_thank_you_page_translations":{
},
"return_method":{
"type":null,
"url":null
}
},
"generates_subscription":true,
"gift_option":false,
"product_group":null,
"long_description":"",
"platforms":{
"0":{
"id_platform":"1",
"platform_name":"Linux",
"category":"Desktop"
}
},
"prices":{
"name":"TEST's Price Configuration",
"code":"TESTCODE",
"default":true,
"billing_countries":[\
],
"use_original_prices":false,
"pricing_schema":"DYNAMIC",
"price_type":"NET",
"default_currency":{
"id":"1",
"code":"USD",
"digitCode":"840",
"label":"United States Dollar",
"symbol":"$",
"symbolPosition":"left",
"decimalSeparator":".",
"unitSeparator":",",
"decimals":"2"
},
"prices":{
"regular":{
"0":{
"amount":100,
"currency":"USD",
"min_quantity":"1",
"max_quantity":"99999",
"option_codes":null
}
},
"renewal":{
}
},
"price_options":{
}
},
"product_category":"TESTCATEGORY",
"product_code":"TESTCODE",
"product_images":null,
"product_name":"TESTNAME",
"product_type":"REGULAR",
"product_version":"",
"purchase_multiple_units":true,
"shipping_class":null,
"short_description":"",
"subscription_information":{
"deprecated_products":[\
],
"bundle_renewal_management":"GLOBAL",
"billing_cycle":-1,
"billing_cycle_units":"M",
"is_one_time_fee":true,
"contract_period":null,
"usage_billing":7,
"grace_period":null,
"renewal_emails":{
"type":"GLOBAL",
"settings":{
"manual_renewal":{
"before30_days":false,
"before15_days":false,
"before7_days":false,
"before1_day":false,
"on_expiration_date":false,
"after5_days":false,
"after15_days":false
},
"automatic_renewal":{
"before30_days":false,
"before15_days":false,
"before7_days":false,
"before1_day":true,
"on_expiration_date":true,
"after5_days":false,
"after15_days":false
}
}
}
},
"trial_description":"",
"trial_url":"",
"tangible":false,
"tangible_details":{
"unit_details":[\
],
"fee":[\
]
},
"hash":"435EA2BFAB983240CC27C5FC5D8323B4"
}3
Message Proposal
{
"message_id":1,
"message_type":"PROPOSAL_CREATED",
"message_description":"Proposal created",
"timestamp":"2021-01-01 12:00:00 EET",
"key_count":1,
"proposal_id":"1",
"version":"1",
"created_date":"2021-01-01 12:00:00",
"updated_date":"2021-01-01 12:00:00",
"created_by":"TEST",
"updated_by":"TEST",
"locked":"",
"source":"",
"content":"TEST CONTENT",
"bill_to":"TEST BILL",
"name":"TEST NAME",
"tac":"TEST TAC",
"type":"TEST TYPE",
"sent_by":"TEST NAME 2",
"links":"TEST LINK",
"status":"PENDING",
"expiration_date":"2022-01-01 12:00:00",
"status_comment":"",
"sell_to":"TEST NAME",
"hash":"B87C32614A96FCE9C614C0721D19C3B0"
}Validate response
1
Invoice (required parameters)
PHP Example for Message Invoice
<?php
$invoiceDetails = $_POST;
$secretKey = 'EXAMPLE_SECRET_KEY';
$secretWord = 'EXAMPLE_SECRET_WORD';
$TCOVendorId = 123example_vendor_id; // your 2checkout vendor id should be a number
$saleId = $invoiceDetails['sale_id'];
$invoiceId = $invoiceDetails['invoice_id'];
$hash = explode(':',$invoiceDetails['hash']); // index 0 is algorithm, index 1 is the hash
$parameters = [\
$saleId,\
$TCOVendorId,\
$invoiceId,\
$secretWord\
];
$calculatedHash = strtoupper(hash_hmac($hash[0] ,implode($parameters),$secretKey));
if ($calculatedHash === $hash[1]) {
http_response_code(200);
echo true;
} else {
http_response_code(400);
echo "calculated hash: $calculatedHash \n";
echo "received hash: $hash[1]";
}
?>Node.JS (ES6) Example for Message Invoice
const crypto = require('crypto');
const merchantCode = '123example_vendor_id';
const secretWord = 'EXAMPLE_SECRET_WORD';
const secretKey = 'EXAMPLE_SECRET_KEY';
let saleId = request.params['sale_id'];
let invoiceId = request.params['invoice_id'];
let insHashArray = request.params['hash'].split(':');
let insAlgo = insHashArray[0];
let insHash = insHashArray[1];
let parameters = [\
saleId,\
merchantCode,\
invoiceId,\
secretWord\
];
const hash = crypto.createHmac(insAlgo, secretKey)
.update(parameters.join(''))
.digest('hex');
console.log(hash.toUpperCase() === insHash);Python Example for Message Invoice
import hmac
merchant_code = 'EXAMPLE_MERCHANT_CODE'
secret_word = 'EXAMPLE_SECRET_WORD'
secret_key = 'EXAMPLE_SECRET_KEY'
sale_id = param['sale_id']
invoice_id = param['invoice_id']
ins_hash_array = param['hash'].split(':')
ins_algo = ins_hash_array[0].replace('-', '_').lower();
ins_hash = ins_hash_array[1];
parameters = [\
sale_id,\
merchant_code,\
invoice_id,\
secret_word\
]
hash_string = hmac.new(secret_key.encode('utf-8'), ''.join(parameters).encode('utf-8'), ins_algo).hexdigest().upper()
print(ins_hash == hash_string)2
Product (required parameters)
PHP Example for Message Product
<?php
$invoiceDetails = $_POST;
$secretKey = 'EXAMPLE_SECRET_KEY';
$TCOVendorId = 123example_vendor_id; // your 2checkout vendor id should be a number
$productCode = $invoiceDetails['product_code'];
$hash = explode(':',$invoiceDetails['hash']); // index 0 is algorithm, index 1 is the hash
$parameters = [\
$productCode,\
$TCOVendorId,\
$secretKey\
];
$calculatedHash = strtoupper(hash_hmac($hash[0] ,implode($parameters),$secretKey));
if ($calculatedHash === $hash[1]) {
http_response_code(200);
echo true;
} else {
http_response_code(400);
echo "calculated hash: $calculatedHash \n";
echo "received hash: $hash[1]";
}
?>Node.JS (ES6) Example for Message Product
const crypto = require('crypto');
const merchantCode = '123example_vendor_id';
const secretKey = 'EXAMPLE_SECRET_KEY';
let productCode = request.params[‘product_’code];
let insHashArray = request.params['hash'].split(':');
let insAlgo = insHashArray[0];
let insHash = insHashArray[1];
let parameters = [\
productCode,\
merchantCode,\
secretKey\
];
const hash = crypto.createHmac(insAlgo, secretKey)
.update(parameters.join(''))
.digest('hex');
console.log(hash.toUpperCase() === insHash);Python Example for Message Product
import hmac
merchant_code = 'EXAMPLE_MERCHANT_CODE'
secret_key = 'EXAMPLE_SECRET_KEY'
product_code = param[‘product_code’]
ins_hash_array = param['hash'].split(':')
ins_algo = ins_hash_array[0].replace('-', '_').lower();
ins_hash = ins_hash_array[1];
parameters = [\
product_code,\
merchant_code,\
secret_key\
]
hash_string = hmac.new(secret_key.encode('utf-8'), ''.join(parameters).encode('utf-8'), ins_algo).hexdigest().upper()
print(ins_hash == hash_string)3
Proposal (required parameters)
PHP Example for Message Proposal
<?php
$invoiceDetails = $_POST;
$secretKey = '=B6gcTl(4t8@D3yUM!TP';
$secretWord = 'Mv#-Z*nb7U%qYJwc-tsb&f?JEyUP5p5WK4*txCfT@336CuwZrZkdqc&K$zEZqnBP';
$TCOVendorId = 250111206876;
$proposalId = $invoiceDetails['proposal_id'];
$hash = explode(':',$invoiceDetails['hash']); // index 0 is algo, index 1 is hash
$parameters = [\
$proposalId,\
$TCOVendorId,\
$secretWord\
];
$calculatedHash = strtoupper(hash_hmac($hash[0] ,implode($parameters),$secretKey));
if ($calculatedHash === $hash[1]) {
http_response_code(200);
echo true;
} else {
http_response_code(400);
echo "calculated hash: $calculatedHash \n";
echo "received hash: $hash[1]";
}
?>Node.JS (ES6) Example for Message Proposal
const crypto = require('crypto');
const secretWord = 'AABBCCDDEEFF';
const 2COVendorId = 1;
let proposalId = request.params['proposal_id'];
let parameters = [\
proposalId,\
2COVendorId,\
secretWord\
];
let hash = crypto.createHash('md5').update(parameters.join('')).digest();
console.log(hash.toUpperCase() === request.params['md5_hash']);Python Example for Message Proposal
from urllib import request
from flask import Flask, jsonify, request, Request
from urllib.parse import urlencode, urldefrag
from werkzeug.datastructures import ImmutableOrderedMultiDict
import hashlib
class MyRequest(Request):
parameter_storage_class = ImmutableOrderedMultiDict
class MyFlask(Flask):
request_class = MyRequest
app = MyFlask(__name__)
def calculate_hash_string(payload_tuple_list):
secretWord = 'AABBCCDDEEFF'
2COVendorId = 1
proposalId = payload_tuple_list['proposalId']
parameters = [\
proposalId,\
2COVendorId,\
secretWord\
]
hash_string = hashlib.md5(''.join(parameters).encode('utf-8')).digest().upper()
return hash_string
@app.route('/ins', methods=['POST'])
def ins():
ins_payload_received = request.form
return ins_payload_received['md5_hash'] === calculate_hash_string(ins_payload_received)
if __name__ == '__main__':
app.run()Read receipt response
Last updated
Was this helpful?