programing2016. 2. 18. 13:06

브레인트리 (https://www.braintreepayments.com/)

페이팔이 인수한 회사로 페이팔SDK보다 안드로이드 개발자가 쓰기편리하다. 커스트마이징도할수있고....( 이것저것 해야될게많아서 공부를 많이했다)

브레인트리사이트 접속하면 Try the sandbox라는 버튼이보인다.

가입하면 sandbox 테스트를 할수있다.

여기서 말하는 sandbox란 테스트서버를 말하며, 페이팔과 브레인트리는 LIVE환경과 SANDBOX환경을 제공한다.

가입하고 로그인하면 Dashboard가 나온다. 

Dashboard가 잘되있다 눈에보이는 버튼의 거의 모든것이 서버 구현시 라이브러리로 제공하고있다.


#브레인트리 결제 흐름도

. 샘플앱을 기준으로 앱을 실행하면 1회용 Token을 받아온다 (내서버에 getToken API를 구현하여야한다)

  그것을 가지고 DropIn을 실행하면 결제를 시도한다

. 결제를 시도하면 main view로 돌아오면서 Nonce라는 키가 생성이되서 샘플앱 메인에 보이는것을 확인할수 있다.

. 아직 결제가 완료된것은 아니며 Nonce 키로 Create a Transaction을 호출해야 결제가 완료된다.\

  (내서버에 Transaction API를 구현하여야한다)


클라이언트 구현 API 

@GET("/client_token")
void getClientToken(....)

- @POST("/nonce/transaction")
void createTransaction(....)

retrofit 라이브러리를 이용하지 않고 다른 라이브러리를 사용하고있어 braintree sample sdk에 있는 retrofit 를 쓰기위해 API를 커스트마이징 하여 사용하였다.


# 결제상태

. Authorized : Transaction 성공시 최초상태이다.
              (결제 취소시 수수료없이 환불가능하다)

Authorizion expired : 브레인트리 문서상으로 확인시 아멕스 카드는 7일후 expired, 비자, 마스터카드는 10일, 그외카드는 30일후 자동으로 expired 가 된다.

. voided : Authorized 상태에서 결제취소하면 이상태가된다.

. Submitted for settlement : 카드사에 결제 승인을 요청한상태이다.

. Settled : 카드사 결제 승인이 완료된상태이다.
            (결제 취소시 수수료가 발생한다.)

 . 등 여러상태가더있지만 이것 까지만 알아도 충분할듯하다..


※ 환불

. 환불은 두종류가있다. void, refund

. void는 수수료를 물지않으며 결제정보가 카드사로 넘어가지 않은상태에서 호출하는 api이다. (Authorized 상태에서 호출하는 API이다)

. refund는 수수료를 물어야한다. 카드사로 결제정보가 넘어갔다( Settled에서는 refund API를 호출해야한다.)

이두가지 API는 모두 서버에서 구현해야한다. 지금은 이런것만 있다고 알아두고...

서버 구현사항은 다음에 시간날때 포스팅 해야겠군.. 점심시간이 끝났다...


Posted by 부르마
programing2012. 11. 23. 17:46
SMS
 
private void SendSMS(String phonenumber, String message) {
		SmsManager smsManager = SmsManager.getDefault();
		String sendTo = phonenumber;
		String myMessage = message;
		smsManager.sendTextMessage(sendTo, null, myMessage, null, null);
		Toast.makeText(SMSSender.this, "전송되었습니다.", Toast.LENGTH_SHORT).show();
		finish();
	}
MMS
	private void SendSMS(String phonenumber, String message) {
		SmsManager smsManager = SmsManager.getDefault();
		String sendTo = phonenumber;
		ArrayList partMessage = smsManager.divideMessage(message);
		smsManager.sendMultipartTextMessage(sendTo, null, partMessage, null, null);
		Toast.makeText(SMSSender.this, "전송되었습니다.", Toast.LENGTH_SHORT).show();
		finish();
	}
SMS
플랫폼에서 제공하는SMS로 떠넘기기..
	private void SendSMS(String phonenumber, String message) {
		Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + phonenumber));
		intent.putExtra("sms_body", message);
		startActivity(intent);
		finish();
	}

마지막에 플랫폼에서 제공하는걸로하니까 겔럭시 시리즈에서 전화번호를 못넘기는 현상이있다...
테스트해본폰은 겔럭시U,겔럭시S2 HD, 겔럭시3.... 겔럭시S2 HD에서는 전화번호를 못넘기는현상이있었다...

