调用支付宝支付的工具类
2016-02-16 09:27
323 查看
/** * Created by chenxin on 2016/1/29. */ public class PayUtils { // 商户PID public static final String PARTNER = "000000000000000"; // 商户收款账号 public static final String SELLER = "xx@qq.com"; // 商户私钥,pkcs8格式 public static final String RSA_PRIVATE = ""; // 支付宝公钥 public static final String RSA_PUBLIC = "B"; private static final int SDK_PAY_FLAG = 1; private static final int SDK_CHECK_FLAG = 2; private static final String TAG = "支付宝支付"; /** * 外面传过来的 */ private static Activity activity; public interface AlipayResult { void Success(String string); void FailIng(String string); void payIng(String string); void alipayCheck(String string); } public static AlipayResult alipayResult; /** * 检查支付是否安装 */ private static boolean CheckAlipayIsInstall() { // 构造PayTask 对象 PayTask payTask = new PayTask(activity); // 调用查询接口,获取查询结果 boolean isExist = payTask.checkAccountIfExist(); Logger.e("检查支付宝",isExist+""); return isExist; } /** * 支付 * * @return */ public static void PayMoney(final Activity context, AliPayEntity entity, AlipayResult result) { alipayResult = result; try { // //检查支付是否安装 // if (CheckAlipayIsInstall() == false) { // alipayResult.alipayCheck("支付宝未安装!"); // return; // } //检查支付是否有数据 if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER) || entity == null) { //alipayResult.FailIng("支付信息不完整"); return; } // 订单 String orderInfo = getOrderInfo(entity.getPayName(), entity.getPayMark(), entity.getPayMoney(), entity.getOrderNo(),entity.getNotify_url()); // 对订单做RSA 签名 String sign = sign(orderInfo); try { // 仅需对sign 做URL编码 sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { alipayResult.FailIng("支付URL编码错误!"); } // 完整的符合支付宝参数规范的订单信息 final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(context); // 调用支付接口,获取支付结果 String result = alipay.pay(payInfo); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); } catch (Exception e) { Logger.e("支付信息异常:", e.getMessage()); return; } } private static Handler mHandler = new Handler() { public void handleMessage(Message msg) { try { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((String) msg.obj); // 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签 String resultInfo = payResult.getResult(); String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档 if (TextUtils.equals(resultStatus, "9000")) { // Toast.makeText(activity, "支付成功", // Toast.LENGTH_SHORT).show(); Logger.e(TAG, "支付成功" + resultStatus); alipayResult.Success("支付成功"); } else { // 判断resultStatus 为非“9000”则代表可能支付失败 // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { // Toast.makeText(activity, "支付结果确认中", // Toast.LENGTH_SHORT).show(); Logger.e(TAG, "结果确认中" + resultStatus); alipayResult.payIng("支付结果确认中"); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 // Toast.makeText(activity, "支付失败", // Toast.LENGTH_SHORT).show(); Logger.e(TAG, "支付失败" + resultStatus); alipayResult.FailIng("支付订单支付失败"); } } break; } default: break; } } catch (Exception e) { Logger.e(TAG, e.getMessage()); alipayResult.FailIng("支付宝返回结果处理失败"); } } ; }; /** * get the sign type we use. 获取签名方式 */ private static String getSignType() { return "sign_type=\"RSA\""; } /** * sign the order info. 对订单信息进行签名 * * @param content 待签名订单信息 */ private static String sign(String content) { return SignUtils.sign(content, RSA_PRIVATE); } /** * create the order info. 创建订单信息 * @param subject 商品名称 * @param body 商品详情 * @param price 商品价格 * @param orderNo 订单号 * @param notify_url 服务器异步回调地址 * @return */ private static String getOrderInfo(String subject, String body, String price, String orderNo,String notify_url) { // 签约合作者身份ID String orderInfo = "partner=" + "\"" + PARTNER + "\""; // 签约卖家支付宝账号 orderInfo += "&seller_id=" + "\"" + SELLER + "\""; // 商户网站唯一订单号 orderInfo += "&out_trade_no=" + "\"" + orderNo + "\""; // 商品名称 orderInfo += "&subject=" + "\"" + subject + "\""; // 商品详情 orderInfo += "&body=" + "\"" + body + "\""; // 商品金额 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服务器异步通知页面路径 orderInfo += "¬ify_url=" + "\"" + notify_url + "\""; // 服务接口名称, 固定值 orderInfo += "&service=\"mobile.securitypay.pay\""; // 支付类型, 固定值 orderInfo += "&payment_type=\"1\""; // 参数编码, 固定值 orderInfo += "&_input_charset=\"utf-8\""; // 设置未付款交易的超时时间 // 默认30分钟,一旦超时,该笔交易就会自动被关闭。 // 取值范围:1m~15d。 // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。 // 该参数数值不接受小数点,如1.5h,可转换为90m。 orderInfo += "&it_b_pay=\"90m\""; // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付 // orderInfo += "&extern_token=" + "\"" + extern_token + "\""; // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空 orderInfo += "&return_url=\"m.alipay.com\""; // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用) // orderInfo += "&paymethod=\"expressGateway\""; return orderInfo; } }
外部调用方式
//调起支付宝 AliPayEntity entity = new AliPayEntity(); entity.setOrderNo(OrderNo); entity.setPayMark(""); entity.setPayName(""); entity.setPayMoney(OrderPrice); entity.setNotify_url(SysConfig.ALIPAY_NOTIFY_URL); PayUtils.PayMoney(PayActivity.this, entity, new PayUtils.AlipayResult() { @Override public void Success(String string) { Logger.e("支付结果:", string); //如果支付成功,跳转到支付成功页面 Bundle bundle = new Bundle(); bundle.putString("OrderID",OrderNo); MyApp.startActivity(PayActivity.this, OrderDetailActivity.class, bundle); } @Override public void FailIng(String string) { Logger.e("支付结果:", string); MyApp.showToast("支付失败!"); } @Override public void payIng(String string) { Logger.e("支付结果:", string); MyApp.showToast("支付结果确认中,请稍后查看"); } @Override public void alipayCheck(String string) { Logger.e("支付宝安装检查", string); MyApp.showToast(string); } });
亲测没问题
相关文章推荐
- C# 静态类与非静态类、静态成员的区别
- 数组Api .map()的使用
- 背景图片-密度屏幕(移动端)
- PopupWindow被软键盘顶上去后的恢复
- android布局属性详解
- POJ 1703 Find them, Catch them
- MapReduce实例浅析
- 以前写的比较实用的mysql代码[1]
- 数字自动增长
- VS2013失去智能提示如何恢复
- linux进程的后台运行、查看、关闭等命令
- Emmet:HTML/CSS代码快速编写神器
- 双面打印区别
- MapReduce经典案例分享
- poj 2398 Toy Storage(叉积判断点是否在四边形内)
- latex的数学符号式子(自用
- XML总结
- 自己实现 一个MapReduce 示例
- 过完年电脑上的证书都失效了
- Sipdroid源码初探(二):监听来电,通话建立流程