ÈÞ´ëÆù º»ÀÎÀÎÁõ ¿¬µ¿Çϱâ
ÈÞ´ëÆù º»ÀÎÀÎÁõ ¿¬µ¿Çϱâ
https://docs.iamport.kr/tech/mobile-authentication#add-library
https://www.iamport.kr/getstarted
https://github.com/zladnrms/IamportAuthExample
🤗 Android SMS º»ÀÎÀÎÁõ ±¸ÇöÇϱâ
Android¿¡¼ SMS º»ÀÎÀÎÁõÀ» ±¸ÇöÇÏ´Â ¹æ¹ý¿¡´Â ¿©·¯°¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù.
1) ¼¹ö¿¡¼ ¹®ÀÚ ÀÎÁõ ü°è¸¦ ±¸ÃàÇÏ¿© ÁøÇàÇÏ´Â ¹æ¹ý
2) PG»ç¿¡¼ Á¦°øÇÏ´Â º»ÀÎ ÀÎÁõ API¸¦ ÀÌ¿ëÇÏ¿© ±¸ÃàÇÏ´Â ¹æ¹ý
µî..
ÀÌ ±Û¿¡¼´Â 2¹ø, ±× Áß ¾Æ·¡¿Í °°Àº ȸ鿡¼ ÀÎÁõÀ» ÇÏ´Â ¹æ¹ýÀ» ±¸ÇöÇغ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
À§´Â ´Ù³¯(Danal) PG»ç¿¡¼ Á¦°øÇÏ´Â API¸¦ ÀÌ¿ëÇÑ ÀÎÁõ½Ã½ºÅÛÀÇ ÇÑ È¸éÀä,
À̸¦ ½±°í °£ÆíÇÏ°Ô ±¸ÇöÇϱâ À§ÇÑ API¸¦ ¾ÆÀÓÆ÷Æ®¿¡¼ Á¦°øÇÕ´Ï´Ù.
µû¶ó¼ ÀÌ ±Û¿¡¼´Â ¾ÆÀÓÆ÷Æ® Ç÷§ÆûÀ» ÀÌ¿ëÇÏ¿© ÁøÇàÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù.
Á¦°¡ ÀÛ¼ºÇÑ Full ¿¹Á¦´Â ¿©±â¼ È®ÀÎÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.
https://github.com/zladnrms/IamportAuthExample
📕 ½ÃÀÛÇϱâ Àü¿¡..
¾ÆÀÓÆ÷Æ® °ø½Ä °³¹ß°¡À̵忡¼ ³ª¿ÍÀÖµíÀÌ, À¥ºä¸¦ ÅëÇÑ ÀÎÁõ ÈÄ °á°ú¸¦
Android Code (Java Or Kotlin)À¸·Î ¾ò¾î¿Í¼ ó¸®ÇÏ´Â ¹æ¹ýÀ»ÃëÇØ¾ß ÇÕ´Ï´Ù.
±×·¯´Ï±î º»ÀÎÀÎÁõÀ» À§ÇÑ Ã³¸® ¼ø¼¸¦ ´ëºÐ·ù·Î ³ª´²º¸ÀÚ¸é,
¾Èµå·ÎÀ̵忡¼ º»ÀÎÀÎÁõ ½Ãµµ -> À¥ºä¸¦ ÅëÇÑ º»ÀÎÀÎÁõ -> °á°ú¸¦ ¾Èµå·ÎÀ̵å·Î °¡Á®¿È -> ó¸®
ÀÇ ¼ø¼¸¦ ÃëÇÏ°Ô µË´Ï´Ù.
±Û ÀÛ¼ºÀº, ù¹ø°·Î´Â ¾ÆÀÓÆ÷Æ® °¡À̵å¶óÀÎÀ» Ãæ½ÇÈ÷ µû¸¥ ¼ø¼·Î ÀÛ¼ºÇÒ °ÍÀ̸ç,
±× ÇÏ´Ü¿¡´Â Á¦°¡ ½Ç¹«¿¡ Àû¿ëÇÑ ¹æ¹ýÀ» ±×´ë·Î ±â¼úÇÏ°Ú½À´Ï´Ù.
📗 °³¹ß ¹æ¹ý
1. ÀÎÁõ À¥ºä·Î »ç¿ëÇÒ html ÆÄÀÏÀ» ÀÛ¼ºÇØÁÝ´Ï´Ù. ÀÌ ¿¹½Ã´Â ¾ÆÀÓÆ÷Æ® °ø½Ä ȨÆäÀÌÁö¿¡¼ ¼Ò°³ÁßÀÔ´Ï´Ù.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <!DOCTYPE html> <html> <head> <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script> <script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.1.5.js" ></script> </head> <body> <!-- ¾ÆÀÓÆ÷Æ® ÀÚ¹Ù½ºÅ©¸³Æ®´Â jQuery ±â¹ÝÀ¸·Î °³¹ßµÇ¾ú½À´Ï´Ù --> <script type="text/javascript"> var IMP = window.IMP; // »ý·«°¡´É IMP.init('iamport'); // 'iamport' ´ë½Å ºÎ¿©¹ÞÀº "°¡¸ÍÁ¡ ½Äº°ÄÚµå"¸¦ »ç¿ë /* Áß·« */ IMP.certification({ merchant_uid : 'merchant_' + new Date().getTime() //º»ÀÎÀÎÁõ°ú ¿¬°üµÈ °¡¸ÍÁ¡ ³»ºÎ ÁÖ¹®¹øÈ£°¡ ÀÖ´Ù¸é ³Ñ°ÜÁÖ¼¼¿ä }, function(rsp) { if ( rsp.success ) { // ÀÎÁõ¼º°ø console.log(rsp.imp_uid); console.log(rsp.merchant_uid); $.ajax({ type : 'POST', url : '/certifications/confirm', dataType : 'json', data : { imp_uid : rsp.imp_uid } }).done(function(){ takeResponseAndHandle(rsp) }); } else { // ÀÎÁõÃë¼Ò ¶Ç´Â ÀÎÁõ½ÇÆÐ var msg = 'ÀÎÁõ¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.'; msg += '¿¡·¯³»¿ë : ' + rsp.error_msg; alert(msg); } }); function takeResponseAndHandle(rsp) { if ( rsp.success ) { // ÀÎÁõ¼º°ø console.log(rsp.imp_uid); console.log(rsp.merchant_uid); } else { // ÀÎÁõÃë¼Ò ¶Ç´Â ÀÎÁõ½ÇÆÐ var msg = 'ÀÎÁõ¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.'; msg += '¿¡·¯³»¿ë : ' + rsp.error_msg; alert(msg); } } </script> </body> </html> |
Hot Ez Ex)
°¡¸ÍÁ¡ ½Äº°ÄÚµå : ¾ÆÀÓÆ÷Æ® °ü¸®ÀÚ ÆäÀÌÁöÀÇ '³» Á¤º¸'¿¡ ÀÖ´Â imp·Î ½ÃÀÛÇÏ´Â ¹®ÀÚ¿À» ³Ö¾îÁÝ´Ï´Ù.
¿©±â±îÁö¸¸ ÁøÇàÇϼ̾ html¸¦ ºê¶ó¿ìÀú·Î ½ÇÇà½ÃÄѺ¸½Ã¸é ¾Æ·¡¿Í °°Àº ÀÎÁõ ÆäÀÌÁö°¡ ¶ß°Ô µÉ °Í ÀÔ´Ï´Ù.
±×·¸´Ù¸é À¥ºäÀÇ ÀÚ¹Ù½ºÅ©¸³Æ®ÂÊ ¼Ò½º¸¦ °£·«ÇÏ°Ô ¾Ë¾Æº¾½Ã´Ù.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <script> IMP.certification({ merchant_uid : 'merchant_' + new Date().getTime() //º»ÀÎÀÎÁõ°ú ¿¬°üµÈ °¡¸ÍÁ¡ ³»ºÎ ÁÖ¹®¹øÈ£°¡ ÀÖ´Ù¸é ³Ñ°ÜÁÖ¼¼¿ä }, function(rsp) { if ( rsp.success ) { //(1) ÀÎÁõ¿¡ ¼º°ø ½Ã!! console.log(rsp.imp_uid); console.log(rsp.merchant_uid); $.ajax({ type : 'POST', url : '/certifications/confirm', dataType : 'json', data : { imp_uid : rsp.imp_uid } }).done(function(){ takeResponseAndHandle(rsp) }); } else { //(2) ÀÎÁõ Ãë¼Ò ¶Ç´Â ÀÎÁõ ½ÇÆÐ ½Ã var msg = 'ÀÎÁõ¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.'; msg += '¿¡·¯³»¿ë : ' + rsp.error_msg; alert(msg); } }); </script> |
º»ÀÎ ÀÎÁõÀÌ ¼º°øÇؾ߸¸ rsp ³»ÀÇ º¯¼ö¸¦ ó¸®ÇÒ ¼ö ÀÖÀ¸¸ç, ¾Æ´Ò ½Ã else ºí·Ï ³»ÀÇ Ã³¸®·Î ³Ñ¾î°¡°Ô µÇ´Â °Í Àä, ±×Áß¿¡
$.ajax({
}).done(function(){
});
ÀÌ Ã³¸®ÀÇ °æ¿ì, º»ÀÎÀÎÁõÀÌ ¼º°øÇÏ¿´À» ¶§, ÀÚ½ÅÀÇ ¼¹ö¿¡¼ 󸮸¦ ÇØÁÙ °ÍÀÌ ÀÖ´Ù¸é ÇØÁÖ´Â °ÍÀÌ°í, ¾Æ´Ï¶ó¸é ÇÊ¿ä¾ø´Â ºÎºÐÀÔ´Ï´Ù.
ÀÌ¿Í´Â º°°³·Î, º»ÀÎÀÎÁõ¿¡ ¼º°øÇÑ »ç¶÷ÀÇ Á¤º¸ (¼ºº°, À̸§ µî)À» È®ÀÎÇÏ°í½Í´Ù¸é, iamportÀÇ rest api¸¦ ÀÌ¿ëÇÏ¿© ¹Þ¾Æ¿Í¾ß ÇÕ´Ï´Ù.
ÀÌ´Â, ¿©±â¿¡¼ ½±°Ô ã¾Æ º¼ ¼ö ÀÖ½À´Ï´Ù.
📘 WebView´Â ¿Ï¼º, ¿¬°áÀº?
ÀÎÁõ¿¡ ¼º°øÇ߰ųª ½ÇÆÐÇÏ¿´À» ¶§, ÇØ´ç ¿©ºÎ¸¦ ¾Èµå·ÎÀ̵å¿Í Åë½ÅÇÏ¿©¾ß ÇÕ´Ï´Ù.
ÀÌ°ÍÀº ¾Èµå·ÎÀ̵å¿Í ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ ¿¬µ¿À» ÅëÇÏ¿© ó¸®ÇÏ°Ô µË´Ï´Ù.
¿ì¼±, ¾Èµå·ÎÀ̵忡¼ ÇØ´ç 󸮸¦ À§ÇÑ Class¸¦ ¸¸µé¾îÁÝ´Ï´Ù.
1 2 3 4 5 6 7 8 9 10 | import android.webkit.JavascriptInterface class SmsAuthFactory(activity: Activity) { private val TAG = "SmsAuthFactory¡Ú" @JavascriptInterface fun resultAuth(message: String) { //javascript·Î ºÎÅÍ ¿Â parameter (message)¸¦ ó¸® } |
resultAuth ÇÔ¼ö°¡ ÀÖ°í, JavascriptInterface AnnotationÀÌ ºÙ¾îÀÖ½À´Ï´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ¿¬µ¿µÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ´Â ÇÔ¼öÀΰ¡? ¶ó´Â »ý°¢À» ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÇÏÁö¸¸ ¿©±â±îÁö¸¸ º¸¸é ÀÌÇØ°¡ Àß µÇÁö ¾Ê½À´Ï´Ù.
±×·¯¹Ç·Î ÀÌ¾î¼ ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼ ¾Èµå·ÎÀ̵å·Î °ªÀ» º¸³»´Â ¿ªÇÒÀ» Çϴ ó¸®¸¦ º¸µµ·Ï ÇսôÙ.
1 2 3 4 5 6 | <script> ...Áß·«... window.AndroidBridge.resultAuth('success'); </script> |
window°´Ã¼ µÚÀÇ AndroidBridge´Â Á¶¸¸°£ µû·Î ¸¸µé¾îÁÙ namespace °°Àº °ªÀÔ´Ï´Ù.
±Ùµ¥ resultAuth('success'); ºÎºÐÀ» Àß º¸¸é, À§¿¡ JavascriptInterface AnnotationÀ» ºÙÀÎ ÇÔ¼ö¿Í À̸§ÀÌ °°´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.
Áï window.AndroidBridge¸¦ ÅëÇÏ¿© À§¿¡ ¸¸µç SmsAuthFactoryÀÇ resultAuth ÇÔ¼ö·Î °ªÀ» Àü´ÞÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ°ÚÁö¿ä?
ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î ¾Èµå·ÎÀ̵å¿Í ÀÚ¹Ù½ºÅ©¸³´Â »óÈ£ÀÛ¿ëÇÏ°Ô µË´Ï´Ù.
ÀÌÁ¦ ¸¶Áö¸·À¸·Î, º»ÀÎÀÎÁõ À¥ºä¸¦ ¶ç¿ì´Â ¾Èµå·ÎÀ̵å Activity¿¡¼ÀÇ Ã³¸®¸¦ º¾½Ã´Ù.
À¥ºä¿Í À§ÀÇ SmsAuthFactory¸¦ ¿¬°áÇÏ´Â ÇÑ ÁÙÀÇ ÄÚµå¸é ÇØ°áµË´Ï´Ù.
1 | webView.addJavascriptInterface(SmsAuthFactory(), "AndroidBridge") |
SmsAuthFactory Ŭ·¡½º¸¦ AndroidBridge¶ó´Â namespace·Î javascript window °´Ã¼¿¡ ¸¸µé¾îÁÖ´Â °ÍÀÔ´Ï´Ù.
±×·¯¸é ÀÚ¹Ù½ºÅ©¸³Æ®ÂÊ ¼Ò½º Äڵ带 Á¤¸®Çغ¸°Ú½À´Ï´Ù.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <script> IMP.certification({ merchant_uid : 'merchant_' + new Date().getTime() //º»ÀÎÀÎÁõ°ú ¿¬°üµÈ °¡¸ÍÁ¡ ³»ºÎ ÁÖ¹®¹øÈ£°¡ ÀÖ´Ù¸é ³Ñ°ÜÁÖ¼¼¿ä }, function(rsp) { if ( rsp.success ) { //(1) ÀÎÁõ¿¡ ¼º°ø ½Ã!! console.log(rsp.imp_uid); console.log(rsp.merchant_uid); $.ajax({ type : 'POST', url : '/certifications/confirm', dataType : 'json', data : { imp_uid : rsp.imp_uid } }).done(function(){ takeResponseAndHandle(rsp) }); } else { //(2) ÀÎÁõ Ãë¼Ò ¶Ç´Â ÀÎÁõ ½ÇÆÐ ½Ã var msg = 'ÀÎÁõ¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù.'; msg += '¿¡·¯³»¿ë : ' + rsp.error_msg; alert(msg); } }); </script> |
ÀÎÁõÀÇ °á°ú ¿©ºÎ¸¦ AndroidBridge¶ó ¸í¸íÇÑ SmsAuthFactory Ŭ·¡½º¸¦ ÅëÇÏ¿© ¾Èµå·ÎÀ̵å·Î Àü´ÞÇÏ´Â ÄÚµåÀÔ´Ï´Ù.
📚 °¨ Àâ±â ³¡.. ÇÕÄ¡ÀÚ!
¿©±â±îÁö´Â °¨Àâ±â ¹× ÀüüÀûÀΠƲÀ» ¾Ë°í ÀÚÀ¯ÀÚÀç·Î ó¸®Çϱâ À§ÇÑ ¹Ø¹ÞħÀ̾ú½À´Ï´Ù.
¾Æ·¡ºÎÅÍ´Â ½ÇÀü¿¡¼ º»ÀÎÀÎÁõ ÈÄ, ÀÎÁõ ¼º°ø ½Ã ÇØ´ç ÀÎÁõÁ¤º¸±îÁö ¹Þ¾Æ¿À´Â 󸮸¦ Çغ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
📙 ±¸¼º¿ä¼Ò
º»ÀÎ ÀÎÁõ ȸéÀ¸·Î ³Ñ¾î°¡±â À§ÇÑ ¹öÆ° Á¸Àç ¾×ƼºñƼ
º»ÀÎ ÀÎÁõÀ» ÁøÇàÇÏ´Â WebView Activity
ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ¾Èµå·ÎÀ̵åÀÇ Interface ¿ªÇÒÀ» ÇÏ´Â SmsAuthFactory Class
WebView¸¦ ±¸¼ºÇÏ´Â html
ÀÌ·¸°Ô ÃÑ 4°¡Áö°¡ ÇÊ¿äÇÕ´Ï´Ù.
º»ÀÎ ÀÎÁõ ȸéÀ¸·Î ³Ñ¾î°¡±â À§Çؼ, ¹öÆ° Ŭ¸¯ À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§
º»ÀÎÀÎÁõ WebView Activity¸¦ startActivityForResult¸¦ ÅëÇÏ¿© ½ÇÇà½ÃÅ°µµ·Ï ÇÕ´Ï´Ù.
1 | startActivityForResult(..., SMS_AUTH_REQ_CODE) |
±×¸®°í À§ÀÇ SmsAuthFactory Class¿¡¼ Á¶±Ý Ãß°¡ÇØÁÙ »çÇ×ÀÌ ÀÖ½À´Ï´Ù.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import android.app.Activity import android.app.Activity.RESULT_OK import android.content.Intent import android.webkit.JavascriptInterface class SmsAuthFactory(activity: Activity) { private val TAG = "SmsAuthFactory¡Ú" private val activity = activity @JavascriptInterface fun resultAuth(message: String, impKey: String?) { val intent = Intent() if(message == "success" && impKey != null) { intent.putExtra("result","success") intent.putExtra("imp_key", impKey) activity.setResult(RESULT_OK,intent) activity.finish() } else { intent.putExtra("result","failure") activity.setResult(RESULT_OK,intent) activity.finish() } } } |
Hot Ez Ex) getString(R.string.imp_key)¿Í getString(R.string.imp_secret)Àº i'amport °ü¸®ÀÚ ÆäÀÌÁöÀÇ °¡¸ÍÁ¡ ½Äº°ÄÚµå ¾Æ·¡¿¡ ÀÖ´Â 2°¡Áö¸¦ ÀǹÌÇϸç, impKey´Â ÀÎÁõ¿¡ ¼º°øÇßÀ» ½Ã ¹ÞÀ» ¼ö ÀÖ´Â ÀÚ¹Ù½ºÅ©¸³Æ® »ó¿¡¼ÀÇ imp_key¸¦ ÀǹÌÇÑ´Ù.
ÀÌÁ¦ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ¾ÆÁÖ Á¶±Ý ¼Õº¸¸é µË´Ï´Ù.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(requestCode == SMS_AUTH_REQ_CODE) { data?.let { it.getStringExtra("result")?.let { result -> Toast.makeText(this, result, Toast.LENGTH_SHORT).show() } it.getStringExtra("imp_key")?.let { impKey -> viewModel.smsAuthPostAccessToken(getString(R.string.imp_key), getString(R.string.imp_secret), impKey) } ?: Toast.makeText(this, "ÀÎÁõ °á°ú°¡ ´©¶ôµÇ¾ú½À´Ï´Ù.\nÀçÀÎÁõÀÌ ÇÊ¿äÇÕ´Ï´Ù.", Toast.LENGTH_SHORT).show() } } } |
À§¿¡¼ º¯¼ö ÇÑ °³¸¦ ³Ñ±â´Â °ÍÀÌ Ãß°¡µÇ¾ú½À´Ï´Ù. (rsp.imp_uid)
À̸¦ ³Ñ±èÀ¸·Î½á ÇØ´ç À¯ÀúÀÇ Á¤º¸(À̸§, ÇÚµåÆù ¹øÈ£ µî)À» ÃßÀûÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌÁ¦ ÀÌ Á¤µµ¸é ÀÎÁõ °úÁ¤Àº ¸ðµÎ ³¡³µ½À´Ï´Ù.
´ÙÀ½Àº ¾ÆÀÓÆ÷Æ®¿¡¼ Á¦°øÇÏ´Â rest api¸¦ ÅëÇÏ¿© ÇØ´ç À¯ÀúÀÇ Á¤º¸¸¦ ¹Þ¾Æ¿À´Â 󸮸¦ ÁøÇàÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù
https://zladnrms.tistory.com/61?category=861489
#¾Èµå·ÎÀ̵å iamport ¿¬µ¿ #¾Èµå·ÎÀÌµå ¹®ÀÚÀÎÁõ