본문 바로가기
Android

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

by 일용직 코딩노동자 2019. 12. 23.
728x90
반응형

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

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

 

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

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는 웹뷰셋팅할때 적어주었지요. 그뒤는 메소드명을 적어주시면 됩니다.

 

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

728x90
반응형

댓글