$30 off During Our Annual Pro Sale. View Details »

Developing Apple Pay In-App Provisioning in merpay

kenmaz
March 27, 2019

Developing Apple Pay In-App Provisioning in merpay

Presentation slide for "merpay Tech Talk for iOS/Android Engineer" event.
https://mercari.connpass.com/event/124161/

kenmaz

March 27, 2019
Tweet

More Decks by kenmaz

Other Decks in Technology

Transcript

  1. Developing
    Apple Pay In-App Provisioning
    in merpay
    Kentaro Matsumae (@kenmaz)

    merpay
    #merpay_techtalk
    merpay Tech Talk for iOS/Android Engineer, Mar 27th

    View Slide

  2. "HFOEB
    w "QQMF1BZ
    w "QQMF1BZ*O"QQ1SPWJTJPOJOH
    w .FSDBSJBSDIJUFDUVSFPWFSWJFX
    w %FWFMPQJOHXJUITBOECPYBQQ

    View Slide

  3. View Slide

  4. "QQMF1BZ

    View Slide

  5. $SFEJU$BSE .BHOFUJDTUSJQF

    w .BHOFUJDTUSJQF
    w 4JHO
    1IPUPTCZ೔ຊΫϨδοτڠձIUUQTXXXKDSFEJUPSKQTFDVSJUZJDIUNM

    View Slide

  6. $SFEJU$BSE *$

    w *$DIJQSFBEFS
    w EJHJUT1*/OVNCFS
    1IPUPTCZ೔ຊΫϨδοτڠձIUUQTXXXKDSFEJUPSKQTFDVSJUZJDIUNM

    View Slide

  7. "QQMF1BZ
    w "EE1MBTUJD$SFEJU$BSET
    JOUP8BMMFUBQQ
    w 4FDVSF&MFNFOU
    w 'BDF*%1BTTDPEF
    BVUIFOUJDBUJPO
    w /'$DPOUBDUMFTTQBZNFOU

    View Slide

  8. "QQMF1BZ3FHJTUSBUJPO'MPX
    J04%FWJDF "QQMF
    1BZNFOU
    /FUXPSL
    w $BSEIPMEFSOBNF
    w $BSE/VNCFS '1"/

    w 4FDVSJUZ$PEF
    5PLFO %1"/

    4FDVSF
    &MFNFOU
    '1"/TV⒏Y

    IUUQTTVQQPSUBQQMFDPNKBKQ)5
    '1"/ˠ%1"/

    View Slide

  9. "QQMF1BZ1BZNFOU'MPX
    J04%FWJDF
    /'$$BSE
    3FBEFS
    1BZNFOU
    /FUXPSL
    "VUI


    %1"/
    4FDVSF
    &MFNFOU
    %1"/ˠ'1"/

    *TTVFS

    View Slide

  10. w '1"/ 'VOEJOH1SJNBSZ"DDPVOU/VNCFS

    w %1"/ %FWJDF1SJNBSZ"DDPVOU/VNCFS

    w 1BZNFOUQSPDFTTVTFTFODSZQUFE%1"/POMZ OPU'1"/
    w &ODSZQUFEBOETUPSFEJO4FDVSF&MFNFOU
    w %1"/DIBOHFTFWFSZUJNFZPVSFHJTUFS
    w l5PLFOJ[BUJPOzl5PLFO1BZNFOUz
    '1"/%1"/

    View Slide

  11. %1"/ TV⒏Y

    '1"/ TV⒏Y

    &YQFSJNFOU3FTFUUJOH"QQMF1BZ

    View Slide

  12. View Slide

  13. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    'SPNJTTVJOHWJSUVBMDBSEUPBEEJOHJUJOUP"QQMF8BMMFU
    "MMQSPDFTTBSFEPOFJO"QQ

    View Slide

  14. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    *TTVFS
    "QQMF

    View Slide

  15. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    *TTVFS
    "QQMF
    *TTVFSFRVFTUGPSBWJSUVBM
    QSFQBJEDBSE

    View Slide

  16. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    *TTVFS
    "QQMF
    *TTVFBWJSUVBMQSFQBJEDBSE
    '1"/
    %1"/

    View Slide

  17. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    *TTVFS
    "QQMF
    3FRVFTUUPSFHJTUFSDBSEUISPVHI1BTT,JU"1*
    PassKit
    - PKAddPaymentPassViewController
    - PKPassLibrary
    %1"/

    View Slide

  18. "QQMF1BZ*O"QQ1SPWJTJPOJOH
    *TTVFS
    "QQMF
    3FHJTUFSDBSEJOUP8BMMFUBQQ
    4FDVSF
    &MFNFOU

    View Slide

  19. %1"/
    "QQMF1BZ1BZNFOU'MPX
    J04%FWJDF
    /'$$BSE
    3FBEFS
    1BZNFOU
    /FUXPSL
    4FDVSF
    &MFNFOU
    %1"/ˠ'1"/
    "VUI


    NFSQBZ

    View Slide

  20. %1"/ TV⒏Y

    '1"/ TV⒏Y

    &YQFSJNFOU3FTFUUJOH"QQMF1BZ
    "
    HBJO

    View Slide

  21. 1,"EE1BZNFOU1BTT7JFX$POUSPMMFS
    open class PKAddPaymentPassViewController : UIViewController {
    public init?(
    requestConfiguration configuration: PKAddPaymentPassRequestConfiguration,
    delegate: PKAddPaymentPassViewControllerDelegate?)
    }
    public protocol PKAddPaymentPassViewControllerDelegate : NSObjectProtocol {
    public func addPaymentPassViewController(_ controller: PKAddPaymentPassViewController,
    generateRequestWithCertificateChain certificates: [Data],
    nonce: Data, nonceSignature: Data,
    completionHandler handler: @escaping (PKAddPaymentPassRequest) -> Void)
    public func addPaymentPassViewController(_ controller: PKAddPaymentPassViewController,
    didFinishAdding pass: PKPaymentPass?,
    error: Error?)
    }

    View Slide

  22. 1,1BZNFOU1BTT1,1BTT-JCSBSZ
    open class PKPaymentPass : PKPass {
    open var primaryAccountIdentifier: String { get }
    open var primaryAccountNumberSuffix: String { get }
    weak open var deviceAccountIdentifier: NSString? { get }
    weak open var deviceAccountNumberSuffix: NSString? { get }
    }
    open class PKPassLibrary : NSObject {
    open func passes() -> [PKPass]
    open func remotePaymentPasses() -> [PKPaymentPass]
    open func present(_ pass: PKPaymentPass)
    open func canAddPaymentPass(withPrimaryAccountIdentifier primaryAccountIdentifier: String) -> Bool
    open func canAddFelicaPass() -> Bool
    }

    View Slide

  23. .FSDBSJ
    "SDIJUFDUVSF0WFSWJFX

    View Slide

  24. GSBNFXPSLT
    'SBNFXPSLT

    View Slide

  25. w .FSDBSJ&OUJUZ
    w .FSDBSJ,JU
    w ʜ
    'SBNFXPSLT

    View Slide

  26. NFSQBZGSBNFXPSL

    View Slide

  27. 4BOECPY"QQT
    4BOECPY"QQ

    View Slide

  28. 4FFNPSF
    w .FSDBSJ5FDI$POG
    w IUUQTUFDIDPOGNFSDBSJDPNTFTTJPO
    w J04%$+BQBO
    w IUUQTGPSUFFKQJPTEDKBQBOQSPQPTBMFGDE
    EEDBFEFECBB

    View Slide

  29. %FWFMPQJOH
    "QQMF1BZ*O"QQ1SPWJTJPOJOH
    8JUI4BOECPY"QQ

    View Slide

  30. View Slide

  31. 130#-&.
    w .645UPJOTUBMMUIFBQQWJB5FTU'MJHIUGPS
    EFCVHHJOH
    w &WFSZUJNFZPVEFCVH ZPVOFFEUPSFCVJME
    BOEVQMPBEUIF"QQUP5FTU'MJHIU
    #VJME 6QMPBE 5FTU'MJHIU1SPDFTTJOH
    NJO

    View Slide

  32. w 5FTU'MJHIUQSPDFTTJOHUJNFEFQFOETPOCJOBSZTJ[F
    w .JOJNJ[FUIFDPEFUPSFEVDFCVJMEJOHBOE5'QSPDFTTJOH
    UJNF
    w 4BOECPY"QQJTVTFGVMUPEPJU
    3&40-65*0/

    View Slide

  33. 0SHBOJ[FQSPWJTJPOJOHSFMBUFE
    DPEFJOUPPOFDPNQPOFOU
    1SPWJTJPOJOH
    $PSF
    1SPWJTJPOJOH
    6*
    .FSQBZGSBNFXPSL

    View Slide

  34. 4BOECPY"QQXJUI$PSFDPNQPOFOU
    1SPWJTJPOJOH
    $PSF
    1SPWJTJPOJOH
    6*
    .FSQBZGSBNFXPSL
    4BOECPY
    "QQ

    View Slide

  35. 3&46-54
    1SPWJTJPOJOH
    $PSFDPNQPOFOUT
    ,#
    4BOECPY"QQ
    #VJME 6QMPBE
    5FTU'MJHIU1SPDFTTJOH
    NJO
    Y'BTUFS

    View Slide

  36. 6*JNQMFNFOUBUJPO
    VTJOH4BOECPY"QQ

    View Slide

  37. 1SPWJTJPOJOH'MPX

    View Slide

  38. 1SPWJTJPOJOH'MPX

    View Slide

  39. 1SPWJTJPOJOH'MPX
    4BOECPY
    "QQ
    4UBSU

    View Slide

  40. 1SPWJTJPOJOH$PSF
    1SPWJTJPOJOH'MPX
    4BOECPY
    "QQ
    4UBSU

    View Slide

  41. %FQFOEFODZ*OKFDUJPO
    public protocol DependencyRegistry {
    var service: ServiceType { get }
    var mercariViewControllerFactory: MercariViewControllerFactoryType { get }
    var mercariExperimentProvider: MercariExperimentsProviderType { get }
    var nfcClient: NFCClientType { get }

    1SPWJEFTBMMFYUFSOBMFOWJSPONFOUEFQFOEFOUPCKFDUT
    1SPWJTJPOJOH
    $PSF
    1SPUPDPM

    View Slide

  42. %FQFOEFODZ3FHJTUSZ
    %FQFOEFODZ
    3FHJTUSZ
    "MM7JFX$POUSPMMFSTBSFJOJUJBMJ[FEXJUI%FQFOEFODZ3FHJTUSZ

    View Slide

  43. 6*VTFT$PSFDPNQPOFOUUISPVHI
    %FQFOEFODZ3FHJTUSZ
    %FQFOEFODZ
    3FHJTUSZ
    1SPWJTJPOJOH
    $PSF
    1SPWJTJPOJOH
    6*
    .FSQBZGSBNFXPSL
    1SPEVDUJPO
    "QQ

    View Slide

  44. .FSQBZGSBNFXPSL
    4BOECPY
    "QQ
    %FQFOEFODZ
    3FHJTUSZ
    1SPWJTJPOJOH
    $PSF .PDL

    1SPWJTJPOJOH
    6*
    6*VTFT$PSFDPNQPOFOUUISPVHI
    %FQFOEFODZ3FHJTUSZ

    View Slide

  45. 1SPWJTJPOJOH$PSF
    1SPWJTJPOJOH'MPX
    4BOECPY
    "QQ
    4UBSU

    View Slide

  46. 1SPWJTJPOJOH'MPX
    4BOECPY
    "QQ
    4UBSU
    %VNNZ
    /FYU

    View Slide

  47. 0UIFSVTFDBTFTPG
    4BOECPY"QQ

    View Slide

  48. &BTZUPUFTUWBSJPVTFSSPSDBTFT

    View Slide

  49. &BTZUPBDDFTTUPBOZTDSFFO
    %VNNZ
    /FYU
    %VNNZ
    /FYU








    5BQT


    View Slide

  50. &BTZUPBDDFTTUPBOZTDSFFO
    4BOECPY
    "QQ
    1BHF
    1BHF
    1BHF
    1BHF
    1BHF
    1BHF


    5BQ

    View Slide

  51. 3FDBQ
    w *OUSPEVDFE"QQMF1BZBOE*O"QQ1SPWJTJPOJOH
    w 4BOECPY"QQIFMQTUPJNQSPWFEFWFMPQNFOUF⒏DJFODZ
    w 6TFGVMGPSEFWFMPQJOHGFBUVSFTUIBUBSFIJHIMZEFQFOEFOUPOUIF
    FYUFSOBMFOWJSPONFOU
    w *NQPSUBOUUIBU7JFX$POUSPMMFSTIBWFBMPPTFMZDPVQMFEEFTJHO
    w 4BOECPY"QQNBZIFMQTZPVSDPEFNPSFMPPTFMZDPVQMFE

    View Slide

  52. 5IBOLZPV

    View Slide