package com.renren.api.connect.android.pay.view;
import java.util.Date;
import android.os.Bundle;
import android.util.Log;
import com.renren.api.connect.android.Renren;
import com.renren.api.connect.android.Util;
import com.renren.api.connect.android.exception.RenrenError;
import com.renren.api.connect.android.pay.IPayListener;
import com.renren.api.connect.android.pay.IPayRepairListener;
import com.renren.api.connect.android.pay.bean.PayOrder;
import com.renren.api.connect.android.pay.util.PayStoreHelper;
import com.renren.api.connect.android.pay.util.PayUtil;
import com.renren.api.connect.android.view.RenrenDialogListener;
/**
* 负责处理webView的返回值。 解析错误或者支付成功的信息
*/
public class PayDialogListener implements RenrenDialogListener {
private PayOrder mPayOrder;
/*
* 根据Listener的类型调用不同的方法 实现的不是太好,有待优化
*/
private Object mListener;
/**
* 这里实现用Object
*
* @param payOrder
* @param listener
*/
public PayDialogListener(final PayOrder payOrder, final Object listener) {
mPayOrder = payOrder;
mListener = listener;
}
/**
* 处理错误信息
*
* @param url
* @return
*/
private void DoWithError(String url) {
Bundle value = PayUtil.parseUrl(url);
RenrenError error = new RenrenError();
if (value.containsKey("code")) {
error = new RenrenError(Integer.parseInt(value.getString("code")),
value.getString("description"), null);
}
/**
* 解析并本地存储
*/
generateAndStorePayOrder(value);
if (null != mListener)
if (mListener instanceof IPayListener) {
((IPayListener) mListener).onError(error);
} else if (mListener instanceof IPayRepairListener) {
((IPayRepairListener) mListener).onRepairError(error);
}
}
private void DoWithLocalError(String url) {
RenrenError error = new RenrenError();
Bundle value = PayUtil.parseUrl(url);
if (value.containsKey("code")) {
error = new RenrenError(RenrenError.ERROR_CODE_UNKNOWN_ERROR,
value.getString("code"), null);
}
/**
* 解析并本地存储
*/
generateAndStorePayOrder(value);
if (null != mListener)
if (mListener instanceof IPayListener) {
((IPayListener) mListener).onError(error);
} else if (mListener instanceof IPayRepairListener) {
((IPayRepairListener) mListener).onRepairError(error);
}
}
/**
* 生成并且存储订单
*
* @param value
* @return
*/
private PayOrder generateAndStorePayOrder(Bundle value) {
PayOrder order = new PayOrder(mPayOrder);
if (value.containsKey("app_id")) {
order.setAppId(value.getString("app_id"));
}
if (value.containsKey("amount")) {
order.setAmount(Integer.parseInt(value.getString("amount")));
}
if (value.containsKey("order_number")) {
order.setOrderNumber(value.getString("order_number"));
}
if (value.containsKey("orderedTime")) {
try {
order.setDealTime(new Date(Long.parseLong(value
.getString("orderedTime"))));
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
if (value.containsKey("descr")) {
order.setDescr(value.getString("descr"));
}
if (value.containsKey("payment")) {
order.setPayment(value.getString("payment"));
}
if (value.containsKey("bid")) {
order.setBid(value.getString("bid"));
}
if (value.containsKey("payResultEncode")) {
order.setPayResultEncode(value.getString("payResultEncode"));
}
if (value.containsKey("payStatusCode")) {
order.setPayStatusCode(Integer.parseInt(value
.getString("payStatusCode")));
}
if (value.containsKey("sandBox")) {
order.setSandBox(Boolean.parseBoolean(value.getString("sandBox")));
}
if (value.containsKey("serverStatus")) {
if (value.getString("serverStatus").trim().equals("订单成功")) {
order.setPayState(PayOrder.SUCCESS_STATE);
} else {
order.setPayState(PayOrder.ERROR_STATE);
}
}
PayStoreHelper.getInstance(null).addOrUpdatePay(order);
return order;
}
/**
* 处理rrpay://success的情况
*
* @param url
*/
private void DoWithComplete(String url) {
Log.e("success", url);
Bundle value = PayUtil.parseUrl(url);
PayOrder order = generateAndStorePayOrder(value);
/**
* 通知开发者OnComplete
*/
if (null != mListener)
if (mListener instanceof IPayListener) {
((IPayListener) mListener).onComplete(order);
} else if (mListener instanceof IPayRepairListener) {
((IPayRepairListener) mListener).onRepairComplete(order);
}
}
@Override
public int onPageBegin(String url) {
int retCode = RenrenDialogListener.ACTION_UNPROCCESS;
// 如果是pay://开头则认为是接受处理结果。可以返回了。
if (url != null && url.startsWith(PayUtil.PAY_URL_PREFIX)) {
Log.e("onPageBegin", url);
retCode = RenrenDialogListener.ACTION_PROCCESSED;
// 充值正确的情况
if (url.startsWith(PayUtil.PAY_SUC_URL_PREFIX)||url.startsWith(PayUtil.PAY_FIXORDER_SUC_URL_PREFIX)) {
DoWithComplete(url);
}
// 出错的情况
else if (url.startsWith(PayUtil.PAY_ERROR_URL_PREFIX)||url.startsWith(PayUtil.PAY_FIXORDER_ERROR_URL_PREFIX)) {
DoWithError(url);
} else {
Util.logger("new PayError()");
RenrenError error = new RenrenError(
RenrenError.ERROR_CODE_UNKNOWN_ERROR, "PAY_FIXORDER_ERROR_URL_PREFIX", "");
if (null != mListener)
if (mListener instanceof IPayListener) {
((IPayListener) mListener).onError(error);
} else if (mListener instanceof IPayRepairListener) {
((IPayRepairListener) mListener).onRepairError(error);
}
}
}
if (url != null && url.startsWith(Renren.DEFAULT_REDIRECT_URI)) {
Util.logger("DoWithLocalError");
DoWithLocalError(url);
}
return retCode;
}
@Override
public void onPageFinished(String url) {
}
@Override
public boolean onPageStart(String url) {
return false;
}
@Override
public void onReceivedError(int errorCode, String description,
String failingUrl) {
RenrenError error = new RenrenError(errorCode, description, failingUrl);
if (null != mListener)
if (mListener instanceof IPayListener) {
((IPayListener) mListener).onError(error);
} else if (mListener instanceof IPayRepairListener) {
((IPayRepairListener) mListener).onRepairError(error);
}
}
};