Posted by 부르마
programing2012. 11. 23. 17:28
로딩화면 그냥 보여주는건 누구나할수있는데 내가 원하는타이밍에 마춰하는건 쉽지 않습니다.? 나한테만 어려울수도...
아래 참고하면 도움이 될수있습니다.

호출부 인자값은 정해주기 나름이며 처리부 protected Void doInBackground(String... urls)
urls에 하나씩 매칭이됩니다. urls[0],urls[1]....이런식이죠...

 
//호출부...
 new PutLocation().execute("1", uniqueId, "00000");

 //서버에 값을 전송하고 정상적으로 처리될때까지 로딩화면을 보여준다.
 //정상적으로 처리가안될경우에 response값을 비교하여 에러처리를 한다.
 //처리부...
 protected class PutLocation extends AsyncTask {  //이거 이상하네요.. 알아서..들....
  private String Error = null;
  private Dialog Dialog = new Dialog(Location.this, R.style.ProgressDialog);
  HttpResponse response;
  
  // - 결과값 받기전까지 보여줄 메시지
  protected void onPreExecute() {
   Dialog.setContentView(R.layout.progressbar);
   Dialog.show(); // 로딩 시작
  }

  // - 결과값 받기
  protected Void doInBackground(String... urls) {
   StringBuffer buffer = new StringBuffer();
   try {
    buffer.append("platformId").append("=").append(urls[0]).append("&");
    buffer.append("uniqueId").append("=").append(urls[1]).append("&");
    buffer.append("locationId").append("=").append(urls[2]);
    HttpGet get = new HttpGet("URL");

    HttpClient client = new DefaultHttpClient();

    response = client.execute(get);

   } catch (ClientProtocolException e) {
    Error = "ClientProtocolException";
    cancel(true);
   } catch (IOException e) {
    Error = "IOException";
    cancel(true);
   } catch (Exception e) {
    Error = "Exception";
    cancel(true);
   }

   //return을 처리하면 onPostExecute에서 return값을 받아 결과값을 처리할수있다.
   return null;
  }

  // 결과값 처리
  protected void onPostExecute(Void unused) {
   Dialog.dismiss(); // 로딩종료
  }
 }
Posted by 부르마
programing2012. 10. 4. 13:34

오랜만에 끄적이네요...

아는형님이 YTN뉴스에 나오셨다고 원본동영상이없어서 주소갈쳐주고 동영상 다운받거나 링크주소좀 갈쳐달라고해서

구글링 해보니 있더군요...

http://jinmoda.tistory.com/545 대부분 같지만..지금은  다운로드는 받아지지않고...

미디어플레이어재생되도록 되어있네요.... ( 다운로드 받아진다면 댓글달아주세요...^^; )

 

 

loadWMP.js
function _loadWMP2(url1,url2,url3,url4,mov,width_val,height_val,id)
{
	if(url1=="general")
	{
		var http = "mms://nvod1.ytn.co.kr/";
	}
	else if(url1=="special" && url3=="sudden")
	{
		var http = "mms://dvod1.ytn.co.kr/";
	}
	else if(url1=="special" && url3!="sudden")
	{
		var http = "mms://svod1.ytn.co.kr/";
	}
	else if(url1=="etc")
	{
		var http = "mms://svod1.ytn.co.kr/";
	}

진한부분이 원본 주소입니다.

이제 YTN주소의 소스보기에서...

 








부분을 mms://nvod1.ytn.co.kr/뒤에 "/" 하나씩붙여가면서 적어주시면됩니다.

VodFileName5=""; 여기가 비어있는데 파일명이 와야하므로 밑에 17줄을 보시면 해당 파일명이 나옵니다. "201210021234412242_s.wmv"

그래서 다 합치면.... mms://nvod1.ytn.co.kr/sciencetv/mov/vod0177/2012/201210021234412242_s.wmv

loadWMP.js 파일은 해당뉴스의 소스보기에서나옵니다. 위에 소스에나오고..

원본링크에서 확인하실수있습니다.

http://jinmoda.tistory.com/545

Posted by 부르마
programing2012. 8. 14. 17:36

TestListActivity.java

TestListAdapter mCustomAdapter;

mCustomAdapter = new TestListAdapter(TestNews.this, lDataList, R.layout.test_datalist, from, to);
mLv_TestList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mLv_TestList.setAdapter(mCustomAdapter);

TestListAdapter.java

public class TestListAdapter extends SimpleAdapter {

	private List<Map<String, String>> mArrayList;
	private int mResource; // Layout ID
	private Context mContext;
	ViewHolder holder;
	ArrayList<Boolean> array;

	public TestListAdapter(Context context, List<Map<String, String>> lDataListFix, int resource, String[] from, int[] to) {
		super(context, lDataListFix, resource, from, to);
		mArrayList = lDataListFix;
		mResource = resource;
		mContext = context;

	}

	@Override
	public int getCount() {
		return mArrayList.size();
	}

	@Override
	public Object getItem(int position) {
		return mArrayList.get(position).get("msg") + "<" + mArrayList.get(position).get("date") + ">";
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			convertView = vi.inflate(mResource, null);

			holder = new ViewHolder();
			holder.msg = (TextView) convertView.findViewById(R.id.msg);
			holder.date = (TextView) convertView.findViewById(R.id.date);
			holder.cb_checkbox = (CheckBox) convertView.findViewById(R.id.cb_checkbox);
			convertView.setTag(holder);
		} else
			holder = (ViewHolder) convertView.getTag();

		Map<String, String> iItem = mArrayList.get(position);

		holder.tv_Msg.setText(iItem.get("msg"));
		holder.tv_CreateDate.setText(iItem.get("date"));
		holder.cb_checkbox.setChecked(false);

		holder.cb_checkbox.setChecked(((ListView)parent).isItemChecked(position));
		return convertView;
	}

}

