Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 收到Payezy/Firstdata无效签名_Xml_Hash_Coldfusion_Cfhttp_Firstdata - Fatal编程技术网

Xml 收到Payezy/Firstdata无效签名

Xml 收到Payezy/Firstdata无效签名,xml,hash,coldfusion,cfhttp,firstdata,Xml,Hash,Coldfusion,Cfhttp,Firstdata,我目前正在开发一个使用Payezy/firstdata进行支付的网站。集成起来很麻烦,因为他们的API文档有点弱 我正在使用ColdFusion和cfhttp请求。我一直在按照以下步骤计算我的内容摘要和hmac哈希: 我最终得到了与演示终端中计算出的哈希值相匹配的哈希值,但是我的问题是:我在发送请求时遇到了一个奇怪的错误。我得到一个错误: “收到无效签名‘Fgx/lR’。” 其中前几个字符每次都会更改。以下是我的请求代码: 邮费= 密钥id、hmac值、内容摘要都经过测试,都是正确的 x_tim

我目前正在开发一个使用Payezy/firstdata进行支付的网站。集成起来很麻烦,因为他们的API文档有点弱

我正在使用ColdFusion和cfhttp请求。我一直在按照以下步骤计算我的内容摘要和hmac哈希:

我最终得到了与演示终端中计算出的哈希值相匹配的哈希值,但是我的问题是:我在发送请求时遇到了一个奇怪的错误。我得到一个错误:

“收到无效签名‘Fgx/lR’。”

其中前几个字符每次都会更改。以下是我的请求代码:

邮费= 密钥id、hmac值、内容摘要都经过测试,都是正确的 x_time=GetIsTimeString(现在())


提交的xml(不带空格或新行)


#确切身份证#
#密码#
#表格x\u卡片\u编号#
#FORM.x#u名字##FORM.x#u姓氏#
00
#表格x\U exp\U日期#
#数量#
#表格x_地址#
#FORM.x_city#
#FORM.x_zip#
我已将授权头更改为“Payezy_Gateway_API#key_id#::#hmac_value#”,并且在Payezy终端上多次测试所使用的hmac值和密钥id时,我收到错误“Bad authorization header”


请,非常感谢您的帮助

在您链接的支持页面上使用示例Python代码进行测试时,CGGE4_API和GGE4_API对我都有效,但我拨打了他们的支持电话,他们告诉我应该使用GGE4_API

显然,支持页面已经过时,使用Payezy_Gateway_API根本不起作用。下面是该页面上的示例Python代码的外观:

从hashlib导入sha1
从时间导入gmtime,strftime
导入base64
进口hmac
导入httplib
payezy_gateway_date=strftime(“%Y-%m-%dT%H:%m:%S”,gmtime())+Z”
uri='/transaction/v19'
key_id=“”#在此处添加您的密钥id
key=''#在此处添加您的HMAC密钥
事务_body=''#在此处添加事务请求正文
方法='POST'
content\u digest=sha1(事务\正文).hexdigest()
content_type='text/xml'#如果您使用的是json,则将其更改为'application/json'
主机='api.demo.globalgatewaye4.firstdata.com'
标题={'Content Type':内容类型,
“x-gge4-content-sha1”:内容摘要,
“x-gge4-date”:Payezy_网关_日期,
‘授权’:‘GGE4_API’+密钥id+’:‘+base64.b64encode(hmac.new(密钥、方法+“\n”+内容类型+“\n”+内容摘要+“\n”+Payezy_网关\u日期+“\n”+uri.split(“?”)[0],sha1.digest())}
conn=httplib.HTTPSConnection(主机)
conn.request(方法、uri、事务体、头)
打印连接getresponse().read()

在我的申请中,我还收到了收到的无效签名。原来我是在我的
内容类型
标题中添加
charset=utf-8
(归功于)。删除它使我的请求被接受。

我还试图用Payezy解决这个问题。我可能晚了一天,还缺了一美元,不过我还是要把这件事做好。我对我遇到的问题和/或尼克的原始代码做了几处修改:

  • 删除事务xml中的字符集声明
  • 将“文本”更改为“应用程序”
  • 为了使加密与网站的测试加密相匹配,我将回车改为
    char(10)
    ,然后
  • 将第一个标题条目从“CGGE4_API”更改为“GGE_API”
  • 仅供参考,如果您使用的是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,"&lt;","<","all")>
    <cfset postresult=replace(postresult,"&gt;",">","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>
    
    
    内容摘要:#内容摘要#

    #hmac_值#

    响应代码:

    <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,"&lt;","<","all")>
    <cfset postresult=replace(postresult,"&gt;",">","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>
    
    
    #postresult#

    #transactiontag#
    #授权数量#
    #交易批准#
    #exactmessage#
    #exactresponsecode#
    #sequenceno#
    #retrievalrefno#
    #卡片类型#
    #银行信息#
    ---#badtransactionmessage#

    只是猜测,但您的计算中是否包含字符集?IIRC,cfhttp默认添加“UTF-8”。Payezy文档说,“如果内容类型标题中包含字符集,那么在计算中也必须使用它(计算器中没有这方面的规定)”。这可能是个问题。您可以使用Fiddler查看它正在发送什么,或者如果发送失败,请将cfhttp指向服务器上的.cfm页面,该页面会转储
    GetHTTPRequestData()
    。此外,您确定它是“CGGE4_API”吗?一些示例使用了“GGE4_API”。不确定哪个是正确的。是的,我已经在上测试了python和C#示例。由于它们都有效,这表明cfhttp头中的文本前缀或额外字符集存在问题,但没有询问者的确认,这似乎不足以作为答案发布