마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안녕하세요... 쌩초보 안드로이드 mysql 질문드립니다...

0 추천

 

아이디 비밀번호를 입력하고 잔액 확인하기 버튼을 누르면 TextView에 현재잔액이 뜨도록 하고싶습니다..

현재 충전은 되는 상태구요...!

잔액 확인하기 버튼에 있는 if(success) 문에 코드를 짜야할 것 같은데 php는 어떻게 짜야할지, 연결은 어떻게 해야할지 도저히 모르겠어요ㅜㅜ 며칠째 붙잡고 있습니다.. 도와주세요ㅜㅜ

아래는 코드입니다..

(아이디, 비밀번호 받는건 로그인이랑 같아서 LoginRequest를 사용했고, 충전은 insertToDatabase로 구현했습니다.)

package org.techtown;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.telecom.TelecomManager;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

public class MypapgeMoneyPopup extends Activity {

    LinearLayout mypage_popup;
    EditText idText;
    EditText passwordText;
    EditText willmoney;
    TextView nowmoney;

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

        //타이틀바 없애기
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_mypapge_money_popup);

        //UI 객체 생성
        mypage_popup = (LinearLayout) findViewById(R.id.mypage_popup);

        idText = (EditText)findViewById(R.id.eid);
        passwordText = (EditText)findViewById(R.id.epw);
        willmoney = (EditText)findViewById(R.id.willmoney);
        nowmoney = (TextView)findViewById(R.id.nowmoney);

        //잔액 확인하기 버튼 클릭
        Button check = (Button) findViewById(R.id.check);
        check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String userid = idText.getText().toString();
                final String userpassword = passwordText.getText().toString();
                final String money = nowmoney.getText().toString();

                Response.Listener<String> responseListener = new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {
                        try{
                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");

                            if(success){
                                Toast.makeText(getApplicationContext(), "충전 금액을 입력하세요.", Toast.LENGTH_SHORT).show();
                            }else  {
                                Toast.makeText(getApplicationContext(), "잘못된 정보입니다.", Toast.LENGTH_SHORT).show();
                            }
                            if(userid.equals("") || userpassword.equals("")){
                                Toast.makeText(getApplicationContext(), "정보를 입력해주세요.", Toast.LENGTH_SHORT).show();
                            }
                            else {
                            }

                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                };

                LoginRequest loginRequest = new LoginRequest(userid, userpassword, responseListener);
                RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
                queue.add(loginRequest);
            }
        });

        //충전하기 버튼 클릭
        Button next = (Button) findViewById(R.id.next);
        next.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                final String userid = idText.getText().toString();
                final String userpassword = passwordText.getText().toString();
                final String starmoney = willmoney.getText().toString();

                insertToDatabase(userid,userpassword,starmoney);
                finish();
            }

        });
    }
    private void insertToDatabase(final String userid,final String userpassword, final String starmoney) {
        class InsertData extends AsyncTask<String, Void, String> {
            ProgressDialog loading;

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MypapgeMoneyPopup.this, "Please Wait", null, true, true);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
            }

            @Override
            protected String doInBackground(String... params) {

                try{
                    String userid = (String)params[0];
                    String userpassword = (String)params[1];
                    String starmoney = (String)params[2];

                    String link="http://__.php";

                    String data  = URLEncoder.encode("userid", "UTF-8") + "=" + URLEncoder.encode(userid, "UTF-8");
                    data += "&"  + URLEncoder.encode("userpassword", "UTF-8") + "=" + URLEncoder.encode(userpassword, "UTF-8");
                    data += "&"  + URLEncoder.encode("starmoney", "UTF-8") + "=" + URLEncoder.encode(starmoney, "UTF-8");

                    URL url = new URL(link);
                    URLConnection conn = url.openConnection();

                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

                    wr.write( data );
                    wr.flush();

                    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                    StringBuilder sb = new StringBuilder();
                    String line = null;

                    // Read Server Response
                    while((line = reader.readLine()) != null)
                    {
                        sb.append(line);
                        break;
                    }
                    return sb.toString();
                }

                catch(Exception e){
                    return new String("Exception: " + e.getMessage());
                }
            }
        }

        InsertData task = new InsertData();
        task.execute(userid,userpassword,starmoney);
    }

    //바깥 레이어 클릭 시 안닫히게
    public boolean onTouchEvent(MotionEvent event){
        if(event.getAction() == MotionEvent.ACTION_OUTSIDE){
            return false;
        }
        return true;
    }
}

 

helpme (210 포인트) 님이 2020년 11월 26일 질문
helpme님이 2020년 11월 26일 수정

1개의 답변

0 추천
 
채택된 답변
public abstract class ApiResponse<T> {
    protected final boolean success;
    protected final int errorCode;
    protected final String errorMessage;
    protected final T data;

    public ApiResponse(...) {    

    }
}

public class UserBalance {
      private final String userId;
      private final BigDecimal currentBalance;
     
      public UserBalance(String userId, BigDecimal currentBalance) {
          this.userId = userId;
         this.currentBalance = currentBalance;
     }

