PBOC/EMV之電子現金應用

最近在做一個基於PBOC電子現金卡的終端應用, 項目還沒有完成, 但電子現金部分的處理模塊已完成,剩下的基本是UI和調試的事情了. 想把對PBOC電子現金理解整理成一篇文章.

    電子現金的概念是在PBOC規範的第十三部分<<基於借記/貸記應用的小額支付規範 >>裏提出的。可以這樣理解,電子現金是PBOC裏的一個應用,它基於借貸記. 這個應用被提出的目的就是實現我們經常聽說的一個功能, 小額支付功能.

    基於電子現金的卡目前來講,一般有如下幾個特點:

    1 是由銀行發行, 這個是必須的,否則就不會叫金融IC卡了.

    2 卡里只有一個應用,也就是一個AID,因爲目前國內推行PBOC的卡都是先從單應用開始做試點. 從卡片的角度來講,實現多應用不成問題,但是, 如果卡片支持多應用, 還需要終端(包括圈存終端和消費終端)以及銀行後臺的相應配合, 這部分的工程量就很大了, 所以暫時以單應用爲主.

    3 一般用這張卡做小額支付,並且非實名制,消費無需密碼,且是脫機消費.

    4 這種卡一般只在銀行內部或企業內部使用(企業內部也是與銀行合作), 目前很難推廣到一些大的公共事業中(比如交通), 因爲這些行業是國家建設部管的, 這裏面有很多非技術的原因導致銀行這種金融機構與建設部難以坐在一起協商.

    電子現金的應用, 主要做兩種類型的交易,一是圈存交易,一是消費交易. 我這裏以終端圈存交易爲例,簡單描述一下PBOC的交易流程.

    所謂電子現金圈存, 是指把用戶在銀行帳戶裏的錢轉到這張電子現金的卡上. 說白了就是從你的***上轉錢到電子現金的IC卡上. 由於目前還沒有實現PBOC卡的多應用,整個圈存過程實際上需要兩張卡,終端先讀取***信息(包括卡號,密碼以及充值金額等信息), 扣費成功後下一步纔是走PBOC交易流程,對電子現金卡寫卡. 而推廣PBOC的終極目標就是實現一卡多應用, 也就是說,未來的某個時候,就可以用一張卡完成圈存,只是不同的應用.

    我這裏簡單通俗的介紹一下電子現金充值PBOC的流程. 更詳細的內容可以直接看PBOC 2.0規範.

    前面說到,電子現金應用是基於借貸記的, 所以它兼容借貸記應用,可以說是精簡版的借貸記應用. 每一筆交易,所執行的PBOC流程就是簡化版的借貸記流程.

    第一步, 選擇應用, 所用命令是select, 傳的參數是 應用AID號. 這裏跟標準的PBOC交易流程並不一樣, 因爲標準流程裏面, 前面還有兩步, 就是讀取支付系統目錄, 建立應用列表.爲什麼可以省掉這兩步, 因爲前面說到,卡里一般只有一個應用AID,目前還沒有實現多應用, 這個AID號應該在卡片個人化時就已經固定好,只要你知道了該AID號,直接跳過前兩步選擇該應用可以了. 卡里只有一個應用,就無所謂應用列表了. 當然,一個好的程序設計建議還是走標準流程,這樣,以後卡片實現了多應用, 你的終端程序也可以通吃.

    應用選擇後,卡片返回一串信息, 這串信息裏面有個很重要的數據叫PDOL, 這是一個列表,卡片通過這個列表告訴終端,它需要哪些數據, 這些數據用來給卡片做應用初始化. 舉個列子,比如卡片可能會需要授權金額(就是圈存的金額), 貨幣代碼等數據. 終端程序解析PDOL,按照一定的規則拼接數據,進入第二步.

    第二步, 應用初始化. 命令是GPO, 參數就是前一步根據PDOL所組的數據包. 該步表示終端通知卡片交易開始了. 卡片會返回AIP和AFL兩個數據. AIP告訴終端卡片支持的功能, 比如卡片是否支持脫機數據認證, 是否支持髮卡行認證等. AFL是要告訴終端, 如果要完成這筆交易,你終端該從卡上讀什麼數據。AFL裏就包含了這些數據的位置和名稱. 舉個例子,這些數據可能有當前的交易序號,該張卡片的卡號(PBOC裏叫PAN,應用主帳號)等.

    第三步,讀數據. 命令是read record. 參數是前一步得到的終端所需卡片數據的位置和名稱. 終端要把AFL指定的所有數據讀出,並保存到終端供下面的流程所用. 每次讀到的數據是包含在卡片的返回信息中的, 終端解析返回信息,提取相關的數據.

    第四步, 產生應用密文. 命令是GAC. 參數是密文類型和產生密文所需的數據. 密文類型有三種,分別是交易證書(TC), 應用認證密文(AAC),授權請求密文(ARQC). 因爲這一步是爲下一步聯機處理做準備,所以終端應用請求卡片產生的密文類型應該是ARQC,查看卡片是否允許聯機處理. 卡片收到產生密文類型後,返回的信息有兩個重要的數據, 第一個就是密文類型,該數據指示卡片是否願意做聯機處理,如果願意,返回的是ARQC,與終端一致,否則返回AAC,表示拒絕聯機. 終端判斷卡片返回的是否是ARQC,如果是,終端要讀取卡片返回的另一個重要的數據,應用密文(AC), 該密文是卡片用存放在卡里的密鑰,對終端發過來的明文數據,用3DES算法生成的.

    第五步, 聯機驗證卡片. 這一步,卡片本身沒有操作. 終端把前一步得到的應用密文,產生應用密文的一些數據,還有其它的信息(比如交易日期,交易時間等),打包發送到髮卡行PBOC後臺, 通信方式一般是用TCP/IP。 後臺通過驗證ARQC密文來認證卡片, 如果認證成功會返回授權響應密文(ARPC), 這個ARPC是後臺通過3DES算法,對ARQC密文和二個字節的授權響應碼加密生成的.

    第六步,第五步的目的是髮卡行驗證卡片的合法的性,這一步是卡片驗證髮卡行是否是一個有效的髮卡行. 命令是External Authentication, 叫外部認證. 參數是上一步聯機處理響應的ARPC和授權響應碼. 卡片收到命令後,會用自己的密鑰,對ARQC和授權響應碼生成ARPC,然後與終端傳來的ARPC比較,兩都相同,就認爲此ARPC是來自一個有效的髮卡行後臺.

    第七步, 聯機圈存報文, 驗證了卡片和髮卡行的合法性之後,終端向髮卡行後臺請求圈存,上傳的數據包括充值金額,卡內原來的餘額等信息, 髮卡行後臺返回一個寫卡的腳本命令, 終端解析這個腳本,直接發給卡片即可. 到這裏,卡片充值成功.

    第八步,這一步要發送第二請求密文命令(GAC2), 它的作用說白了就是告訴卡片交易結束。與第四步的GAC1不同的是,GAC2的參數裏面多了授權響應碼,並且請求的密文類型是TC,也就是希望卡片接受交易。如果卡片返回的也是TC,表示接受交易.

    第九步, 讀交易日誌,在整個流程執行的過程中,卡片會以一定的格式讀錄當前這筆交易的信息,比如授權金額,卡號,交易時間,終端只需通過一個命令就可以把些信息讀出,然後提取出有用的信息,以便日後結算.

