Android 支付宝支付

支付宝
详细网址:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.wuedgv&treeId=204&articleId=105296&docType=1
步骤:
导包,修改Manifest,添加混淆规则,

  • @desc:支付宝支付
public class AliPay {
private static AliPay instance;
public static AliPay getInstance() {
    if (instance == null) {
        instance = new AliPay();
    }
    return instance;
}

/**
 * 
 * 调用SDK支付
 * @param apiHandler
 * @param subject
 *            商品名称
 * @param body
 *            商品描述
 * @param orderno
 *            商户订单号
 * @param price
 * @return void 返回类型
 */
public void pay(final Context context, final Handler apiHandler,
        String orderno, String subject, String body, double price,String notifyUrl) {
    // 订单
    //      price=0.01;
    String orderInfo = getOrderInfo(subject, body, orderno,
            String.valueOf(price),notifyUrl);

//      String orderInfo = getOrderInfo(subject, body, orderno,
//              String.valueOf(price));

    // 对订单做RSA 签名
    String sign = sign(orderInfo);
    try {
        // 仅需对sign 做URL编码
        sign = URLEncoder.encode(sign, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    // 完整的符合支付宝参数规范的订单信息
    final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
            + getSignType();

    Runnable payRunnable = new Runnable() {

        @Override
        public void run() {
            // 构造PayTask 对象
            PayTask alipay = new PayTask((Activity) context);
            // 调用支付接口,获取支付结果
            String result = alipay.pay(payInfo);

            Message msg = new Message();
            msg.what = UtilConstants.SDK_PAY_FLAG;
            msg.obj = result;
            apiHandler.sendMessage(msg);
        }
    };

    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();
}

/**
 * check whether the device has authentication alipay account.
 * 查询终端设备是否存在支付宝认证账户
 * 
 */
public void check(final Context context, final Handler apiHandler) {
    Runnable checkRunnable = new Runnable() {

        @Override
        public void run() {
            // 构造PayTask 对象
            PayTask payTask = new PayTask((Activity) context);
            // 调用查询接口,获取查询结果
            boolean isExist = payTask.checkAccountIfExist();

            Message msg = new Message();
            msg.what = UtilConstants.SDK_CHECK_FLAG;
            msg.obj = isExist;
            apiHandler.sendMessage(msg);
        }
    };

    Thread checkThread = new Thread(checkRunnable);
    checkThread.start();

}

/**
 * get the sdk version. 获取SDK版本号
 * 
 */
public void getSDKVersion(Context context) {
    PayTask payTask = new PayTask((Activity) context);
    String version = payTask.getVersion();
//  Toast.makeText(context, version, Toast.LENGTH_SHORT).show();
}

/**
 * create the order info. 创建订单信息
 * 
 */
public String getOrderInfo(String subject, String body, String orderno,
        String price,String notifyUrl) {
    // 签约合作者身份ID
    String orderInfo = "partner=" + "\"" + UtilConstants.ALI_PARTNER + "\"";

    // 签约卖家支付宝账号
    orderInfo += "&seller_id=" + "\"" + UtilConstants.ALI_SELLER + "\"";

    // 商户网站唯一订单号
    orderInfo += "&out_trade_no=" + "\"" + orderno + "\"";
    //  orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";
    // 商品名称
  orderInfo += "&subject=" + "\"" + subject + "\"";
    // 商品详情
     orderInfo += "&body=" + "\"" + body + "\"";
    // 商品金额
    orderInfo += "&total_fee=" + "\"" + price + "\"";
    
    //"http://notify.msp.hk/notify.htm"
    // 服务器异步通知页面路径
    orderInfo += "&notify_url=" + "\"" +notifyUrl
            + "\"";

    // 服务接口名称, 固定值
    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=\"30m\"";

    // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
    // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

    // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
    orderInfo += "&return_url=\"m.alipay.com\"";

    // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
    // orderInfo += "&paymethod=\"expressGateway\"";

    return orderInfo;
}

/**
 * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
 * 
 */
public String getOutTradeNo() {
    SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
            Locale.getDefault());
    Date date = new Date();
    String key = format.format(date);

    Random r = new Random();
    key = key + r.nextInt();
    key = key.substring(0, 15);
    return key;
}

/**
 * 
 * 对订单信息进行签名
 * 
 * @param content
 * @return
 * @return String 返回类型
 */
public String sign(String content) {
    return SignUtils.sign(content, UtilConstants.ALI_RSA_PRIVATE);
}

/**
 * get the sign type we use. 获取签名方式
 * 
 */
public String getSignType() {
    return "sign_type=\"RSA\"";
}
}

同步返回
商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。

 private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        Result result = new Result((String) msg.obj);
        Toast.makeText(DemoActivity.this, result.getResult(),
                    Toast.LENGTH_LONG).show();
    };
};

DEMO 核心代码如下

/**
 * 付款回调handler
 */
protected Handler payHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    payHandler=new PayHandler(this);
}
 

/**
 * 
* 付款

* @param type
* @param orderno
* @param productname
* @param price  
* @return void    返回类型
 */
public void pay(int type,String orderno,String productname,double price){
    if(type==Consts.EVENT_PAY_TYPE_ALI){
        AliPay.getInstance().pay(context, payHandler, orderno,productname,productname, price,HttpConstants.EVENT_ALI_NOTIFY_URL);
    } 
}




private static class PayHandler extends Handler {
    //第二步,将需要引用Activity的地方,改成弱引用。
    private WeakReference<PayBaseActivity> atyInstance;
    public PayHandler(PayBaseActivity aty) {
      this.atyInstance = new WeakReference<PayBaseActivity>(aty);
    }
    @Override
    public void handleMessage(Message msg) {
        PayBaseActivity aty = atyInstance == null ? null : atyInstance.get();
         //如果Activity被释放回收了,则不处理这些消息
         if (aty == null||aty.isFinishing()) {
           return;
         }
        switch (msg.what) {
        case UtilConstants.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")) {
            // do something goto
            } else {
                // 判断resultStatus 为非“9000”则代表可能支付失败
                // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                if (TextUtils.equals(resultStatus, "8000")) {
                    Toast.makeText(aty, "支付结果确认中",
                            Toast.LENGTH_SHORT).show();
                } else {
                    // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                    Toast.makeText(aty, "支付失败",
                            Toast.LENGTH_SHORT).show();
                }
            }
            break;
        }
        case UtilConstants.SDK_CHECK_FLAG: {
            Toast.makeText(aty, "检查结果为:" + msg.obj,
                    Toast.LENGTH_SHORT).show();
            break;
        }
     
        default:
            break;
        }
    }
 }
@Override
protected void onDestroy() {
 
    if(payHandler!=null){
        payHandler.removeCallbacksAndMessages(null);
        payHandler=null;
    }
    super.onDestroy();

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容