Vous êtes sur la page 1sur 30

EMV

Interface Description

1
版本修订历史记录:

版本号 作者 参与者 发布日期 Remarks


V1.0 罗成 2018-4-13 初始版本

2
目录
1. EMV transaction flow chart ...................................................................................................... 4
2. EMV Class ................................................................................................................................ 5
2.1. Get the EMV kernel version number ........................................................................ 5
2.2. Delete all AIDs .......................................................................................................... 5
2.3. Delete all CAPKs ...................................................................................................... 5
2.4. Get the total number of AIDs .................................................................................... 6
2.5. Get the total number of Capks................................................................................... 6
2.6. Get an AID based on the index number .................................................................... 7
2.7. Get an Capk based on the index number ......................................................... 7
2.8. Append an AID ......................................................................................................... 7
2.9. Append an AID ......................................................................................................... 8
2.10. Append an Capk ........................................................................................................ 8
2.11. Append an Capk ........................................................................................................ 9
2.12. Get the value of the tag from the kernel ................................................. 10
2.13. Set the value of the tag to the kernel ..................................................... 10
2.14. Get the value of the tag from the kernel and package the data in TLV format. ....... 11
2.15. Packing data in TLV format according to tag and value ......................................... 11
2.16. Pack TLV list data ................................................................................................... 12
2.17. Find the value of the specified TAG based on the TLV list data ............................. 12
2.18. EMV kernel initialization ........................................................................................ 13
2.19. Contactless transaction preprocessing ..................................................................... 13
2.20. Perform EMV transactions (including contactless transactions)............................. 13
2.21. Balance inquiry ....................................................................................................... 14
2.22. Read transaction log ................................................................................................ 15
2.23. Get track 2 equivalent data and Application primary account number(PAN) ......... 16
2.24. Get CVM type (contactless) .................................................................................... 17
2.25. Setting PIN BLOCK to the kernel........................................................................... 17
2.26. Parsing online response data ................................................................................... 18
3. OnEmvListener Callback class ............................................................................................... 20
3.1. Sending and receiving APDU callback ................................................................... 20
3.2. Select application callback ...................................................................................... 20
3.3. Confirm PAN callback ............................................................................................ 21
3.4. Enter PIN callback .................................................................................................. 22
3.5. Cardholder ID verification callback ........................................................................ 23
3.6. Online processing callback ..................................................................................... 24
4. Annex ...................................................................................................................................... 26
4.1. Terminal parameter class ......................................................................................... 26
4.1. Transaction parameter class .................................................................................... 27
4.2. AID parameter class ................................................................................................ 27
4.3. CAPK parameter class ............................................................................................ 28
4.4. Transaction log class ............................................................................................... 28
4.5. EMV Result Class ................................................................................................... 29

3
1. EMV transaction flow chart

Start

初始设置

Kernel initialization and setting terminal


parameters, start application settings once,
or set when terminal parameters change
kernelInit()

交易处理 Perform EMV transaction callback


Select an app callback (executed when
searchCard() there are multiple apps)
onSelApp()

Confirm PAN callback (execute when


Find IC (reset icCardReset()) confirming PAN)
Or find a contactless card (reset rfReset()) onConfirmCardNo()

Enter the PIN callback (executed when you need


to enter the online offline PIN, callback before
Execute transaction
the connection is online)
emvTrans()
onInputPIN()

Cardholder ID verification callback


(requires callback when cardholder
End of transaction (transaction approval, verification)
transaction declined processing) onCertVerify()

Callback processing online (callback when the


first GAC returns online, callback when the
Power off transaction result is online)
closeCard() onlineProc()

End

4
2. EMV Class
Get the object of the EMV class:
EmvHandler emvHandler = EmvHandler.getInstance();

2.1. Get the EMV kernel version number

Method public String getKernelVersion()

Description Get the EMV kernel version number


Input

Output
Return EMV kernel version number

Stuct
Remarks

2.2. Delete all AIDs

Method public void delAllApp()

Description Delete all AIDs


Input

Output
Return
Stuct
Remarks

Example

2.3. Delete all CAPKs

Method public void delAllCapk()

5
Description Delete all CAPKs
Input

Output
Return

Stuct
Remarks
Example

2.4. Get the total number of AIDs

Method public int getAppNum()

Description Get the total number of AIDs