之前的一篇文章<PBOC/EMV之電子錢包與電子現金的區別>已經對電子現金做了一些介紹, 這篇文章站在開發者的角度,深入的探討一下電子現金的應用.

    做一個電子現金的交易, 第一步當然是選中當前的應用, 方法是調用select命令, 傳入當前的應用AID號, 如果卡片的狀態碼返回9000,則表示選中成功. 下面舉一個例子:

    發送: 00 a4 04 00 08 a0 00 00 04 44 01 01 05 00

    卡片返回:

    6f 45 84 08 a0 00 00 04 44 01 01 05 a5 39 50 0a 50 42 4f 43 20 44 45 42 49 54 87 01 01 9f 38 09 9f 7a 01 9f 02 06 5f 2a 02 5f 2d 02 7a 68 9f 11 01 01 9f 12 0a 50 42 4f 43 20 44 45 42 49 54 bf 0c 05 9f 4d 02 0b 0a 90 00

    先看發送的指令, 其中a0 00 00 04 44 01 01 05這八個字節就是當前應用的AID號. 卡片返回的最後兩個字節是90 00, 表示發送成功. 狀態碼之前是數據域. 數據域是一個TLV結構的FCI, 其中V裏面可能也會有TLV結構的數據, 所以,FCI可能是一個嵌套的TLV結構. 6f是整個數據域的tag, 它標識卡片響應的整個FCI. 45表示長度(十六進制),也就是它後面數據域部分的所有字節數.

    不分析所有的數據了, 只說一下里面比較重要的一個數據PDOL. PDOL表示卡片要求終端提供的數據,從而激活當前選擇的應用. 找到這一串數據;

    9f 38 09 9f 7a 01 9f 02 06 5f 2a 02

    9f38是PDOL的tag, 09表示長度. 9f 7a 01表示卡片要求終端提供tag爲9f7a的元素的值,長度是01, 9f 02 06表示卡片要求終端提供tag爲9f02的元素的值,長度是06,5f 2a 02表示卡片要求終端提供tag爲5f2a的元素的值,長度是02. 這三個tag的意義如下:

    9f7a:電子現金終端指示器

    9f02:授權金額

    5f2a:交易貨幣代碼

    對於基於電子現金的應用, 這三個元素是必不可少的, 或者說,卡片要求終端至少提供這三個元素的值.

    下一步就是終端需要把上面三個元素通過GPO命令傳送給卡片.

    後面兩個元素比較容易填, 授權金額就是你的實際交易金額,交易貨幣代碼固定爲0156, 那麼電子現金終端指示器的值是什麼呢?

    根據PBOC 2.0的規範, 只有滿足下面三個條件時,電子現金終端指示器的值才能爲1, 否則爲0. 這三個條件是:

    1 終端支持電子現金交易

    2 授權金額小於終端交易限額

    3 終端交易類型爲消費交易

    前面兩個條件好理解, 爲什麼會有第三個條件呢?

    如果卡片接收到的電子現金終端指示器的值是1, 它就認爲當前做的是一個電子現金的交易, 而不是普通的借貸記交易, 那麼它在GPO指令的響應中就會返回電子現金的AIP和AFL, 而不是普通借貸記的AIP和AFL, 兩者區別主要在AFL的不同. 如果卡片認爲當前是一個電子現金的交易, 它會返回給終端”電子現金髮卡行授權碼”, 而電子現金髮卡行授權碼是用於脫機交易中, 存放在清算報文的授權碼中. 而PBOC的消費交易是脫機交易, 這就是爲什麼會有第三個條件.

    另外,PBOC的圈存交易規定必須聯機處理,所以我們也可以得出, 對於基於電子現金的圈存交易,它從AFL人讀到的數據其實就是普通借貸記的數據,其交易流程也是借貸記的流程.

    下面是有一個電子現金的卡片做的一個測試,如果電子現金終端指示器的值爲0, 返回的AFL如下:

    08 01 02 00, 10 01 03 01, 18 01 02 00, 20 01 01 00

    當電子現金終端指示器的值爲1時, GPO命令返回下面六組AFL

    08 01 02 00, 10 05 06 01, 10 08 08 00, 18 01 02 00, 20 01 01 00, 28 01 01 00

    其中電子現金髮卡行授權碼就是文件標識符爲28 的文件中.  

    如果終端能收到卡片返回的AIP和AFL, 就可以根據卡片提供的AFL, 讀出卡片提供給終端的所有數據, 並保存在終端, 以備後續的交易使用. 這些數據就包括PAN號等在內的卡片數據, 舉個例子, 我用測試卡s讀到的髮卡行授權碼(tag=9f74)的值如下:45 43 43 30 30 31, 對應的ASCII字符就是ECC001.

發佈了2 篇原創文章 · 獲贊 68 · 訪問量 116萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章