     // getters & setters 생략
}

public class UserBalanceResponse extends ApiResponse<UserBalance> {...}

public class MypapgeMoneyPopup extends Activity {
 
    LinearLayout mypage_popup;
    EditText idText;
    EditText passwordText;
    EditText startMoenyText;
    TextView currentBalanceText;

   // 사용자 ID를  로그인 성공 시 SharedPreferences에 저장했다고 가정합니다. 이런 클래스는 랩핑을 해야하지만, 코드가 너무 길어져서 생략합니다.
    private SharedPreferences sharedPref;
    private String userId;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mypapge_money_popup);

        removeTitlebar();
        bindViews();
        redSettings();
        fetchBalance();
   } 
 
   private void removeTitlebar() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
 }

 private void bindViews() {
        mypage_popup = (LinearLayout) findViewById(R.id.mypage_popup);
 
        idText = (EditText)findViewById(R.id.eid);
        passwordText = (EditText)findViewById(R.id.epw);
        startMoenyText = (EditText)findViewById(R.id.startMoenyText);
        currentBalanceText = (TextView)findViewById(R.id.currentBalanceText);

        Button balanceCheckButton = (Button) findViewById(R.id.check);
        balanceCheckButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                   fetchBalance();
            }
       });


       Button chargeButton = (Button) findViewById(R.id.next);
        chargeButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                 chargeBalance();
            }
        });
 
    }

    private void readSettings() {
         sharedPref = context.getSharedPreferences("YOUR_FILE_NAME", Context.MODE_PRIVATE);
         userId = sharedPref.getString(USER_ID);
        if (TextUtiils.isEmpty(userId)) { 
            throw IllegalArgumentException("User id must not be null.");
        }

    }

    private void fetchBalance() {
        Response.Listener<String> responseListener = new Response.Listener<String>(){
                    @Override
                    public void onResponse(String response) {
                        try{
                            balanceResponseReceived(response);
 
                        }catch (Exception e){
                            e.printStackTrace();
                           // TODO : 에러처리. eg. 에러메세지를 사용자에게 보여 줌.
                        }
                    }
                };

                
                BalanceRequest balanceRequest = new BalanceRequest(getUserId() , responseListener);
                RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
                queue.add(balanceRequest);
            
        }

      private void balanceResponseReceived(String response) {
           UserBalanceResponse balanceResponse = parseBalanceResponse(response); 
          
           if(!!balanceResponse.isSuccess()){
               Toast.makeText(this, balanceResponse.errorMessage , Toast.LENGTH_SHORT).show();
                return;
          }
  
          currentBalanceText.setText(balanceResponse.getData().getCurrentBalance());
      }

     private UserBalanceResponse parseBalanceResponse(String response) {
          JSONObject jsonResponse = new JSONObject(response);
           // TODO : 파싱 json and return UserBalanceResponse object
           return balanceResponse;
     }
    

      private void chargeBalance() {
                final String startMoney = startMoenyText.getText().toString();
 
                insertToDatabase(startMoney);
                finish();
     }

    private void insertToDatabase(final final String initialBalance) {
        ..
    }
 
    //바깥 레이어 클릭 시 안닫히게
    public boolean onTouchEvent(MotionEvent event){
       ...
    }
}
 

대략 이런 정도로 코드로 될 거 같은데요.
님의 코드에서 제일 심각한 문제는 security 입니다. 사용자 ID, 비번은 로그인시에만 딱 한번 노출되도록 해야 하구요, 그 다음에는 최소한 암호화를 하거나 엑세스 토큰이란 걸 통해서 접근해야 합니다. 그리고 비번은 로컬 디바이스에 저장하면 안됩니다. 꼭 저장해야 암호화를 해서 안드로이드 키스토어에 저장해야 합니다. 지금과 같은 코드는 챨스프록시같은 툴로 사용자 정보가 쉽게 해킹이 가능합니다. https는 최소한의 방어장치입니다. 안그러면, 저 같은 개발자도 그냥 어떤 데이터가 왔다갔다하는지 다 확인할 수 있어요. 그리고 사용자 비번은 잔액조회나 충전시에는 필요하지 않아야 합니다. 

사용자 ID는 앱에서 전역적으로 사용해야 하기 때문에 메모리, 파일, 또는 db같은 곳에 암호화 해서 저장해서 사용하는 것이 낫습니다. 

사용자 밸런스 조회하는 API는 별도로 만드셔야 합니다. 로그인과는 다른 별개의 서비스가 되어야 합니다. 사용자 ID를 받거나 토큰이 있다면 헤더에 토큰을 받아서 처리하시면 되겠죠. 로그인 API를 만드셨다면 이것도 쉽게 만드실 것 같네요.

그리고 서버 쪽 작업이 힘드시다면, 파이어베이스같은 옵션을 생각해 보시는 것도 한가지 대안이 될 수 있을 것 같네요.

 

spark (28,260 포인트) 님이 2020년 11월 26일 답변
helpme님이 2020년 11월 26일 채택됨
...