package com.renren.api.connect.android.pay.util; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; import java.util.concurrent.Executor; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.os.Bundle; import android.util.Log; import com.renren.api.connect.android.RequestListener; import com.renren.api.connect.android.Util; import com.renren.api.connect.android.exception.RenrenError; import com.renren.api.connect.android.pay.bean.AppState; /** * 工具类 定义url等常量 提供拼装请求参数、解析参数方法 * */ public final class PayUtil { /** url 相关 **/ public static String PAY_SUBMIT_ORDER_URL = "https://graph.renren.com/spay/android/submitOrder"; public static String PAY_4TEST_URL = "https://graph.renren.com/spay/android/test/submitOrder"; public static String PAY_FIXORDER_URL = "https://graph.renren.com/spay/android/fixOrder"; public static String PAY_FIXORDER_4TEST_URL = "https://graph.renren.com/spay/android/test/fixOrder"; public static String PAY_CHECK_APP_URL = "https://graph.renren.com/spay/appStatus"; /** 服务端重定向的url前缀 **/ public static String PAY_URL_PREFIX = "rrpay://"; public static String PAY_ERROR_URL_PREFIX = "rrpay://error"; public static String PAY_SUC_URL_PREFIX = "rrpay://success"; public static String PAY_FIXORDER_ERROR_URL_PREFIX = "rrpay://repairerror"; public static String PAY_FIXORDER_SUC_URL_PREFIX = "rrpay://repairsuccess"; /** DB 相关 **/ /** * 生成组装支付订单的信息 发送post请求时使用 */ public static String generateOrderDatas(String appId, String appSecert, String accessToken, String orderNumber, int amount, String desc, String payment) { Bundle params = new Bundle(); String timeString = String.valueOf(new Date().getTime()); params.putString("app_id", appId); params.putString("access_token", accessToken); params.putString("order_number", orderNumber); params.putString("descr", desc); params.putString("payment", payment); params.putString("amount", String.valueOf(amount)); params.putString("app_encode", getAppCode(appId, orderNumber, appSecert, timeString)); params.putString("submitTime", timeString); return Util.encodeUrl(params); } /** * 生成组装修复订单的数据 * * @param bid * @param appId * @param orderNumber * @param amount * @param fixEncode * @return */ public static String generateRepairDatas(String bid, String appId, String orderNumber, int amount, String appSecret, String accessToken, long userId, long orderTime) { Bundle params = new Bundle(); params.putString("amount", String.valueOf(amount)); params.putString("bid", bid); params.putString("access_token", accessToken); params.putString("app_id", appId); params.putString("user_id", String.valueOf(userId)); params.putString("order_number", orderNumber); params.putString("fix_time", String.valueOf(orderTime)); params.putString( "fix_encode", getRepairFixCode(userId, appId, orderNumber, amount, appSecret, orderTime)); return Util.encodeUrl(params); } public static String getRepairFixCode(long userId, String appId, String orderNumber, int amount, String appSecret, long time) { return Util.md5("" + userId + appId + orderNumber + amount + time + appSecret + ""); } /** * 返回调用pay服务器的验证字段 * * @param appId * @param appSecert * @param time * @return */ public static String getAppCode(String appId, String orderNumber, String appSecert, String time) { return Util.md5("" + appId + orderNumber + time + appSecert + ""); } /** * 解析服务器返回的app状态 * * @param responseJSON * @return */ public static AppState parseAppState(String responseJSON) { try { JSONObject json = new JSONObject(responseJSON); JSONArray errorCode = json.getJSONArray("payStatusCodes"); Log.e("fff", String.valueOf(errorCode)); if (errorCode != null && !errorCode.isNull(0)) return new AppState(errorCode.getInt(0)); else return new AppState(AppState.UNKNOWN); } catch (JSONException e) { return new AppState(AppState.UNKNOWN); } } public static Bundle parseUrl(String url) { url = url.replace(PayUtil.PAY_URL_PREFIX, "http://"); url = url.replace("#", "?"); try { URL u = new URL(url); Bundle b = Util.decodeUrl(u.getQuery()); b.putAll(Util.decodeUrl(u.getRef())); return b; } catch (MalformedURLException e) { return new Bundle(); } } /** * 将url中的错误信息 转换为pay Error * * @param url */ public static RenrenError parsePayError(String url) { Bundle b = parseUrl(url); RenrenError eb = null; if (b.containsKey("error")) { eb = new RenrenError(Integer.parseInt(b.getString("error")), b.getString("description"), url); } return eb; } /** * 异步请求服务器 * * @param parameters * @param listener * @param requestUri */ public static void request(final Executor pool, final Bundle parameters, final String requestUri, final RequestListener l) { pool.execute(new Runnable() { @Override public void run() { try { String resp = Util.openUrl(requestUri, "POST", parameters); RenrenError rrError = parsePayError(resp); if (rrError != null) { l.onRenrenError(rrError); } else { l.onComplete(resp); } } catch (Throwable e) { l.onFault(e); } } }); } }