일용직 코딩노동자

안드로이드(android) 지역사랑상품권 앱투앱(ApptoApp) 결제 연동. 본문

Android

안드로이드(android) 지역사랑상품권 앱투앱(ApptoApp) 결제 연동.

사용자 일용직 코딩노동자 2019. 12. 23. 13:47

우선 하이브리드 어플이라는 조건입니다만, 크게 문제는 없습니다.

안드로이드 브릿지를 사용했느냐 안했느냐의 차이입니다.

 

웹뷰를 셋팅해주는 부분에서

mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "GIFT");

라고 지정해주었습니다.

 

   final class MyJavaScriptInterface {
  @JavascriptInterface
    public void CallGift(String data, String packageName) { //데이터 / 패키지네임
      String appPackageName = packageName; //패키지네임 저장
      Intent startLink = getPackageManager().getLaunchIntentForPackage(appPackageName); //인텐트로 실행할 어플 패키지
      if(startLink == null) { //스타트링크가 널이면 마켓으로이동하여 앱설치
          // 마켓이동
          try {
              startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
          } //앱이 설치되어있는 경우 앱을 바로 실행
          catch (android.content.ActivityNotFoundException anfe) {
              startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
          }
          overridePendingTransition(0, 0);
      }
      else{ //스타트링크가 널이 아니면
          Intent intent = new Intent(Intent.ACTION_VIEW);
          intent.addCategory(Intent.CATEGORY_DEFAULT);
          intent.addCategory(Intent.CATEGORY_BROWSABLE);
          String enc_data = "";
          try {
              enc_data = URLEncoder.encode(data, "UTF-8");
          }
          catch (UnsupportedEncodingException e) {
              e.printStackTrace();
          }
          intent.setData(Uri.parse("komscochak.com://?data=" + enc_data));
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
          startActivity(intent);
          moveTaskToBack(true);

          String return_data = "";
      }
   }
}

우선 CallGift라는 메소드는 웹에서 호출을 합니다. 안드로이드 자체에서 사용하지 않습니다.

 

웹에서 호출하기위해 만들어놓은 메소드입니다.

 

때문에 @JavascriptInterface를 붙여주었습니다.

 

이 소스에서는 파라미터값으로 웹에서 해당 데이터와 실행할 어플의 패키지이름을 입력해줍니다.

 

여기서 자동으로 설치가 됬으면 실행하지만, 설치가 안됬다면 플레이스토어로 이동하여 설치합니다.

 

이후 상품권 결제 후 결제완료 여부의 데이터를 받아야합니다.

 

우선 intent scheme를 생성해줘야 합니다.

 

스키마는 저희가 intent로 전화를 실행할때도 tel://이라는걸 실행하는것처럼 

 

그것을 만들어주는 것입니다.

 

메니페스트에 스키마를 생성해주었습니다.

 

<activity
            android:name=".GiftCardReturn"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="adjustUnspecified|adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="스키마이름.com" />
            </intent-filter>
        </activity>

위의 name에는 해당 스키마이름을 입력시 어디 클래스로 이동할것인지 적어줍니다.

 

public class GiftCardReturn extends Activity {

    final private int REQUEST_CODE = 1004;
    public static int GiftCheck = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        Intent intent = getIntent();
        final Uri uri = intent.getData();
        final String data = uri.getQueryParameter("data"); //결제완료여부 데이터를 받는곳

        Intent Main_intent = new Intent(getApplicationContext(),MainActivity.class);
        GiftCheck = 1;
        Main_intent.putExtra("data",data);
        startActivityForResult(Main_intent,REQUEST_CODE);
        Toast.makeText(getApplicationContext(), "결제가 완료되었습니다.", Toast.LENGTH_SHORT).show();
        finish();
    }
}

이제 결제가 완료가 된다면 스키마에 따라 이 클래스로 올것입니다.

 

여기서 중요한건 상속이 AppCompatActivity이 아니라 Activity라는 것입니다.

 

AppCompatActivity로 상속받을시 에러를 뱉어내니 주의하세요.

 

final String data = uri.getQueryParameter("data"); 부분이 결정적으로 결제완료여부 데이터를 받아옵니다.

 

그 후 저는 메인으로 다시 intent로 전환해줍니다.

 

전환 시 putExtra로 결제완료 데이터를 메인으로 넘겨줬습니다.

 

if(GiftCardReturn.GiftCheck == 1){
            Intent Gift_Intent = getIntent();
            GiftCard_Data = Gift_Intent.getExtras().getString("data");
            GiftCardReturn.GiftCheck = 0;
            mWebView.loadUrl(MainURL+""+GiftCard_Data);
            Log.d("Gift_data",GiftCard_Data);
        }

메인에서는 이러한 코드를 작성해줍니다.

 

조건문이 없을시 널포인트 에러를 뱉어낼 문제가 생길수 있으니 주의해주세요.

 

받을 데이터가 없는데 받으려고하면 에러가 생깁니다.

 

이제 웹으로 다시 데이터를 보내줘야합니다.( 하이브리드 앱 )

 

그부분이 mWebView.loadUrl부분입니다.

 

보내실 주소와 + 그 뒤에 붙을 주소를 ""안에 적어주시고 +GiftCard_Data해주시면

 

주소와 함께 웹으로 데이터를 보내줍니다.

 

결정적으로 맨위의 CallGift 메소드를 웹에서 실행하기 위해서는

 

<input type="button" value="Giftbtn" onClick="CallGift()" />
<script type="text/javascript">
    function CallGift() {
        GIFT.CallGift();
    }
</script>

라는 구문을 적어서 실행합니다.

 

앞에 대문자 GIFT는 웹뷰셋팅할때 적어주었지요. 그뒤는 메소드명을 적어주시면 됩니다.

 

궁금하신 사항은 댓글 남겨주세요. 

0 Comments
댓글쓰기 폼