0

我正在尝试在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) 的哈希值并将其传递给客户端。
# 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. 然后使用我从服务器端获得的附加参数( cardcvc2、cardexpiredate、cardpan、cardtype )和哈希执行 JSONP(为什么这里没有 CORS 和 RESTful API?)请求:

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. 得到结果:

{ "customermessage": "处理此交易时发生错误(错误的参数)。", "errorcode": "2007", "errormessage": "哈希不正确", "status": "ERROR" }

我正在使用 python 3.5 和 angular2。

我在这里做错了什么?

PS:

PP:

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

4

2 回答 2

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

于 2017-01-19T14:04:24.920 回答
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()

附言

同时api_version在 section 中注明为必需参数,并在 section 中注明3.1.2 Standard parameter应散列的参数3.1.4 Calculation of the HASH value。所以它看起来像输入文档。

于 2017-01-23T11:39:12.510 回答