我目前正在开发一个使用payeezy/firstdata进行支付的网站。这是一个相当麻烦的集成,因为他们的API文档有点弱。
我使用ColdFusion和cfhttp请求。我一直在跟踪计算内容摘要和hmac散列:https://support.payeezy.com/hc/en-us/articles/203731149-API-Security-HMAC-Hash
我最终得到了与演示终端中计算的散列相匹配的散列,但是我的问题是:在发送请求时得到了一个奇怪的错误。我知道错误:
“接收到的无效签名‘Fgx/lR#’”
前几个角色每次都会变。这是我的请求代码:
postAction = https://api.demo.globalgatewaye4.firstdata.com/transaction/v19 key_id,hmac_value,content_digest都经过了测试,并且正确的x_time = getIsoTimeString( now() )
<cfhttp url="#postAction#" method="POST">
<cfhttpparam name="Authorization" type="header" value="CGGE4_API #key_id#:#hmac_value#">
<cfhttpparam name="x-gge4-date" type="header" value="#x_time#">
<cfhttpparam name="x-gge4-content-sha1" type="header" value="#LCase(content_digest)#">
<cfhttpparam name="content-type" type="header" value="text/xml">
<cfhttpparam name="accept" type="header" value="text/xml">
<cfhttpparam name="transaction_body" type="xml" value="#exact_xml#" />
</cfhttp>
<cfdump var="#cfhttp.fileContent#"><cfabort>提交的xml (没有空格或新行)
<Transaction>
<ExactID>#exact_id#</ExactID>
<Password>#password#</Password>
<Card_Number>#FORM.x_card_num#</Card_Number>
<CardHoldersName>#FORM.x_first_name# #FORM.x_last_name#</CardHoldersName>
<Transaction_Type>00</Transaction_Type>
<Expiry_Date>#FORM.x_exp_date#</Expiry_Date>
<DollarAmount>#amount#</DollarAmount>
<Address>
<Address1>#FORM.x_address#</Address1>
<City>#FORM.x_city#</City>
<Zip>#FORM.x_zip#</Zip>
</Address>
</Transaction>我已经将授权头更改为"Payeezy_Gateway_API #key_id#:#hmac_value#“,当在付费终端上多次测试所使用的hmac值和密钥id时,我得到了错误”坏授权头“。
拜托,任何帮助都是非常感谢的!
发布于 2015-09-09 21:43:09
在您链接的支持页面上使用它们的样例Python代码进行测试时,CGGE4_API和GGE4_API都为我工作,但我打了他们的支持号,他们告诉我我应该使用GGE4_API。
显然,支持页面已经过时,而且使用Payeezy_Gateway_API根本不起作用。下面是该页面上的Python示例代码的外观:
from hashlib import sha1
from time import gmtime, strftime
import base64
import hmac
import httplib
payeezy_gateway_date = strftime("%Y-%m-%dT%H:%M:%S", gmtime()) + 'Z'
uri = '/transaction/v19'
key_id = '' # Add your key id here
key = '' # Add your HMAC key here
transaction_body = '' # Add your transaction request body here
method = 'POST'
content_digest = sha1(transaction_body).hexdigest()
content_type = 'text/xml' # Change this to 'application/json' if you're using JSON
host = 'api.demo.globalgatewaye4.firstdata.com'
headers = { 'Content-Type': content_type,
'x-gge4-content-sha1': content_digest,
'x-gge4-date': payeezy_gateway_date,
'Authorization': 'GGE4_API ' + key_id + ':' + base64.b64encode(hmac.new(key, method + "\n" + content_type + "\n" + content_digest + "\n" + payeezy_gateway_date + "\n" + uri.split('?')[0], sha1).digest()) }
conn = httplib.HTTPSConnection(host)
conn.request(method, uri, transaction_body, headers)
print conn.getresponse().read()在我的申请中,我也收到了收到的无效签名。结果是,我将charset=utf-8添加到Content-Type头中,(归功于Leigh's comment)。删除它让我的请求被接受了。
发布于 2015-11-19 17:58:03
我也试图用Payeezy来解决这个问题。我可能迟到了一天,也少了一美元,不过我还是要把这件事做好。我对我遇到问题的代码和/或Nick的原始代码做了几处更改:
char(10),并且只要FYI,如果您使用的是v11,则不需要任何头或散列代码,只需要xml。
下面是我的整个测试代码,包括一些分解返回xml的代码。
请求代码:
<cfset hmac_key="WO9QVjnis6eBb5oOYmA_DSShc82gteFw">
<cfset trans="<?xml version='1.0' ?><Transaction><ExactID>XX55555-55</ExactID><Password>testtest11</Password><Card_Number>5454545454545454</Card_Number><CardHoldersName>Bix Dirigible</CardHoldersName><Transaction_Type>00</Transaction_Type><Expiry_Date>0916</Expiry_Date><DollarAmount>12.03</DollarAmount></Transaction>">
<cfset key_id="555555">
<cfset content_digest=lcase(Hash(trans,"SHA"))>
<cfset curDate = Now()>
<cfset utcDate = DateConvert("local2utc", curDate)>
<cfset udate=dateformat(utcdate,"yyyy-mm-dd")><cfset utime=timeformat(utcdate,"HH:mm:ss")>
<cfset x_time=udate&"T"&utime&"Z" >
<cfset submitfinalhmac="POST"&chr(10)&"application/xml"&chr(10)&content_digest&chr(10)&x_time&chr(10)&"/transaction/v12">
<cfoutput>
content_digest: #content_digest#<BR />
<BR />
<!--- Ben Nadel's encrypting code, http://www.bennadel.com/blog/1971-authenticating-twilio-request-signatures-using-coldfusion-and-hmac-sha1-hashing.htm --->
<cfset secretKeySpec = createObject("java", "javax.crypto.spec.SecretKeySpec" ).init( toBinary( toBase64( hmac_key ) ), "HmacSHA1" )/>
<cfset mac = createObject( "java", "javax.crypto.Mac" ).getInstance( "HmacSHA1" )/>
<cfset mac.init( secretKeySpec ) />
<cfset encryptedBytes = mac.doFinal( toBinary( toBase64( submitfinalhmac ) ) ) />
<cfset secureSignature = createObject( "java", "org.apache.commons.codec.binary.Base64" ).encodeBase64( encryptedBytes ) />
<cfset hmac_value = toString( secureSignature ) />
#hmac_value#
<BR /><BR />
</cfoutput>
<cfhttp method="Post" url="https://api.demo.globalgatewaye4.firstdata.com/transaction/v12"
useragent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.1599.69 Safari/537.36">
<cfhttpparam name="Authorization" type="header" value="GGE4_API #key_id#:#hmac_value#">
<cfhttpparam name="x-gge4-date" type="header" value="#x_time#">
<cfhttpparam name="x-gge4-content-sha1" type="header" value="#content_digest#">
<cfhttpparam name="content-type" type="header" value="application/xml">
<cfhttpparam name="accept" type="header" value="application/xml">
<cfhttpparam name="transaction_body" type="xml" value="#trans#" />
</cfhttp>响应代码:
<cfset postresult=HTMLEditFormat(cfhttp.fileContent)>
<cfset postresult=replace(postresult,"<","<","all")>
<cfset postresult=replace(postresult,">",">","all")>
<cfset postresult=replace(postresult,"##","-","all")>
<cfoutput>
#postresult#<BR />
<cfset badtransaction=0><cfset badtransactionmessage="">
<cfset rawerror="">
<cfif findnocase("bad request",postresult)><cfset rawerror=trim(gettoken(postresult,2,"-"))>
<cfset badtransactionmessage=badtransactionmessage&rawerror>
<cfset badtransaction=1>
</cfif>
<cfif findnocase("unauthorized request",postresult)><cfset rawerror=trim(gettoken(postresult,2,"."))>
<cfset badtransactionmessage=badtransactionmessage&rawerror>
<cfset badtransaction=1>
</cfif>
<cfset resultarray=arraynew(2)>
<cfset line=1>
<cfset enterflag=0>
<cfset startflag=0>
<cfloop index="getchar" from="1" to="#len(postresult)-22#">
<cfif mid(postresult,getchar,9) is "<exactid>" ><cfset startflag=1></cfif>
<cfif mid(postresult,getchar,19) is "</TransactionResult>" ><cfset startflag=0></cfif>
<cfif startflag is 1>
<cfif enterflag is 2>
<cfif mid(postresult,getchar,1) is "<"><cfset enterflag=0><cfset line++>
<cfelse>
<cfset resultarray[line][2]=resultarray[line][2]&mid(postresult,getchar,1)>
</cfif>
</cfif>
<cfif enterflag is 1>
<cfif mid(postresult,getchar,1) is ">" >
<cfset enterflag=2>
<cfelse>
<cfset resultarray[line][1]=resultarray[line][1]&mid(postresult,getchar,1)>
</cfif>
</cfif>
<cfif enterflag is 0>
<cfif mid(postresult,getchar,1) is "<" and mid(postresult,getchar+1,1) is not "/">
<cfset enterflag=1>
<cfset resultarray[line][1]="">
<cfset resultarray[line][2]="">
</cfif>
</cfif>
</cfif>
</cfloop>
<cfdump var="#resultarray#">
<cfset transactiontag="">
<cfset authorizationnum="">
<cfset transactionapproved="">
<cfset exactmessage="">
<cfset exactresponsecode="">
<cfset sequenceno="">
<cfset retrievalrefno="">
<cfset cardtype="">
<cfset bankmessage="">
<cfloop index="getresponses" from="1" to ="#arraylen(resultarray)#">
<cfif resultarray[getresponses][1] is "Transaction_Tag"><cfset transactiontag=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "Authorization_Num"><cfset AuthorizationNum=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "Transaction_Approved"><cfset TransactionApproved=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "EXact_Message"><cfset EXactMessage=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "EXact_Resp_Code"><cfset EXactResponseCode=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "SequenceNo"><cfset SequenceNo=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "Retrieval_Ref_No"><cfset RetrievalRefNo=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "CardType"><cfset CardType=resultarray[getresponses][2]></cfif>
<cfif resultarray[getresponses][1] is "bank_message"><cfset bankmessage=resultarray[getresponses][2]></cfif>
</cfloop>
<BR />
#transactiontag#<BR />
#authorizationnum# <BR />
#transactionapproved# <BR />
#exactmessage#<BR />
#exactresponsecode#<BR />
#sequenceno#<BR />
#retrievalrefno#<BR />
#cardtype#<BR />
#bankmessage#<BR />
<cfif trim(transactionapproved) is not "true" and trim(transactionapproved) is not "">
<cfset badtransaction=2>
<cfset badtransactionmessage=badtransactionmessage&bankmessage>
</cfif>
<cfif badtransaction gt 0>
---#badtransactionmessage#<BR />
</cfif>
</cfoutput>https://stackoverflow.com/questions/32258886
复制相似问题