JS接入CKO iframe API

会议终结者
• 阅读 610

JS接入CKO iframe API

背景:为了符合PCI规范,获得PCI证书,需要将新支付系统信用卡由直连模式调整成iframe模式,不再接触卡信息,直接使用支付渠道的iframe收集卡信息完成支付。

一、页面里引入cko script
<script src="https://cdn.checkout.com/js/framesv2.min.js"></script>
二、根据自己的情况选择要引入的iframe类型
cko在占位的div中插入iframe

1、single iframe(one input field)

<div class="card-frame">
    <!-- form will be added here -->
</div>

JS接入CKO iframe API
2、multiple iframes(multiple input fields)

<div class="card-number-frame">
  <!-- card number will be added here -->
</div>
<div class="expiry-date-frame">
  <!-- expiry date will be added here -->
</div>
<div class="cvv-frame">
  <!-- cvv frame will be added here -->
</div>

JS接入CKO iframe API

三、初始化frames
要展示出输入框需要先用public API key初始化frames
Frames.init("pk_sbox_XXXX");
四、frame可选配置参数
Frames.init({
    publicKey: 'pk_sbox_6ff46046-30af-41d9-bf58-929022d2cd14',
    acceptedPaymentMethods: [ // 需要支持的卡种
        "Visa",
        "Mastercard",
        "American Express",
        "Diners Club",
        "Discover",
        "JCB",
        "Mada",
    ],
    // localization 可以配置为语言,也可以直接配置input的placeholder文案
    // localization: 'EN-GB', 
    localization: {
        cardNumberPlaceholder: '1234 1234 1234 1234',
        expiryMonthPlaceholder: 'MM',
        expiryYearPlaceholder: 'YY',
        cvvPlaceholder: 'CVC',
    },
    debug: true, // 是否显示console messages 
    style: { // 初始化iframe样式
        base: {
            color: '#333',
            fontSize: '14px',
            fontFamily: 'Avenir',
            fontWeight: '400',
            letterSpacing: 'normal',
        },
        autofill: {
            backgroundColor: '#fff',
        },
        hover: {
            color: '#333',
        },
        focus: {
            color: '#333',
        },
        valid: {
            color: '#333',
        },
        invalid: {
            color: '#333',
        },
        placeholder: {
            base: {
                color: '#999',
            }
        },
    },
    ready: function() {
        // Frames注册完成
    },
    frameActivated: function() {
        // 表单渲染完成
    },
    cardBinChanged: function(data) {
        // 修改前8位卡号时触发
        // 返回结果{"bin":"43234533","scheme":"Visa"}
    },
    cardSubmitted: function() {
        // 表单数据提交时触发
    },
    cardValidationChanged: function(data) {
        // 返回结果{"isValid":true,"isElementValid":{"cardNumber":true,"expiryDate":true,"cvv":true,"schemeChoice":true}}
        const valid = Frames.isCardValid(); // 获取卡信息校验结果的方法
        if (valid) {
            Frames.submitCard(); //校验通过,提交卡信息
        }
    },
    cardTokenized: function(data) {
        // Frames.submitCard触发后执行,data内有token等信息
        // 返回结果{"type":"card","token":"tok_kwsesf3cvofu3oh4zrbzpslkjq","expires_on":"2022-10-13T13:31:52Z","expiry_month":12,"expiry_year":2031,"scheme":"Visa","last4":"1111","bin":"411111","card_type":"Credit","issuer":"JPMORGAN CHASE BANK, N.A.","issuer_country":"US","preferred_scheme":""}
    },
    frameBlur: function(data) {
        // 输入框失去焦点事件
        // 返回结果{"element":"card-number"}
    },
    frameFocus: function(data) {
        // 输入框获得焦点事件
        // 返回结果{"element":"card-number"}
    },
    frameValidationChanged: function(data) {
        // 表单有修改时触发,用于更新前端错误信息
        // 返回结果{"element":"card-number","isValid":true,"isEmpty":false,"isFormValid":false,"isFormEmpty":false}
    },
    paymentMethodChanged: function(data) {
        // 修改卡号,当卡有效是触发,用于展示对应币种图片
        // 返回结果{"isValid":false,"paymentMethod":"Visa","isPaymentMethodAccepted":true}
    },
});
iframe样式配置参数:JS接入CKO iframe API
style配置后,会在iframe中生成对应的css。
五、另一种事件处理程序

除了上述通过configuration options进行事件处理之外,还可以采用绑定事件方式。

Frames.addEventHandler(Frames.Events.EVENT_NAME, handler); 
Frames.removeEventHandler(Frames.Events.EVENT_NAME, handler);
Frames.removeAllEventHandlers(Frames.Events.EVENT_NAME);

举个栗子:

<body>
  <!-- add frames script -->
  <script src="https://cdn.checkout.com/js/framesv2.min.js"></script>

  <form id="payment-form" method="POST" action="https://merchant.com/charge-card">
    <div class="card-frame">
      <!-- form will be added here -->
    </div>
    <!-- add submit button -->
    <button id="pay-button" disabled>
      PAY GBP 24.99
    </button>
  </form>

  <script>
    var payButton = document.getElementById("pay-button");
    var form = document.getElementById("payment-form");

    Frames.init("pk_sbox_6ff46046-30af-41d9-bf58-929022d2cd14");

    Frames.addEventHandler(
      Frames.Events.CARD_VALIDATION_CHANGED,
      function (event) {
        console.log("CARD_VALIDATION_CHANGED: %o", event);

        payButton.disabled = !Frames.isCardValid();
      }
    );

    form.addEventListener("submit", function (event) {
      event.preventDefault();
      Frames.submitCard()
        .then(function (data) {
          Frames.addCardToken(form, data.token);
          form.submit();
        })
        .catch(function (error) {
          // handle error
        });
    });
  </script>
</body>
参考:

JS frames
frames-react

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这