如何在Python中加密有效载荷以进行付款-Adyen付款网关

时间:2019-06-04 14:17:38

标签: python encryption adyen

我对编码还很陌生,这是我正在从事的第一个较大的Python项目之一,而且我对Adyen付款提交有疑问。

我正在尝试在使用Adyen付款网关的网站上付款。 Adyen会对您的付款数据客户端进行加密,并且仅接受加密的请求,否则他们将抛出400错误的请求,并且付款不会通过。

我在创意方面陷入困境,在我手动付款时分析了Charles的流量-在付款之前,手机会将GET请求发送到Adyen网站上的this链接然后下一个请求是对带有已加密数据的付款URL的PUT请求。

我不知道该如何加密我的详细信息,以使Adyen能够接受它们并成功付款。 在付款之前,我是否可以使用链接中的代码在计算机上创建JS文件,然后可以在Python脚本中调用JS来加密细节?

我曾尝试将未加密的数据发送到付款URL,但是就像我之前说的那样,它只会返回400状态码,并且付款不会通过。 正确请求发送的加密数据如下所示: "encryptedData": "adyenjs_0_1_18$......"

def payment():
        payParams = {
            'api_key': 'websiteAPIKey',
            'channel': 'iphone-mosaic',
            'type': 'CARD'
        }
        payPayload = {
            'number': cardN,
            'expiryMonth': expM,
            'expiryYear': expY,
            'cvc': cvc,
            'holderName': fName + ' ' + lName
        }
        pay = s.put('websiteUsingAdyenGateway', headers = payHeaders, params = payParams, data = json.dumps(payPayload))

预期的结果应该是200个状态码,并且实际进行了付款,但没有加密,它总是返回400个状态码。

1 个答案:

答案 0 :(得分:0)

我认为您正在将自己插入不应执行的流程中。 Adyen正在 故意在客户端上为您加密详细信息。 PCI compliancy这是必需的。

如果您是PCI级别1或2,则仅处理raw card data 。您必须每年处理一百万或更多的交易才能符合条件。

假设没有,您应该使用组件(捆绑js购物者收集表的Adyen术语)收集卡的详细信息。您有两个组件可供选择:

  • card component:更多的即插即用功能,为所有卡片收集字段插入一个div
  • secure fields component:更可自定义,为卡的每个字段(例如,数字,信用卡,有效期限)插入一个div
  

注意:两者都要求您create an origin key必须与您要付款的域相匹配。例如如果要进行测试并将服务器托管在端口8080上的本地主机上,请为http://localhost:8080创建一个原始密钥。

在任何一种情况下,这两种方法都需要您实现一个回调,该回调将为您提供传递给Adyen所需的加密blob。

function handleOnChange(state, component) {
    if (state.isValid){
        // All card fields pass formatting validation
        fetch('localhost:8080/handleComponentData',{
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(state.data)
        })
    }
}

state.data可以作为/payments请求的一部分直接在paymentMethod对象中传递

state.data的内容:

{
    type: "scheme",
    encryptedCardNumber: "adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    encryptedExpiryMonth: "adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    encryptedExpiryYear: "adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    encryptedSecurityCode: "adyenjs_0_1_18$MT6ppy0FAMVMLH..."
}

/付款请求:

curl https://checkout-test.adyen.com/v46/payments \
-H "x-API-key: YOUR_X-API-KEY" \
-H "content-type: application/json" \
-d '{
  "amount":{
    "currency":"EUR",
    "value":1000
  },
  "reference":"YOUR_ORDER_NUMBER",
  "paymentMethod":{
    "type":"scheme",
    "encryptedCardNumber":"adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    "encryptedExpiryMonth":"adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    "encryptedExpiryYear":"adyenjs_0_1_18$MT6ppy0FAMVMLH...",
    "encryptedSecurityCode":"adyenjs_0_1_18$MT6ppy0FAMVMLH..."
  },
  "returnUrl":"https://your-company.com/checkout/",
  "merchantAccount":"YOUR_MERCHANT_ACCOUNT"
}'