Android實現類Apple Pay虛擬卡

2021-09-30 19:26:25 字數 4270 閱讀 2266

其中的技術涉及基於isodep、nfca技術的nfc開發,hostapduservice介面的呼叫,基於iso/iec、14443-4協議的應用層apdu的通訊,sm4加密演算法

本節內容,筆者將給大家分享hce(host-based card emulation)的開發。

關於 hce 的原理介紹,讀者需自行搜尋。本文主要講解開發流程,谷歌給出的api文件:api文件 。

首先,我們要 manifest 檔案中申明我們的虛擬卡服務

當然一些用到的系統許可權也需要加上

然後在 xml 檔案中實現 apduservice

接著實現 hostapduservice 介面

/**

* aid不對,會導致processcommandapdu方法不被呼叫,因為命令和aid對應不上,服務不做響應,

* aid應和指令配對使用。只要成功呼叫了select command指令,之後即可隨意互動。

*/public class myhostapduservice extends hostapduservice implements sharedpreferences.onsharedpreferencechangelistener

//修改姓名

else if (util.bytestohexstring(commandapdu).substring(2).startswith("fb"))

//修改刷卡記錄

else if (util.bytestohexstring(commandapdu).substring(2).startswith("fc")) else if (arrays.equals(commands.ppse_apdu_select, commandapdu)) else if (arrays.equals(commands.visa_msd_select, commandapdu)) else if (commands.isgpocommand(commandapdu)) else if (arrays.equals(commands.read_rec_command, commandapdu)) else if (arrays.equals(commands.number_send, commandapdu)) else

return responseapdu;

}@override

public void ondeactivated(int reason)

@override

public void onsharedpreferencechanged(sharedpreferences sharedpreferences, string key)

}public void oncreate()

}

其中用到的一些常量

public class constants
其中用到的一些命令

public class commands ;

public static final byte ppse_apdu_select_resp = ;

public static final byte visa_msd_select = ;

public static final byte visa_msd_select_response = ;

public static boolean isgpocommand(byte apdu)

public static final byte gpo_command =

(byte) 0x00, //

(byte) 0x00 // le

};public static final byte gpo_command_response = ;

public static final byte read_rec_command = ;

public static final pattern track_2_pattern = pattern.compile(".*;(\\d=\\d)\\?.*");

/** unlike the upper case commands above, the read rec response changes depending on the track 2

* portion of the user's magnetic stripe data.

*/public static byte readrecresponse = {};

/**** 對應constants.default_swipe_data

** "%b4046460664629718^000netspend^161012100000181000000?;

* 4046460664629718=16101210000018100000?";

** card number 12~19位 swipe data 7~128位(1610121:2023年10月,服務號121)

* response apdu: 70 15 57 13 4046460664629718 d 16101210000018100000 f 9000

*

*/

public static void configurereadrecresponse(string swipedata)

// each binary byte is represented by 2 4-bit hex characters

int track2equivbytelen = track2equivdata.length() / 2;

readrecresponse = new byte[6 + track2equivbytelen];

bytebuffer bb = bytebuffer.wrap(readrecresponse);

bb.put((byte) 0x70); // emv record template tag

bb.put((byte) (track2equivbytelen + 2)); // length with track 2 tag

bb.put((byte) 0x57); // track 2 equivalent data tag

bb.put((byte) track2equivbytelen); // track 2 data length

bb.put(util.hextobytearray(track2equivdata)); // track 2 equivalent data

bb.put((byte) 0x90); // sw1

bb.put((byte) 0x00); // sw2

} else

}/**

* 測試

*/public static final byte number_send = ;

public static final byte number_resp = ;

public static final byte iso7816_unknown_error_response = ;

//修改資料成功

public static final byte success = ;

}

為了優化體驗,提示使用者選擇 hce 為預設支付卡

cardemulation cardemulationmanager = cardemulation.getinstance(nfcadapter.getdefaultadapter(this));

if (!cardemulationmanager.isdefaultserviceforcategory(paymentservicecomponent, cardemulation.category_payment)) else

以上貼出了許多關鍵的原始碼和指令,如果讀者對 hce 原理並不掌握,對 iso/iec、14443-4 協議的應用層 apdu 的通訊並不熟悉,閱讀起來會十分枯燥困難,所以做新技術研發的過程中,非常考驗乙個開發者的耐心和能力(因為可參考的資料甚少,且所需要的新知識庫比較大)

PHP 實現 apple 蘋果快捷登入

實現原理 1 安裝外部庫php jwt,在專案的composer.json 同級目錄下執行 composer require firebase php jwt執行失敗的話可借鑑本文 2 蘋果驗證類 date 2019 9 11 use firebase jwt jwk use firebase jw...

ARKit奠定了Apple平台上實現AR的基石

arkit的核心是為一些基本的關鍵功能提供支援,包括運動跟蹤 水平面檢測,以及尺度和環境光 arkit api支援兩種主配置,即只追蹤裝置定位的arsessionconfiguration,以及進一步追蹤裝置位置並檢測真實世界表面的arsessionconfiguration。所有被檢測到的表面都會...

ARKit奠定了Apple平台上實現AR的基石

arkit的核心是為一些基本的關鍵功能提供支援,包括運動跟蹤 水平面檢測,以及尺度和環境光 arkit api支援兩種主配置,即只追蹤裝置定位的arsessionconfiguration,以及進一步追蹤裝置位置並檢測真實世界表面的arsessionconfiguration。所有被檢測到的表面都會...