使用Python验证Payone上的信用卡(creditcardcheck)

时间:2017-01-19 13:02:57

标签: python payment-gateway credit-card payone

我正在尝试验证 PayOne https://www.payone.de/en/)上的信用卡。

我从文档的According to 3.4.1 Verifying credit cards (creditcardcheck)3.1.2 Standard parameter部分得到的参数列表PAYONE_Platform_Client_API_EN.pdf(您可以在此处https://www.payone.de/en/contact/请求)。

  1. 我计算(aid,api_version,mid,mode,portalid,responsetype,request,storecarddata)(Python)的哈希值,并将其传递给客户端。
  2. # build hash on server side: 
    import hmac
    import hashlib
    
    params = {
        'aid': '123456', 
        'api_version': '3.12', 
        'mid': '123456', 
        'mode': 'test', 
        'portalid': '1234567', 
        'responsetype': 'JSON', 
        'request': 'creditcardcheck', 
        'storecarddata': 'yes'
    }
    message = ''.join([params[k] for k in sorted(params)])
    return hmac.new(b'some-secret-key!', msg=message.encode('utf-8'), digestmod=hashlib.sha384).hexdigest()
    
    1. 然后做JSONP(为什么这里没有CORS和RESTful API?)请求使用其他参数( cardcvc2,cardexpiredate,cardpan,cardtype )和我从服务器端获得的哈希:
    2.   

      https://secure.pay1.de/client-api/?aid=123456&api_version=3.10&cardcvc2=123&cardexpiredate=1801&cardpan=012344567890123&cardtype=M&mid=12345&mode=test&portalid=1234567&responsetype=JSON&request=creditcardcheck&storecarddata=yes&hash=c6a8fe28e6d4cc63139aae5eba41bdb74f877f364a444745f4083a22db0f9861247cd4a0dfa82bd42df1ff7724754ea6&callback_method=ng_jsonp.__req0.finished

      1. 得到结果:
      2.   

        {       “customermessage”:“处理此事务时出错(参数错误)。”,       “errorcode”:“2007”,       “errormessage”:“哈希不正确”,       “status”:“ERROR”}

        我正在使用python 3.5和angular2。

        我在这里做错了什么?

        PS:

        • 你可以找到示例php代码here,但没有python代码

        PPS:

        已在网络界面中选择哈希方法:https://pmi.pay1.de/merchants/?navi=portal&rc=1Method hash calculation*: SHA2-384 (recommended method)

2 个答案:

答案 0 :(得分:0)

默认情况下,payone商家帐户使用md5而不是sha384

# build hash on server side: 
import hmac
import md5
import hashlib

params = {
        'request': 'creditcardcheck', 
        'responsetype': 'JSON',       
        'mode': 'test',               
        'mid': '12345',                                
        'aid': '54321',                                
        'portalid': '2222222',                         
        'encoding': 'UTF-8',                           
        'storecarddata': 'yes', 
}
message = ''.join([params[k] for k in sorted(params)])
print message

m = hashlib.md5()
m.update(message)
m.update("secretkey")
print m.hexdigest()

输出:

54321UTF-812345test2222222creditcardcheckJSONyes
a435bff18234ec02a2dffa4d4850a08f

然后,打开URL并确保URL中传递的除信用卡参数(和回调方法)之外的所有参数也在哈希中。在这个例子中它是:

https://secure.pay1.de/client-api/?aid=54321&cardcvc2=123&cardexpiredate=1801&cardpan=4111111111111111&cardtype=V&mid=12345&mode=test&portalid=2222222&responsetype=JSON&encoding=UTF-8&request=creditcardcheck&storecarddata=yes&hash=a435bff18234ec02a2dffa4d4850a08f

答案 1 :(得分:0)

解决方案是没有api_version参数的呼叫端点:

# build hash on server side: 
import hmac
import hashlib

params = {
    'aid': '123456', 
#    'api_version': '3.12', 
    'mid': '123456', 
    'mode': 'test', 
    'portalid': '1234567', 
    'responsetype': 'JSON', 
    'request': 'creditcardcheck', 
    'storecarddata': 'yes'
}
message = ''.join([params[k] for k in sorted(params)])
return hmac.new(b'some-secret-key!', msg=message.encode('utf-8'), digestmod=hashlib.sha384).hexdigest()

PS

在同一时间api_version被注明为3.1.2 Standard parameter部分的必需参数以及应在部分3.1.4 Calculation of the HASH value进行哈希处理的参数。所以它看起来像是在文档中输入。