package my.project.easyrecharge.activity;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import my.project.easyrecharge.F;
import my.project.easyrecharge.R;
import my.project.easyrecharge.alipay.Keys;
import my.project.easyrecharge.alipay.Result;
import my.project.easyrecharge.alipay.Rsa;
import my.project.easyrecharge.contants.Key;
import my.project.easyrecharge.model.Order;
import my.project.easyrecharge.model.OrderWithBind;
import my.project.easyrecharge.model.OrderWithoutBind;
import my.project.easyrecharge.util.L;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.alipay.android.app.sdk.AliPay;
/**
* Recharge Page
*
* @author roy
* @email onecoders@gmail.com
*
* @notice Keys中的值不固定,根据用户选择的学校,先从服务器端获取,后去执行支付操作
* @TODO 充值前,先去服务器验证,输入房间号是否存在,存在,则进行充值
*/
public class ActRecharge extends ActBasicInfo implements
OnCheckedChangeListener {
private static final int RQF_PAY = 1;
private RelativeLayout priceContainer;
private TextView priceTextView, noticeTextView, unitPrice;
private CheckBox noticeCheckbox;
private Button btnRecharge;
private String price;
private int checkedItem;
private String[] priceList;
private int[] priceArr = new int[] { 5, 10, 20, 30, 50, 100 };
private Order order;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_recharge);
init();
}
private void init() {
initActionBar();
initViews();
}
@Override
protected void initAbContent() {
setAbTitle(R.string.activity_title_recharge);
showAbRightBtn();
setAbRightBtnText(R.string.txt_inquiry);
setAbRightBtnClickListener(this);
}
private void initViews() {
// basic info
View basicInfoView = findViewById(R.id.recharge_basic_info);
initBasicInfoViews(basicInfoView);
}
@Override
protected void findExtraView() {
// unit price
unitPrice = (TextView) findViewById(R.id.unit_price);
// price
priceContainer = (RelativeLayout) findViewById(R.id.price_container);
priceTextView = (TextView) findViewById(R.id.price_textview);
// checkbox
noticeCheckbox = (CheckBox) findViewById(R.id.notice_checkbox);
// notice
noticeTextView = (TextView) findViewById(R.id.notice_textview);
// recharge button
btnRecharge = (Button) findViewById(R.id.btn_recharge);
// price string array
priceList = getResources().getStringArray(R.array.recharge_price_list);
}
@Override
protected void setExtraListener() {
noticeCheckbox.setOnCheckedChangeListener(this);
noticeTextView.setOnClickListener(this);
priceContainer.setOnClickListener(this);
priceTextView.addTextChangedListener(this);
btnRecharge.setOnClickListener(this);
}
@Override
public void onClick(View v) {
super.onClick(v);
switch (v.getId()) {
case R.id.ab_right_btn:
switchActivityReorder2Front(ActInquiry.class);
break;
case R.id.price_container:
showPriceChooseDialog();
break;
case R.id.notice_textview:
switchActivity(ActNotice.class, null);
break;
case R.id.btn_recharge:
doRecharge();
break;
default:
break;
}
}
private void showPriceChooseDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.choose_price);
builder.setSingleChoiceItems(priceList, checkedItem,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
checkedItem = which;
setText(priceTextView, priceList[which]);
dialog.dismiss();
}
});
builder.create().show();
}
private void doRecharge() {
initOrder();
go2Pay();// must check first
}
private void initOrder() {
if (F.isBind()) {
order = new OrderWithBind(F.mBindInfo);
} else {
order = new OrderWithoutBind(school, apart, roomNum);
}
order.setPrice(priceArr[checkedItem]);
}
private void go2Pay() {
checkAvailable();
}
@Override
protected void doAfterCheckOK(String content) {
doPay();
}
private void doPay() {
try {
String info = getNewOrderInfo();
String sign = Rsa.sign(info, Keys.PRIVATE);
sign = URLEncoder.encode(sign);
info += "&sign=\"" + sign + "\"&" + getSignType();
L.i(F.TAG, "start pay");
// start the pay.
L.i(F.TAG, "info = " + info);
final String orderInfo = info;
new Thread() {
public void run() {
AliPay alipay = new AliPay(ActRecharge.this, mHandler);
// 设置为沙箱模式,不设置默认为线上环境
// alipay.setSandBox(true);
String result = alipay.pay(orderInfo);
L.i(F.TAG, "result = " + result);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);
}
}.start();
} catch (Exception ex) {
ex.printStackTrace();
showToast(R.string.remote_call_failed);
}
}
private String getNewOrderInfo() {
StringBuilder sb = new StringBuilder();
sb.append("partner=\"");
sb.append(order.getPartnerId());
sb.append("\"&out_trade_no=\"");
sb.append(getOutTradeNo());
sb.append("\"&subject=\"");
sb.append(order.getSubject());
sb.append("\"&body=\"");
sb.append(order.getBody());
sb.append("\"&total_fee=\"");
sb.append(order.getPrice());
// sb.append(0.01);// for test
sb.append("\"¬ify_url=\"");
// 网址需要做URL编码
sb.append(URLEncoder.encode(F.NOTIFY_URL));
sb.append("\"&service=\"mobile.securitypay.pay");
sb.append("\"&_input_charset=\"UTF-8");
sb.append("\"&return_url=\"");
sb.append(URLEncoder.encode("http://m.alipay.com"));
sb.append("\"&payment_type=\"1");
sb.append("\"&seller_id=\"");
sb.append(order.getSellerAccount());
// 如果show_url值为空,可不传
// sb.append("\"&show_url=\"");
sb.append("\"&it_b_pay=\"1m");
sb.append("\"");
return new String(sb);
}
private String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss");
Date date = new Date();
String key = format.format(date);
java.util.Random r = new java.util.Random();
key += r.nextInt();
key = key.substring(0, 15);
L.d(F.TAG, "outTradeNo: " + key);
return key;
}
private String getSignType() {
return "sign_type=\"RSA\"";
}
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Result result = new Result((String) msg.obj);
switch (msg.what) {
case RQF_PAY:
result.parseResult();
showToast(result.getResultStatus());
boolean success = result.getRs().equals(Result.STATUS_SUCCESS);
// success = success && result.isSignOk();
if (success) {
Bundle bundle = new Bundle();
bundle.putString(Key.ORDER_JSON, toJson(order));
switchActivityAndFinish(ActResultRecharge.class, bundle);
}
break;
default:
break;
}
};
};
protected void showUnitPrice() {
String unitPriceStr = school == null ? getString(R.string.default_price_hint)
: school.getPriceStr();
unitPrice.setText(unitPriceStr);
};
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
refreshButtonStatus();
}
@Override
protected void refreshButtonStatus(boolean isBasicInfoEmpty) {
price = priceTextView.getText().toString();
boolean isUnchecked = !noticeCheckbox.isChecked();
// recharge button enabled
boolean enabled = !(isBasicInfoEmpty || isEmpty(price) || isUnchecked);
btnRecharge.setEnabled(enabled);
}
}