From表单3D集成指南
# From表单3D集成指南
# 接入说明
推荐使用风控插件集成方案
From表单3D集成方案是风控插件集成方案的备选方案。两种方案二选一,当前方案有一定限制,有部分交易通道的3d交易无法支持,会造成交易失败。 当前方案使用from表单的方式来提交必要的3d参数,并跳转到对应的3d验证页面。 该方案有两种情景分支,取决于requestMethod参数。
# GET方式
当requestMethod=GET时候,直接跳转到acsUrl上。跳转成功之后将会展示3d验证页面,用户必须在页面上完成3d验证, 此时,页面将会跳转shopperResultUrl。
{
"accId": "2021031111071710123362",
"acsUrl": "https://staging.gate.e-comprocessing.net/threeds/authentication/935ec31d7994841060327ed4cfddf98a",
"amount": "1",
"clientId": "2021031111071710123",
"code": "002000",
"connector": "THREEDSECURE",
"currency": "USD",
"description": "Transaction processing",
"language": "en",
"merchantTransactionId": "PShop20220224133957QE",
"paymentType": "SALE",
"relateTransactionId": "PS22022413395876528",
"requestMethod": "GET",
"shopperResultUrl": "https://test-pay.pingpongx.com/qa/result.html",
"sign": "004A34342C24BBCE29DC6DB198023D1E",
"signType": "MD5",
"status": "PROCESSING",
"termUrl": "https://sandbox-acquirer-payment.pingpongx.com/Ecp/threeDSecure/JJ3nGLGt0POPwIKaY2o4rawYlWkozh4A6HtSlOvmr05jNWvX0YKjJbu-q6u_yVtKYw11YBfbQ8V0H9egKh7ww2xvAq97R3Ym9lQ14FkXmoVxL_J-zKNktZ90lH3OMxFNals8kIzQrur21muzwdMX1Zn6clRQL26ZlHu4Ngd4Uh5udaHElBQt4hKEu3OquKJC",
"threedDHighLevelParams": {
"connector": "THREEDSECURE"
},
"transactionId": "PS22022413395876528",
"transactionTime": "1645681200000"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# POST方式
当requestMethod=POST时候,需要通过构造From表单提交的形式来跳转到acsUrl上。跳转成功之后将会展示3d验证页面,用户必须在页面上完成3d验证, 此时,页面将会跳转shopperResultUrl。
{
"accId": "2018092714313010016305",
"acsUrl": "https://test.ppipe.net/connectors/demo/submit?action=ACI3DS2AccessControlServer&ndcid=8ac7a4c872dae5960172e0bb0ed216eb_fef6e13247004dd4bfa778d6542b21a8&acsRequest=CHALLENGE&acsData=eyJUSFJFRURTU0VSVkVSX1VSTCI6Imh0dHBzOi8vdGVzdC5wcGlwZS5uZXQvY29ubmVjdG9ycy9hcl9zaW11bGF0b3IvM2RzMjtqc2Vzc2lvbmlkPTA5NzI0MTlFNUQ4Njc5MzVBQkExREMzRDI5OEQ1NkJFLnVhdDAxLXZtLWNvbjAyP2FzeW5jc291cmNlPUFDSV8zRFNfMiZ0eXBlPXJlc3VsdHMmbmRjaWQ9OGFjN2E0Yzg3MmRhZTU5NjAxNzJlMGJiMGVkMjE2ZWJfZmVmNmUxMzI0NzAwNGRkNGJmYTc3OGQ2NTQyYjIxYTgiLCJEU19UUkFOU19JRCI6ImRiNGU3MzE4LTM3NzItNGZmZi1iNzk3LTYwZGMxZTcwNzM1YyIsIkRBVEUiOiIyNC4wMi4yMDIyIiwiZGVsYXkiOiJOT05FIiwiVEhSRUVEU1NFUlZFUl9UUkFOU19JRCI6IjczMmJlNzJiLTY4MDYtNDNjYS04MGQzLWVlZWQ5NTBlOTc1MiIsIkFNT1VOVCI6IjMuMDAgVVNEIiwiTk9USUZJQ0FUSU9OX1VSTCI6Imh0dHBzOi8vdGVzdC5wcGlwZS5uZXQvY29ubmVjdG9ycy9hcl9zaW11bGF0b3IvM2RzMjtqc2Vzc2lvbmlkPTA5NzI0MTlFNUQ4Njc5MzVBQkExREMzRDI5OEQ1NkJFLnVhdDAxLXZtLWNvbjAyP2FzeW5jc291cmNlPUFDSV8zRFNfMiZ0eXBlPW5vdGlmaWNhdGlvbiZuZGNpZD04YWM3YTRjODcyZGFlNTk2MDE3MmUwYmIwZWQyMTZlYl9mZWY2ZTEzMjQ3MDA0ZGQ0YmZhNzc4ZDY1NDJiMjFhOCIsIlZFUlNJT04iOiIyLjIuMCIsIkFDU19UUkFOU19JRCI6ImE4Njg1Yzk5LTAyMjMtNGUyYS1hZDYwLTczMzAwMzllZWM4ZSIsIkRFVklDRV9DSEFOTkVMIjoiMDIiLCJTRVJWSUNFX1RZUEUiOiJWZXJpZmllZEJ5VklTQSIsIkNBUkRfTlVNQkVSIjoiKioqKioqKioqKioqMDAxMCJ9",
"amount": "3",
"clientId": "2018092714313010016",
"code": "002000",
"connector": "THREEDSECURE",
"currency": "USD",
"description": "Transaction processing",
"language": "en",
"merchantTransactionId": "PShop20220224203014SU",
"paymentType": "SALE",
"relateTransactionId": "PS22022420301688245",
"requestMethod": "POST",
"shopperResultUrl": "https://test-pay.pingpongx.com/qa/result.html",
"sign": "02E6971AF9EF84A420598EE7FCF1D9F8",
"signType": "MD5",
"status": "PROCESSING",
"termUrl": "https://test-acquirer-payment.pingpongx.com/Trustpay/threeDSecure/I9ye-Pu3Pf0I76EcnAHeSPJ3ZuGvdjyOOBqKXHcZ_j7QZlbBmygt62-UeZ_sIELzQcC0lLewqUTr4tXGJdDLfF8AwXJxTKrWHl7SSK5XpEDPF2z8972p6u0wJuVVAnMaQ-mBFIhOYIvJeF1lDh6QsFomF8eiEDjAvgq-P5mDXTyxIguBCakZjFwqM17awTlF",
"threedDHighLevelParams": {
"creq": "eyJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiI3MzJiZTcyYi02ODA2LTQzY2EtODBkMy1lZWVkOTUwZTk3NTIiLCJhY3NUcmFuc0lEIjoiYTg2ODVjOTktMDIyMy00ZTJhLWFkNjAtNzMzMDAzOWVlYzhlIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0",
"threeDSSessionData": ""
},
"transactionId": "PS22022420301688245",
"transactionTime": "1645705819000"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 如何集成
为保证3d页面正常展示,我们需要综合考虑这两种方式。
- 当acsUrl不存在时候,不需要3d跳转。
- 存在,则按照上述方式进行跳转。
以下代码封装这个流程,可供参考。
如何调用:复制代码到你的工程中,然后将交易接口的返回对象传入。
# 代码示例
function threeDFormToSubmit(responseBody) {
//打印入参
console.log('responseBody:', responseBody)
let acsUrl = null
let requestMethod = null
let threedDHighLevelParams = null
if (responseBody.hasOwnProperty('threedDHighLevelParams')) {
threedDHighLevelParams = responseBody.threedDHighLevelParams
}
// 首先看返回值最外层是否有threedDHighLevelParams 有则在 threedDHighLevelParams里面去acsUrl
if (threedDHighLevelParams !== null && threedDHighLevelParams.hasOwnProperty('acsUrl')) {
acsUrl = threedDHighLevelParams.acsUrl
//其次 如果没有渠道 就看responseBody 最外层是否有acsUrl
} else if (responseBody.hasOwnProperty('acsUrl')) {
acsUrl = responseBody.acsUrl
} else {
//都没有的情况 直接跳出 不走3d
console.log('acsUrl 为空')
return
}
//requestMethod 存在就取,不存在 报错退出
if (responseBody.hasOwnProperty('requestMethod')) {
requestMethod = responseBody.requestMethod
} else {
console.log('requestMethod 为空')
return
}
//requestMethod 是GET的情况 直接跳转acsUrl 并退出
if (requestMethod.toUpperCase() === 'GET') {
window.location.href = acsUrl
return
}
//POST的情况 构建form表单来提交跳转到3d验证页面
let threeDForm = document.createElement('form')
let htmlString = ''
//遍历threedDHighLevelParams 取键值对赋值为表单项的name和value
for (const threedDHighLevelParamsKey in threedDHighLevelParams) {
if (threedDHighLevelParams.hasOwnProperty(threedDHighLevelParamsKey)) {
htmlString = htmlString.concat('<input type="hidden" name="' + threedDHighLevelParamsKey + '" value="' + threedDHighLevelParams[threedDHighLevelParamsKey] + '"/>')
console.log('name', threedDHighLevelParamsKey, 'value', threedDHighLevelParams)
} else {
console.log('未知错误 不存在参数 ', threedDHighLevelParamsKey)
}
}
threeDForm.innerHTML=htmlString;
threeDForm.action = acsUrl
threeDForm.method = requestMethod;
console.log(htmlString)
console.log(threeDForm)
//手动提交 调试用
// let submitInput = document.createElement('input')
// submitInput.type = 'submit'
// threeDForm.appendChild(submitInput)
//规范Form submission algorithm https://codereview.chromium.org/2416033002
//解决Chrome56 不能提交的问题
window.document.body.appendChild(threeDForm)
//自动提交
threeDForm.submit();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 调用示例
threeDFormToSubmit({
'accId': '2020083116203010128130',
'acsUrl': 'https://test.ppipe.net/connectors/demo/submit?action=ACI3DS2AccessControlServer&ndcid=8ac7a4c872dae5960172e0bb0ed216eb_3a64b9a22f544e3b8b9e69bf36d51ad4&acsRequest=CHALLENGE&acsData=eyJUSFJFRURTU0VSVkVSX1VSTCI6Imh0dHBzOi8vdGVzdC5wcGlwZS5uZXQvY29ubmVjdG9ycy9hcl9zaW11bGF0b3IvM2RzMjtqc2Vzc2lvbmlkPUIwMzQxOTgyNzI4RkY3MDM0MTZGRjZEMUY2NTM2RDNDLnVhdDAxLXZtLWNvbjAzP2FzeW5jc291cmNlPUFDSV8zRFNfMiZ0eXBlPXJlc3VsdHMmbmRjaWQ9OGFjN2E0Yzg3MmRhZTU5NjAxNzJlMGJiMGVkMjE2ZWJfM2E2NGI5YTIyZjU0NGUzYjhiOWU2OWJmMzZkNTFhZDQiLCJEU19UUkFOU19JRCI6IjhkMDUwN2QzLTY3OWMtNDBhNi04NmRiLTdkMDg5OTBmMDBhNSIsIkRBVEUiOiIyNC4wMi4yMDIyIiwiZGVsYXkiOiJOT05FIiwiVEhSRUVEU1NFUlZFUl9UUkFOU19JRCI6ImFlMzYxYmQ0LWZjMGItNDk2Ni1hZDRmLWEyMTQ2OTA0NDMxNiIsIkFNT1VOVCI6IjMuMDAgVVNEIiwiTk9USUZJQ0FUSU9OX1VSTCI6Imh0dHBzOi8vdGVzdC5wcGlwZS5uZXQvY29ubmVjdG9ycy9hcl9zaW11bGF0b3IvM2RzMjtqc2Vzc2lvbmlkPUIwMzQxOTgyNzI4RkY3MDM0MTZGRjZEMUY2NTM2RDNDLnVhdDAxLXZtLWNvbjAzP2FzeW5jc291cmNlPUFDSV8zRFNfMiZ0eXBlPW5vdGlmaWNhdGlvbiZuZGNpZD04YWM3YTRjODcyZGFlNTk2MDE3MmUwYmIwZWQyMTZlYl8zYTY0YjlhMjJmNTQ0ZTNiOGI5ZTY5YmYzNmQ1MWFkNCIsIlZFUlNJT04iOiIyLjIuMCIsIkFDU19UUkFOU19JRCI6IjY2MmUxZTBiLTMyNjMtNGZkYi05NDFkLWUwOTNlMTk2YzAyMCIsIkRFVklDRV9DSEFOTkVMIjoiMDIiLCJTRVJWSUNFX1RZUEUiOiJWZXJpZmllZEJ5VklTQSIsIkNBUkRfTlVNQkVSIjoiKioqKioqKioqKioqMDAxMCJ9',
'amount': '3',
'clientId': '2020083116203010128',
'code': '002000',
'connector': 'THREEDSECURE',
'currency': 'USD',
'description': 'Transaction processing',
'language': 'en',
'merchantTransactionId': 'PShop20220224213231PZ',
'paymentType': 'SALE',
'relateTransactionId': 'PS22022421323376578',
'requestMethod': 'POST',
'shopperResultUrl': 'https://test-pay.pingpongx.com/qa/result.html',
'sign': '5CCBBC38F3715EAA6175B18D39A1D1F9',
'signType': 'MD5',
'status': 'PROCESSING',
'termUrl': 'https://sandbox-acquirer-payment.pingpongx.com/Trustpay/threeDSecure/JJ3nGLGt0POPwIKaY2o4rbFcBJh1rJjRi6JNyqIdHfAkO4fAqbLsehEro9udjUCTFH-3Ja03glevv61coQUK9-jEHA6A53H8Y70jeJn-ZPy5f7hhNANPdPoYgVk696RsTNsjXbBoszJJhaFwog_fzUEFbpimveK6NOTEZyRRg6NveGE_UPaYfYFPTVbq44G-',
'threedDHighLevelParams': {
'creq': 'eyJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMi4wIiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiJhZTM2MWJkNC1mYzBiLTQ5NjYtYWQ0Zi1hMjE0NjkwNDQzMTYiLCJhY3NUcmFuc0lEIjoiNjYyZTFlMGItMzI2My00ZmRiLTk0MWQtZTA5M2UxOTZjMDIwIiwiY2hhbGxlbmdlV2luZG93U2l6ZSI6IjA1In0',
'threeDSSessionData': ''
},
'transactionId': 'PS22022421323376578',
'transactionTime': '1645709554000'
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 专用测试资源
# GET方式测试
参数名称 | 值 |
---|---|
邮箱 | 3dtest@pingpongx.com |
accId | 2021031111071710123362 |
clientId | 2021031111071710123 |
salt | 450E64BD1030F265A5A870D7 |
测试专用卡号 | 4711100000000000 |
测试金额 | 30 |
# POST方式测试
参数名称 | 值 |
---|---|
邮箱 | 3ds@pingpongx.com |
accId | 2020083116203010128130 |
clientId | 2020083116203010128 |
salt | F78BC96A55548B2319EE68E0 |
测试专用卡号 | 4000000000000010 |
threeDSecure | Y |
上次更新: 2022/04/14, 11:35:16