class ViewHolder {
	TextView msg;
	TextView date;
	CheckBox cb_checkbox;
}


여기까지 별반 다르지 않았다. 체크박스 까지는 무난하게 만들지만 리스트가 늘어나면 문제가 생겼다.
체크하지 않았는데도 체크가되거나 스크롤 내리면 체크한 리스트에서 체크가 해제되어 보여졌다.
실제로는 체크가되어있었다.
인터넷에 많이 찾아봤지만 명쾌한 답이잘 없다. 결국 해결한건
holder.cb_checkbox.setChecked(((ListView)parent).isItemChecked(position));
한줄이다.

 TestListActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:textColor="@color/black"
            android:textSize="17dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:textColor="@color/text3" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/cb_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp" 
        android:focusable="false"
        android:clickable="false"/>

</LinearLayout>
Posted by 부르마
programing2012. 8. 11. 20:50

 

InstallHeader.exe

C언어 공부할때 유용한헤더파일이죠!

Torboc.h파일 인스톨러입니다. 비쥬얼스튜디오가 설치된상태에서  인스톨러 실행시에 컴파일러의 Include디렉토리에
복사됩니다.

아래는 인스톨러 실행시 나타나는 팝업창입니다.

유용하게 사용하세요~

Posted by 부르마
programing2012. 8. 9. 17:32

일반적으로 커스트마이징 해서 글자색 변경하는 방법은 예제도 많고 쉽게 하고있다.

헌데.. ArrayAdapter를 써서 기본적으로 책에 나와있는 리스트를 만들면

기본적으로는 글자색 변경 폰트사이즈변경이 쉽지 않다..

모르는사람들을 위해서 삽질 좀덜하고자해서 쓴거니 필요없는사람은 백스페이스 다다다....

쉽게 하는방법 :

     mAdapter = new ArrayAdapter<String>(this,R.layout.simple_list_item_single_choice, titles);
     list = (ListView) findViewById(R.id.list);
     list.setAdapter(mAdapter);
     list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
     list.setOnItemClickListener(mItemClickListener);


▶  빨간색부분... 원래 코드는 android.R.layout.simple_list_item_single_choice 이다.

안드로이드 sdk 설치된 폴더에보면 simple_list_item_single_choice.xml 파일이있다 (다른 리스트도 동일하다.)

이 파일을 복사해서 내 프로젝트 layout폴더에 넣어준다.

그다음 R.layout.simple_list_item_single_choice android만빼고 이름만 바꿔 주었다-_-;;

복사한 simple_list_item_single_choice.xml 열어서 하고싶은 글자색 폰트사이즈 수정한다..

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:checkMark="?android:attr/listChoiceIndicatorSingle"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:paddingRight="6dip"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="#000000"
    android:textSize="16dp"
/>

내가 원하는 흰바탕의 리스트에 검은색 글씨를 만들었다..

xml파일에는 CheckedTextView로 만들어져있네.. 이거 잘활용하면 커스트마이징안하고 다른것들도 많이 만들어볼수있을듯..

 

Posted by 부르마