Input
Output
Return total number of AIDs

Stuct
Remarks

Example

2.5. Get the total number of Capks

Method public int getAppCapk()

Description Get the total number of Capks


Input
Output
Return total number of Capks

Stuct

Remarks

6
Example

2.6. Get an AID based on the index number

Method public byte[] getApp(int index)

Description Get an AID based on the index number


Input index Index (starting at 0)

Output
Return A string of AID data in TLV format
=null, get error
Stuct
Remarks

2.7. Get an Capk based on the index number

Method public byte[] getCapk(int index)

Description Get an AID based on the index number


Input index Index (starting at 0)

Output
Return A string of Capk data in TLV format
=null, get error
Stuct
Example

2.8. Append an AID

Method public int addApp(byte[] aid)

Description Append an AID


Input aid Example:
emvHandler.addApp(emvHandler .hex
StringToBytes("9F0607A00000000430
60DF0101009F08020002DF1105FC50
58A000DF1205F85058F800DF13050

7
4000000009F1B0400000000DF15040
0000000DF160199DF170199DF14039
F3704DF180101DF200600099999999
9"));
Output
Return

Stuct
Remarks

2.9. Append an AID

Method public int addApp(EmvApp emvApp)

Description Append an AID


Input emvApp EmvApp Object

Output
Return

Stuct
Remarks

2.10. Append an Capk

Method public int addCapk(byte[] capk)

Description Append an Capk


Input capk Example:
emvHandler.addApp(emvHandler .

hexStringToBytes

("9F0605A0000000659F220109DF05

083230303931323331DF060101DF07

8
0101DF028180B72A8FEF5B27F2B55

0398FDCC256F714BAD497FF56094

B7408328CB626AA6F0E6A9DF8388

EB9887BC930170BCC1213E90FC07

0D52C8DCD0FF9E10FAD36801FE93

FC998A721705091F18BC7C98241C

ADC15A2B9DA7FB963142C0AB640

D5D0135E77EBAE95AF1B4FEFAD

CF9C012366BDDA0455C1564A6881

0D7127676D493890BDDF040103DF

03144410C6D51C2F83ADFD92528F

A6E38A32DF048D0A")

Output
Return

Stuct
Remarks
Example

2.11. Append an Capk

Method public int addCapk(EmvCapk emvCapk)

Description Append an Capk

Input emvCapk Capk object

Output
Return

Stuct

9
Remarks
Example

2.12. Get the value of the tag from the kernel

Method public byte[] getTlvData(int tag)

Description Get the value of the tag from the kernel

Input tag tag, Common EMV transaction tags:

0x95 TVR

0x9B TSI

0x9F34 CVM Results

0xDF31 Issuer Script Result

0x57 Track 2 Equivalent Data

0x5F34 PAN Sequence Number

0x5A PAN

0x5F24 Application Expiration Data

0x8A Authorisation Response Code

Output
Return Get the value of the tag

=null, get error

Stuct
Remarks
Example

2.13. Set the value of the tag to the kernel

Method public int setTlvData(int tag,byte[] value)

Description Set the value of the tag to the kernel


Input tag tag

10
value value

Output
Return The value of the EmvResult object

Stuct
Remarks
Example

2.14. Get the value of the tag from the kernel


and package the data in TLV format.

Method public byte[] packageTlvFormKernel(int tag)

Description Get the value of the tag from the kernel and package the data in TLV format.
Input tag tag

Output

Return TLV format data

=null, get error

Stuct
Remarks
Example

2.15. Packing data in TLV format according to


tag and value

Method public byte[] packageTlv(int tag,byte[] value)

Description Packing data in TLV format according to tag and value


Input tag tag

value value

Output TLV format data

Return

11
Stuct
Remarks

Example

2.16. Pack TLV list data

Method public byte[] packageTlvList(int[] tags)

Description Pack TLV list data, such as 55 domain data, according to the tag array
Input tags Tag array

Output
Return TLV list data, such as 55 domain data

Stuct

Remarks
Example

2.17. Find the value of the specified TAG based


on the TLV list data

Method public byte[] findTagValue(byte[] tlvList,int findTag)

Description Find the value of the specified TAG based on the TLV list data
TLV list data, such as 55 domain return
tlvList
Input data
findTag tag

Output
Tag value,
Return
=null, not found or parsed error

Stuct
Remarks
Example

12
2.18. EMV kernel initialization

Method public void kernelInit(EmvTermParam emvTermparam)

Description EMV kernel initialization


Input emvTermparam Terminal parameter

Output
Return
Stuct
Remarks

2.19. Contactless transaction preprocessing

Method public int qTransProProc(byte[] amountAuth)

Description Contactless transaction pre-processing, executed after inputting the amount


(executed only in the fast payment interface)

Input amountAuth Amount of the transaction

Output
Return The value of the EmvResult object

Stuct
Remarks

Example

2.20. Perform EMV transactions (including


contactless transactions)

public int emvTrans(EmvTransParam


Method emvTransParam,OnEmvListener emvListener,byte[] isEcTrans,
byte[] balance, byte[] transResult)

Description Perform EMV transactions (including contactless transactions)


Input emvTransParam Transaction parameters

13
emvListener EMV callback class
When isEcTrans[0]=0x01, it is an
electronic cash transaction (including
contact and contactless)
isEcTrans
When isEcTrans[0]=0x00, it is an Emv
transaction (including contact and
contactless)
Balance, BCD code, 6 bytes, when

balance balance[0] = 0x01, no balance is


Output
obtained
The result of the transaction, returned
in transResult[0], is the value of the
EmvData object
transResult Public static final byte APPROVE_M
= 0x40; //Approve
Public static final byte DECLINE_M
= 0x00; //Declined
Return The value of the EmvResult object

Stuct
Remarks
Example

2.21. Balance inquiry

Method public int balanceQuery(int transKernalType,OnEmvListener


emvListener,byte[] balance)

Description Balance inquiry,Contact and contactless electronic cash

Input transKernalType The transaction kernel type, the

following values for the EmvData

object:

Public static final byte

KERNAL_EMV_PBOC = 0; //Contact

EMV&PBOC

14
Public static final byte

KERNAL_CONTACTLESS_ENTRY_

POINT = 1; //contactless to the unified

entry

emvListener Emv callback class

Output balance Balance, BCD code, 6 bytes, when

balance[0] = 0x01, no balance is

obtained

Return The value of the EmvResult object

Stuct
Remarks
Example

2.22. Read transaction log

Method public int readTransLog(int transKernalType,OnEmvListener


emvListener,byte[] transLogNum,EmvTransLog[] emvTransLog)

Description Read transaction log,Emv and contactless


Input transKernalType The transaction kernel type, the

following values for the EmvData

object:

Public static final byte

KERNAL_EMV_PBOC = 0; //Contact

EMV&PBOC

Public static final byte

KERNAL_CONTACTLESS_ENTRY_

POINT = 1; //contactless to the unified

entry

emvListener Emv callback class

Output transLogNum The number of transaction logs,


15
returned in transLogNum[0]

emvTransLog An array of transaction log objects.

The size of the array is preferably 10

when defined.

Return The value of the EmvResult object

Stuct
Remarks
Example

2.23. Get track 2 equivalent data and


Application primary account number(PAN)

Method public int getTrack2AndPAN(String[] track2,String[] pan)

Description Get track 2 equivalent data and Application primary account number(PAN)
EMV/PBOC transactions are obtained (confirmed PAN and later process)

Contactless transaction is obtained when the offline execution is completed or

returned to the online input PIN.

Input
Output track2 Track 2 data, the data is returned in

track2[0]

pan PAN, data is returned in pan[0]

Return The value of the EmvResult object

Stuct
Remarks
Example

16
2.24. Get CVM type (contactless)

Method public byte getCvmType()

Description Get the CVM type for the contactless transaction result to be online, get the
execution type of CVM

Input
Output
Return the following values for the EmvData

object:

public static final byte


RD_CVM_NO = 0x00;
//NO CVM
public static final byte
RD_CVM_ONLINE_PIN =
(byte)0x80; //ONLINE
PIN
public static final byte
RD_CVM_SIG = 0x40;
//SIGNATURE
Stuct
Remarks

Example

2.25. Setting PIN BLOCK to the kernel

Method public void setPinBlock(byte[] pinBlock)

Description Setting PIN BLOCK to the kernel


Input pinBlock 8 bytes PIN BLOCK

Output
17
Return
Stuct
Remarks

Example

2.26. Parsing online response data

public int separateOnlineResp(byte[] authRespCode,byte[]


Method
issuerResp,int issuerRespLen)
Description Parsing online response data
39 domain response code (if the

authorization code is {0x30, 0x30},

authRespCode please set authRespCode={0x30, 0x30,

Input 0x00}; if there is no response code,

please set authRespCode= {0x00})

issuerResp Issuer response data, 55 domain

issuerRespLen Issuer response data length

Output
The following values for the
EmvResult object:
Public static final int EMV_OK = 0;
//OK
Public static final int
EMV_ONLINE_FAILED = -20;
Return //Unsuccessful online connection failed
Public static final int
EMV_ONLINE_NORESP_MAC_OR
_RECV_ERR = -38; // Online
unsuccessful, no response online or
return MAC error or receive data error,
correct
Stuct
Remarks

18
Example

19
3. OnEmvListener Callback class
Get the object of the OnEmvListener class:
OnEmvListener onEmvListener = new OnEmvListener() {
//……
}

3.1. Sending and receiving APDU callback

Method byte[] onExchangeApdu(byte[] send);

Description Sending and receiving APDU


This method is called back only when the EMV terminal parameter and

the kernel initialize kernelInit(), setting

EmvTermParam.useCallbackApdu to 0x01 (using the callback function

to send and receive APDUs).

Input send APDU command sent

Output
Return The APDU data of the response,

Return null if communication error or

no response or response timeout

Stuct
Remarks

3.2. Select application callback

Method int onSelApp(String[] appLabelList);

Description Select the app list,


EMV/PBOC transactions, which are executed when there are multiple

applications;

20
Contactlss do not execute this callback

Input appLabelList Application Label array

Output

Return Public static final int EMV_OK = 0;

//OK

Public static final int

EMV_USER_CANCEL = -7;

//transaction cancellation

Public static final int

EMV_TIME_OUT = -8; //user

operation timed out

Stuct
Remarks

3.3. Confirm PAN callback

Method int onConfirmCardNo(String cardNo);

Description Confirm the PAN,


EMV/PBOC transaction, callback when the card number is obtained when the

application record is completed;

Contactless do not execute this callback

Input cardNo PAN

Output

Return Public static final int EMV_OK = 0;

//OK

Public static final int

EMV_USER_CANCEL = -7;

//transaction cancellation

Public static final int

EMV_TIME_OUT = -8; //user


21
operation timed out

Stuct
Remarks

3.4. Enter PIN callback

Method int onInputPIN(byte pinType);

Description Enter the PIN ,


Need to adjust the input online PIN, call setPinBlock () method to set the PIN

BLOCK to the kernel;

If it is contactless transaction, if you want to enter a PIN, you need to call

getTrack2AndPAN() to get PAN;

If it is a contactless transaction, you need to call getCvmType() to get the

cardholder authentication type as online PIN (EmvData.

RD_CVM_ONLINE_PIN) to execute the input online PIN. If you want to force the

online PIN, you do not need to judge this.

Input pinType PIN type:

The following values for the EmvData

object:
public static final byte
ONLINE_ENCIPHERED_PIN =
0x00;
public static final byte
OFFLINE_PLAINTEXT_PIN =
0x01;
public static final byte

OFFLINE_ENCIPHERED_PIN =

0x02;

Output
Return The following values for the The

22
following values for the EmvResult

object:

Public static final int EMV_OK = 0;

//OK

Public static final int

EMV_USER_CANCEL = -7;

//transaction cancellation

Public static final int

EMV_TIME_OUT = -8; //user

operation timed out

Public static final int

EMV_NO_PASSWORD = -32; //No

password or no password

Stuct
Remarks

3.5. Cardholder ID verification callback

Method int onCertVerify(int certType,String certNo);

Description Cardholder ID verification ,


EMV/PBOC transactions, verifying callbacks when cardholder credentials need to

be executed;

Contactless do not execute this callback

Input certType ID type (0~5), corresponding to the

following values

0x00: ID card

0x01: Military officer card

0x02: Passport

0x03: Entry permit

0x04: Temporary ID card

23
0x05: Other

certNo Certificate number

Output

Return The following values for the

EmvResult object:

Public static final int EMV_OK = 0;

//OK

Public static final int

EMV_USER_CANCEL = -7;

//transaction cancellation

Public static final int

EMV_TIME_OUT = -8; //user

operation timed out

Stuct
Remarks

3.6. Online processing callback

Method int onlineProc();

Description Online processing,


When returning the issuer data online, you need to call the separateOnlineResp()

method to update the issuer data to the kernel for processing.

If the connection is successful, the issuing bank authorization response code [8A]

returns the rejection, please return to EMV_ONLINE_RESP_AAC;

Input
Output

Return The following values for the

EmvResult object:

Public static final int EMV_OK =

0; //OK

24
Public static final int

EMV_ONLINE_FAILED = -20;

//Unsuccessful online

connection failed

Public static final int

EMV_ONLINE_NORESP_MAC_OR_RECV_

ERR = -38; // Online

unsuccessful, no response

online or return MAC error or

receive data error, correct

Public static final int

EMV_ONLINE_RESP_AAC = -40;

//Online success, online

authorization response code

returns rejection

Stuct
Remarks

25
4. Annex

4.1. Terminal parameter class

public class EmvTermParam


{
public static String ifd = "12345678"; //9F1E
public static String terminalCountry = "0156"; //9F1A
public static byte termType = 0x22; //9F35
public static String termCapa = "E0E9C8"; //9F33 PBOC:"E0E9C8" EMV:"E0F8C8"
public static String addTermCapa = "6000F0A001"; //9F40
public static String merchantNameLocation = "SZZCS"; //9F4E max:40byte
public static String merchantCode = "3031"; //9F15
public static String merchantID = "123456789012345"; //9F16 max:15byte
public static String acquirerID = "1234567890"; //9F01
public static String termID = "12345678"; //9F1C max:8byte
public static byte tranRefCurrExp = 0x02;; //9F3D =
public static String tranRefCurr = "0156"; //9F3C
public static byte tranCurrExp = 0x02; //5F36
public static String tranCurrCode = "0156"; //5F2A
public static byte hostType = 0x00;
public static byte termSMSupportIndicator = 0x00;
public static byte termFLmtFlg = 0x01; //Terminal Floor Limit flag 9F1B
(qPBOC is generally 1) =0 no check, =1 check
public static byte rfTxnLmtFlg = 0x01; //Reader Contactless Transaction
Limit flag DF20(qPBOC is generally 1) =0 no check, =1 check
public static byte rfFLmtFlg = 0x01; //Reader Contactless Floor Limit flag
DF19(qPBOC is generally 1) =0 no check, =1 check
public static byte rfCVMLmtFlg = 0x01; //Reader CVM Required Limit flag
DF21(qPBOC is generally 1) =0 no check, =1 check
public static byte rfStatusCheckFlg = 0x00; //Status Check Support
flag(qPBOC is generally 0) =1 If the authorized amount is 1, then 9F66 requires
online ciphertext
public static byte rfZeroAmtNoAllowed = 0x01; //Zero Amount Allowed
flag(qPBOC is generally 0) =0 no check, 1 check if the authorized amount is 0,
then 9F66 requires online ciphertext
public static byte printfDebugInfo = 0x01; //show debug =0x0 do
not show =0x01 show
public static byte useFangba = 0x00; //
public static byte emvTest = 0x00; //function
=0x00unionPay, =0x01EMV, =0x02PBOC, =0x03qPBOC,
26
=0x04qUICS,=0x05PayWare,=0x06PayPass
public static byte useCallBackApdu = 0x00; //Callback APDU =0Not
enabled =1enabled
public static String emvParamFilePath =
Environment.getExternalStorageDirectory().getPath()+"/emv/";//EMV parameter
file path
}

4.1. Transaction parameter class

public class EmvTransParam {


private byte transKernalType = 0x00; // kernel type(=0 EMV/PBOC, =1
contactless)
private byte terminalSupportIndicator = 0x00;
private byte isForceOnline = 0x00; // Whether to force
online, =1 yes =0 no
private byte isSimpleFlow = 0x00; // For EMV/PBOC, =0
complete process, =1 simple process (only go to read record)
private String readerTTQ = "26000080"; //9F66
private String transNo = "00000001"; //9F41
private String transDate = DateToStr(new Date(), "yyMMdd"); //9A YYMMDD
private String transTime = DateToStr(new Date(), "HHmmss"); //9F21
private String amountAuth = "000000000001"; //9F02
private String amountOther = "000000000000"; //9F03
private byte transType; //9C
}

4.2. AID parameter class

public class EmvApp {


private String aid; //9F06 HEX string
private byte selFlag; //DF01 (=0 partial match, =1 exact match)
private byte targetPer; //DF17
private byte maxTargetPer; //DF16
private int floorLimit; //9F1B HEX
private byte onLinePINFlag; //DF18 (=0 not supported, =1 support)
private int threshold; //DF15
private String tacDefault; //DF11 HEX string
private String tacDenial; //DF13 HEX string
private String tacOnline; //DF12 HEX string
private String dDOL; //DF14 HEX string
private String tDOL; //97 HEX string

27
private String version; //9F09 HEX string
private String clTransLimit; //DF20 HEX string(6byte)
private String clOfflineLimit;//DF19 HEX string(6byte)
private String clCVMLimit; //DF21 HEX string(6byte)
private String ecTTLVal; //9F7B HEX string(6byte)
}

4.3. CAPK parameter class

public class EmvCapk {


private String rid; //9F06
private byte keyID; //9F22
private byte hashIndicator; //DF06
private byte capkIndicator; //DF07
private String modul; //DF02 HEX String
private String exponent; //DF04 HEX String
private String expDate; //DF05 HEX String(yyyymmdd)
private String checkSum; //DF03 HEX String sha1
}

4.4. Transaction log class

public class EmvTransLog {


private String cardAMT;//0x9F02 HEX string(6byte)
private String otherAMT;// 0x9F03 HEX string(6byte)
private String cardATC;// 9F36 HEX string
private byte transType;// 9C
private String termCountry;// 9F1A HEX string
private String transCurrency;// 5F2A HEX string
private String transDate;// 9A HEX string(YYMMDD)
private String transTime;// 9F21 HEX string(HHMMSS)
private String merchantName;// 9F4E HEX String format.
}

28
4.5. EMV Result Class

package com.zcs.sdk.emv;

public class EmvResult {


public static final int EMV_OK = 0;
public static final int ICC_CMD_ERR = -1;
public static final int EMV_PARAM_ERR = -2;
public static final int ICC_BLOCK = -3;
public static final int ICC_RSP_ERR = -4;
public static final int EMV_APP_BLOCK = -5;
public static final int EMV_NO_APP = -6;
public static final int EMV_USER_CANCEL = -7;
public static final int EMV_TIME_OUT = -8;
public static final int EMV_DATA_ERR = -9;
public static final int EMV_NOT_ACCEPT = -10;
public static final int EMV_KEY_EXP = -12;
public static final int EMV_DATETIME_ERR = -13;
public static final int EMV_FILE_ERR = -14;
public static final int EMV_SUM_ERR = -15;
public static final int EMV_NOT_FOUND = -16;
public static final int EMV_DATA_AUTH_FAIL = -17;
public static final int EMV_NOT_MATCH = -18;
public static final int EMV_NO_TRANS_LOG = -19;
public static final int EMV_ONLINE_FAILED = -20;
public static final int EMV_NOT_ORG_ICC = -21;
public static final int ICC_RSP_6985 = -22;
public static final int EMV_EXCP_FILE = -23;
public static final int EMV_USE_CONTACT = -24;
public static final int EMV_CARD_EXPIRED = -25;
public static final int EMV_TERMINATE = -26;
public static final int EMV_BALANCE_ERR = -27;
public static final int EMV_NOT_PAY = -28;
public static final int EMV_ALREADY_PAY = -29;
public static final int EMV_BALANCE_NOT_ENOUGH = -30;
public static final int EMV_DECLINE = -31;
public static final int EMV_NO_PASSWORD = -32;
public static final int EMV_FANGBA = -33;
public static final int EMV_NO_PINPAD_OR_ERR = -34;
public static final int EMV_NOT_QPBOC = -35;

29
public static final int EMV_NOT_SUPPORT = -36;
public static final int ICC_RSP_6986 = -37;
public static final int EMV_ONLINE_NORESP_MAC_OR_RECV_ERR = -38;
public static final int EMV_NO_ONLINE = -39;
public static final int EMV_ONLINE_RESP_AAC = -40;
public static final int EMV_PARSING_ERROR = -73;
}

30

Vous aimerez peut-être aussi