モバイル決済アプリの作り方 / How to develop a mobile payment app

D2f212ce418f3daa29c23914c9b6892b?s=47 Kentaro Matsumae
September 07, 2019

モバイル決済アプリの作り方 / How to develop a mobile payment app

iOSDC2019の発表資料です。
https://fortee.jp/iosdc-japan-2019/proposal/8cec3433-83bd-48cd-a13d-6742430518d2

近年、モバイル決済アプリが非常に話題になっています。
このトークではそんなモバイル決済アプリの開発現場から、様々な技術的トピックについてiOSアプリ開発者視点からみなさんに共有します。
モバイル決済アプリ開発特有のトピック、例えば
- Apple Pay In-App Provisionig を用いたiD決済の仕組み
- QRコードによるコード決済の仕組み
- 銀行口座接続や顔認証+公的証明書による本人確認手法技術について
- 既存の巨大なアプリに対して、いかに安全・効率的にモバイル決済機能を追加するか
- お金を扱うアプリとしてのセキュリティの重要性とその実現方法
- モバイル決済アプリ開発の今後
などについてお話します。

D2f212ce418f3daa29c23914c9b6892b?s=128

Kentaro Matsumae

September 07, 2019
Tweet

Transcript

  1. ϞόΠϧܾࡁΞϓϦͷ࡞Γํ How to develop a mobile payment app @kenmaz merpay

    #iosdc iOSDC Japan 2019 Sep. 9th, 2019
  2. ࠓ೔࿩͢͜ͱ wϞόΠϧܾࡁΞϓϦ֓ཁ wࣾձతഎܠɾ๏཯ͷ࿩ wΞϓϦͷߏ੒͢Δٕज़ཁૉ w"QQMF1BZͷ࢓૊Έ wίʔυܾࡁͷ࢓૊Έ wطଘΞϓϦ΁ͷܾࡁػೳͷ૊ΈࠐΈ

  3.  ϞόΠϧܾࡁΞϓϦΛ औΓרࣾ͘ձతഎܠ

  4. ܦࡁ࢈ۀল ΩϟογϡϨεɾϏδϣϯ https://www.meti.go.jp/policy/mono_info_service/cashless/index.html ೥ ೥ ‐  ೥ ‐ ‐

  5. wຊਓ֬ೝʹؔ͢Δ๏վਖ਼ F,:$  wΩϟογϡϨεਪਐڠٞձ wίʔυܾࡁ౷Ұ࢓༷ʮ+123ʯͷࡦఆ w+123ීٴࣄۀ wΩϟογϡϨεɾফඅऀؐݩࣄۀ ˠϞόΠϧܾࡁࣄۀʹࢀೖ͠΍͍͢؀ڥʹ ΩϟογϡϨεීٴʹ޲͚ͨಈ͖ ޙड़

    ޙड़ IUUQTDBTIMFTTHPKQ
  6.  ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ

  7. ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ $BTI*O $BTI0VU 8BMMFU

  8. $BTI*O ೖۚखஈ wۜߦޱ࠲͔Βνϟʔδ wίϯϏχνϟʔδ wΫϨδοτΧʔυ wݸਓؒૹۚ wϑϦϚΞϓϦͷച্ۚ wʜ

  9. $BTI0VU ग़ۚखஈ w"QQMF1BZ wίʔυܾࡁ wωοτܾࡁ wݸਓؒૹۚ wۜߦޱ࠲ৼࠐ ޙड़ ޙड़

  10. 8BMMFU $BTI*O $BTI0VU

  11. "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5.

    νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ࢿܾۚࡁ๏
  12. ۜߦޱ࠲νϟʔδ ίϯϏχ"5. νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ

    ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU લ෷ࣜࢧ෷͍खஈൃߦۀ ϙΠϯτ IUUQTXXXTLFTTBJKQJOGPMBXIUNM
  13. "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5.

    νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ऩೲ୅ߦۀ ˞ٞ࿦͋Γ ˞஫ IUUQTTUPSJBMBXKQCMPH
  14. "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5.

    νϟʔδ ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ࢿۚҠಈۀ IUUQTXXXTLFTTBJKQJOGPMBXIUNM
  15. ࢿۚҠಈۀ d w ۜߦ౳Ҏ֎ͷऀ͕ҝସऔҾΛۀͱͯ͠ӦΉ΋ͷ w ಺ֳ૯ཧେਉͷొ࿥͕ඞཁ w ̍ճ͋ͨΓͷૹֹۚສԁҎԼ w ߴ౓ͳ૊৫੔උ

    w ࡒ੓ج൫੔උ w ൜ࡑऩӹҠస๷ࢭ๏ͷن੍Λड͚Δ ࢿܾۚࡁ๏ୈࡾेࣣ৚ IUUQTFMBXTFHPWHPKQTFBSDIFMBXT4FBSDIFMBXT@TFBSDIMTHEFUBJM MBX*E"$
  16. ൜ࡑऩӹҠస๷ࢭ๏ w ൜ࡑऩӹͷҠసʢʹϚωʔϩϯμϦϯάʣͳ ͲΛ๷ࢭ͢ΔͨΊͷ๏཯ w औҾ࣌֬ೝٛ຿ w औҾ࣌ʹຊਓ֬ೝ ,:$ ͕ඞཁ

    w Ͳ͏΍ͬͯʁ ൜ࡑʹΑΔऩӹͷҠస๷ࢭʹؔ͢Δ๏཯ୈ࢛৚ IUUQTFMBXTFHPWHPKQTFBSDIFMBXT4FBSDIFMBXT@TFBSDIMTHEFUBJM MBX*E"$ ,:$,OPX:PVS$VTUPNFS
  17.  ༣ศʹΑΔ,:$ w ূ໌ॻͷࣸਅΛΞϓϦ͔ΒΞοϓϩʔυ w ৹ࠪͷޙɺຊਓडऔݶఆॻཹ͕༣ૹ w ̍ʙ̎ि͔͔ؒΔ ܾࡁࣄۀऀ Ξοϓϩʔυ

    ຊਓडऔݶఆॻཹ ৹ࠪ
  18.  ۜߦޱ࠲઀ଓʹΑΔ,:$ w ۜߦޱ࠲͕ۜߦʹΑΔ,:$ࡁΈͰ͋Δ͜ͱΛ ࠜڌʹɺΞϓϦͷޱ࠲΋,:$ࡁΈͱΈͳ͢ ,:$ࡁΈ 㲈,:$ࡁΈ

  19.  F,:$ ͷ๏վਖ਼ʹΑΓɺΦϯϥΠϯͰ׬݁͢Δ ຊਓ֬ೝ F,:$ ͕Մೳʹͳͬͨ IUUQTXXXZPVUVCFDPNXBUDI WLI0Z-WEPT)6

  20. "QQMF1BZ ίʔυܾࡁ ωοτܾࡁ ݸਓؒૹۚ ۜߦޱ࠲ৼࠐ 8BMMFU $BTI*O $BTI0VU ۜߦޱ࠲νϟʔδ ίϯϏχ"5.νϟʔδ

    ΫϨδοτΧʔυ ݸਓؒૹۚ ϑϦϚΞϓϦച্ۚ ຊਓ֬ೝ ,:$ ϞόΠϧܾࡁΞϓϦͷߏ੒ཁૉ
  21. "QQMF1BZ

  22. ͦ΋ͦ΋"QQMF1BZͱ͸ ˠ͘͢͝ศརͰηΩϡΞͳ ΫϨδοτΧʔυϕʔεͷܾࡁํ๏

  23. J04 %FWJDF "QQMF τʔΫϯ ϓϩόΠμʔ wΧʔυ໊ٛ wΧʔυ൪߸ '1"/  wηΩϡϦςΟίʔυ

    %1"/ 4FDVSF &MFNFOU IUUQTTVQQPSUBQQMFDPNKBKQ)5 "QQMF1BZͷΧʔυొ࿥ϑϩʔ '1"/ˠ%1"/ ੜͷΧʔυ൪߸ͱ͸ผͷΧʔυ ൪߸ʢ%1"/τʔΫϯʣʹม׵
  24. J04 %FWJDF ͓ళ τʔΫϯ ϓϩόΠμʔ "VUI ✅ %1"/ 4FDVSF &MFNFOU

    Χʔυ ձࣾ "QQMF1BZͷܾࡁϑϩʔ %1"/ˠ'1"/ '1"/ J04σόΠεʙτʔΫϯϓϩόΠμʔؒͰ ੜͷΧʔυ൪߸ '1"/ Λྲྀͣ͞ʹܾࡁՄೳ
  25. $BTI0VUखஈͱͯ͠ͷ "QQMF1BZ ܾࡁΞϓϦͷ࢒ߴͱ"QQMF1BZΛ௚݁

  26. "QQMF1BZ*O"QQ1SPWJTJPOJOH

  27. Χʔυ ձࣾ "QQMF όʔνϟϧϓϦϖΠυΧʔυͷ
 ൃߦཁٻ Χʔυൃߦ '1"/ %1"/ Χʔυొ࿥ ཁٻ

    Χʔυొ࿥ "QQMF1BZ*O"QQ1SPWJTJPOJOH
  28. 1BTT,JU w Χʔυొ࿥ॲཧ w 1,"EE1BZNFOU1BTT7JFX$POUSPMMFS w 1,"EE1BZNFOU1BTT3FRVFTU w ొ࿥ঢ়ଶɾ୺຤ରԠঢ়گͷνΣοΫ w

    1,1BTT-JCSBSZ1,1BZNFOU1BTT ˞DPNBQQMFEFWFMPQFSQBZNFOUQBTTQSPWJTJPOJOH&OUJUMFNFOU͕ඞཁ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOQBTTLJU IUUQTEFWFMPQFSBQQMFDPNMJCSBSZBSDIJWFEPDVNFOUBUJPO.JTDFMMBOFPVT3FGFSFODF&OUJUMFNFOU,FZ3FGFSFODF "QQMF1BZBOE1BTT,JU&OUJUMFNFOUT"QQMF1BZBOE1BTT,JU&OUJUMFNFOUTIUNMBQQMF@SFGEPDVJE51$)48
  29. ༨ஊ"QQMF1BZ$BTI IUUQTTVQQPSUBQQMFDPNKBKQHVJEFJQIPOFJQIDGJPT

  30. ίʔυܾࡁ

  31. ίʔυܾࡁͷछྨ .FSDIBOU1SFTFOUFE.PEF
 ళฮఏࣔܕ $1. .1. $POTVNFS1SFTFOUFE.PEF
 ར༻ऀఏࣔܕ ੩తಈత

  32. ίʔυܾࡁͷ࢓૊Έ ֤ࣾಠࣗ࢓༷ ඇެ։

  33. +123 IUUQTOFXTNZOBWJKQBSUJDMF

  34. +123 w ΩϟογϡϨεਪਐڠٞձ w ֤ࣄۀऀͱڞʹίʔυܾࡁʹؔ͢Δٕज़ͳ౷Ұ࢓༷ Λཱ֬͠ɺΨΠυϥΠϯΛࡦఆ w 23ίʔυͷσʔλϑΥʔϚοτ w γεςϜͷશମઃܭ

    w ηΩϡϦςΟཁ݅ͳͲ w ͻͱͭͷ23ίʔυͰෳ਺ͷܾࡁαʔϏε͕ར༻Մೳ IUUQTXXXQBZNFOUTKBQBOPSKQKQRS 23ίʔυ͸ ג σϯιʔ΢Σʔϒͷొ࿥঎ඪͰ͢
  35. $1. ར༻ऀఏࣔܕ IUUQTXXXNFSQBZDPNNFSDIBOU

  36. $1.ܾࡁͷશମϑϩʔ +123ίʔυܾࡁʹؔ͢Δ౷Ұٕज़࢓༷ΨΠυϥΠϯʲར༻ऀఏࣔܕʳ IUUQTXXXQBZNFOUTKBQBOPSKQXPSEQSFTTXQDPOUFOUVQMPBET$1.@(VJEFMJOF@QEG ίʔυܾࡁࣄۀऀ ᶆܾࡁཁٻ ᶃϫϯλΠϜτʔΫϯΛൃߦ ᶄ23ίʔυόʔίʔυ ͱͯ͠දࣔ ᶅ104Ϩδ୺຤PS Ճໍళ༻ΞϓϦ

    ͰಡΈࠐΈ
  37. ίʔυ࢓༷ ˡ౷Ұόʔίʔυ࢓༷ ˡ౷Ұ23ίʔυ࢓༷

  38. ౷Ұόʔίʔυ࢓༷ w ࣄۀऀࣝผίʔυ ܻ  τʔΫϯ෦ /ܻ  w ࠷େԣ෯DNͰදࣔ͢Δ͜ͱ

    DN
  39. ౷Ұ23ίʔυ࢓༷ w &.7࢓༷ $1. ˞ ͱڞଘՄೳͳ࢓༷ w ಛఆλάΛݟΔͱ+123ϑΥʔϚοτ͔ &.7 $1.

    ϑΥʔϚοτ͔൑ผͰ͖Δ w ւ֎ͷίʔυܾࡁࣄۀऀͷίʔυͱͷࣝผ͕Մೳ ˞&.7 $1. &.7$P -$$ ˞ ͕ࡦఆͨ͠άϩʔόϧͳ23ίʔυܾࡁ࢓༷
 ˞&.7$P-$$&.7 ˞ ࢓༷ͳͲΛࡦఆ͢Δٕज़ஂମ
 ˞&.7*$ܕΫϨδοτΧʔυͷ౷Ұن֨ IUUQTXXXFNWDPDPNFNWUFDIOPMPHJFTRSDPEFT
  40. l+12399'//////ʜz σίʔυ 5BH આ໌ ௕͞ ஋  ϖΠϝϯτϑΥʔϚοτࣝผࢠ  l+123z

     ΞϓϦέʔγϣϯςϯϓϨʔτ Մม௕ ʜ ' "%'/BNF ϒϥϯυࣝผࢠ Մม௕ lz  5SBDL *%౳ Մม௕ ܾࡁ*% 5-7 λά ௕͞ ஋ ܗࣜ +123 ϑΥʔϚοτ lࣄۀऀࣝผίʔυ ܻ z lτʔΫϯ෦ /ܻ z
 ˠ౷Ұόʔίʔυͱڞ௨
  41. 23छผ൑ผ +123 &.7 ࣄۀऀࣝผίʔυ൑ผ ˓˓1BZ ☓☓1BZ ˚˚1BZ ւ֎1BZ τʔΫϯ൑ผ Ϣʔβಛఆܾࡁॲཧ։࢝

    ˑˑ1BZ &.7ࣄۀऀ൑ผ +123&.7ରԠ
 104୺຤
  42. 23ίʔυόʔίʔυͷදࣔ import CoreImage import Foundation let payload = “8505JPQR164XX4F08123456785712345678NNNNN." //

    QRίʔυ let filter = CIFilter(name: "CIQRCodeGenerator")! let data = string.data(using: .utf8) filter.setValue(data, forKey: "inputMessage") filter.setValue("H", forKey: "inputCorrectionLevel") let image = UIImage(ciImage: filter.outputImage!) // όʔίʔυ let filter = CIFilter(name: “CICode128BarcodeGenerator")! จࣈྻɾɾɾ
  43. J04d IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFJNBHFDJpMUFSCBSDPEFHFOFSBUPSpMUFS DIBOHFTMBUFTU@NJOPSMBOHVBHFPCKD IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPODPSFJNBHFDJpMUFSRSDPEFHFOFSBUPS DIBOHFTMBUFTU@NJOPSMBOHVBHFPCKD

  44. $1.ʹ͓͚Δͦͷଞͷཹҙ఺ w 23ίʔυΛදࣔ͢Δͱ͖͸εΫ Ϧʔϯͷً౓Λ࠷େݶʹ্͛Δ w όʔίʔυͱ23ίʔυ͸ಉҰը໘ ʹදࣔ w εΫϦʔϯγϣοτࡱӨ࣌ʹ͸ܯࠂ දࣔ

  45. ੩త.1. ళฮఏࣔܕ IUUQTKQNFSQBZDPNOFXTRS IUUQTKQNFSQBZDPNOFXTNFSQBZ@PTBLB

  46. .1.ܾࡁͷશମϑϩʔ ίʔυܾࡁࣄۀऀ ᶃ੩త23ίʔυΛࡱӨ ᶅܾࡁϦΫΤετ ͷૹ৴ ᶄऔҾֹۚΛೖྗ ᶆ݁Ռදࣔ IUUQTXXXQBZNFOUTKBQBOPSKQXPSEQSFTTXQDPOUFOUVQMPBET.1.@(VJEFMJOF@QEG ίʔυܾࡁʹؔ͢Δ౷Ұٕज़࢓༷ΨΠυϥΠϯʲళฮఏࣔܕʳ ʢᶈళһʹΑΔ֬ೝʣ

    ᶇళһʹΑΔ
 ֬ೝ
  47. ౷Ұ੩త23ίʔυ࢓༷ w $1.ͱಉ͘͡&.7࢓༷ .1. ϕʔε w ళฮଆͷ৘ใ͕֨ೲ͞Ε͍ͯΔͷͰ$1.ΑΓ΋৘ ใྔ͸ଟ͍ w ๏ਓɺళ໊ɺࢧళ໊ɺԿ൪ςʔϒϧʜ

    w औҾֹۚɺ௨՟छผʜ
  48. lKQPSQBZNFOUTKBQBOBBBBBBBB BBBBBCCCCDDDDDDEEEEEE ʜz *% આ໌ ௕͞ ஋ lz ࢓༷WFSTJPO 

    lz lz ੩తಈతϑϥά  lz ੩త lz ܖ໿ళ৘ใ  ܖ໿ళ৘ใ lz औҾ௨՟  lz ԁ lz औҾֹۚ ೚ҙ   ʜ ʜ ʜ ʜ *% આ໌ ௕͞ ஋ lz (MPCBM6OJRVF*EFOUJpFS  lKQPSQBZNFOUTKBQBOz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ1  lBBBBBBBBBBBBBz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ2  lCCCCz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ3  lDDDDDDz lz ౷Ұళฮࣝผίʔυ؅ཧϨϕϧ4  lEEEEEEz ܖ໿ళ৘ใ ୺຤εςοΧʔྫ l൪ςʔϒϧz ܖ໿ళྫ z৽ڮ̍߸ళz ϒϥϯυྫ z˓˓԰z ๏ਓྫ l˓˓גࣜձࣾz σίʔυ
  49. 23ίʔυͷεΩϟϯ import AVFoundation let session = AVCaptureSession() let input =

    try! AVCaptureDeviceInput(device: videoDevice) var output = AVCaptureMetadataOutput() output.setMetadataObjectsDelegate(self, queue: …) session.addInput(input) session.addOutput(self.output) output.metadataObjectTypes = [.qr] session.startRunning() extension …: AVCaptureMetadataOutputObjectsDelegate { public func metadataOutput(.., meta: [AVMetadataObject],..) { … = meta.compactMap { in if let code = $0 as? AVMetadataMachineReadableCodeObject, code.type == .qr, let val = code.stringValue { return val
  50. .1.ʹ͓͚Δͦͷଞͷཹҙ఺ w ܾࡁ׬ྃը໘ w εΫγϣ౳ɺը໘ͷِ଄͕༰қ w ΞχϝʔγϣϯɺԻɺλΠϜελ ϯϓͷදࣔͳͲΛߦِ͍଄Λ๷͙ w ར༻ऀɾళһ༻ΞϓϦ΁ͷऔҾ׬

    ྃ௨஌
  51. +123ίʔυ࢓༷·ͱΊ $1. .1. Կ1BZ Ϣʔβ͸୭ʁ Ͳͷςʔϒϧ ֹۚ Ͳ͜ͷళʁ

  52. w 23ίʔυ಺෦ͷ৘ใΛ֬ೝͰ͖Δπʔϧ w ରԠϑΥʔϚοτ w &.7$1..1. w +123$1..1. +1233FBEFS IUUQTHJUIVCDPNLFONB[+1233FBEFS

    044
  53. طଘΞϓϦ 

  54. طଘΞϓϦ΁ͷ ܾࡁػೳͷ૊ΈࠐΈ ʙϝϧΧϦ ϝϧϖΠͷ৔߹ʙ

  55. ػೳ͝ͱʹGSBNFXPSLΛ෼ׂ

  56. ෳ਺νʔϜʹΑΔಉ࣌։ൃ 4BOECPY 4BOECPYΛ༻͍ͨ։ൃޮ཰Խ

  57. %FQFOEFODZ*OKFDUJPO

  58. "QQMF1BZ ϓϩϏδϣχϯά ίʔυܾࡁ
 $1. ίʔυܾࡁ
 .1. ઃఆ։࢝ ઃఆ׬ྃ ܾࡁ׬ྃ ܾࡁ׬ྃ

    J1IPOF࣮ػ 'FMJ$B ίʔυϦʔμʔ࣮ػ J1IPOF࣮ػ Χϝϥ
  59. ֤छಈ࡞֬ೝʹ࣮ػ͕ඞཁ w ຖճ࣮ػసૹͯ͠։ൃ͠ͳ͍ͱ͍͚ͳ͍  w ೔ʑͷ։ൃ͸J044JNVMBUPS্Ͱ׬͍݁ͨ͠ ˠ%* %FQFOEFODZ*OKFDUJPO Λ࢖͏

  60. QSPUPDPM233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH 
 ^ DMBTT233FBEFS233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH \
 MFUTFTTJPO"7$BQUVSF4FTTJPOʜ


    ʜ ^ 3FMFBTF#VJME DMBTT233FBEFS4UVC233FBEFS5ZQF\
 GVODNFUBEBUB0VUQVU QBZMPBE4USJOH \
 SFUVSOl%6..:@7"-6&z ^
 ^ %FCVH#VJME ྫ %*ʹΑΔΧϝϥϞδϡʔϧͷ ελϒԽ
  61. ·ͱΊ wϞόΠϧܾࡁΞϓϦͷഎܠͱߏ੒ٕज़ wΩϟογϡϨεਪਐڠٞձ $BTI*O $BTI0VU  F ,:$ w"QQMF1BZ w"QQMF1BZ࢓૊Έ

    ηΩϡϦςΟ *O"QQ1SPWJTJPOJOH wίʔυܾࡁ w+123࢓༷ $1..1.ͷ࢓༷ wطଘΞϓϦ΁ͷܾࡁػೳͷ૊ΈࠐΈ wGSBNFXPSL෼ׂͱTBOECPY %*
  62. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ IUUQTHJUIVCDPNLFONB[+1233FBEFS