Android支付——支付宝支付

相比之前的支付宝sdk,新版的sdk不再判断App客户端是否安装了支付宝客户端。如果用户安装了支付宝,将跳到支付宝客户端支付;如果用户没有安装支付宝客户端,将跳到 sdk中的H5PayActivity 中进行支付。xml中需要对这个H5Pay进行声明。
下文为对支付宝demo的使用整理。。


<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />

有的demo中自己搞了一个H5PayActivity,完全没必要,只会误导。。。

一、支付流程

  1. 拼装支付宝认同的订单信息--orderInfo
  2. 对订单做RSA 签名---sign
  3. 对签名后的订单信息做URL编码---sign
  4. 拼装完整的订单信息,即orderInfo+sign+签名方式(固定)
  5. 进行支付(异步任务)

二、支付前准备

  1. PARTNER 商户PID
  2. SELLER 商户收款方账号
  3. RSA_PRIVATE 商户私钥,pkcs8 格式
  4. alipay_notify 支付宝异步通知地址,同自家服务端商量
  5. 支付宝sdk

三、开始支付

  • 拼装订单信息orderInfo
    //s为商品的价格,单位为元!!!!
    String orderInfo = getOrderInfo("商品名", "商品描述", “商品价格,s);

    /**
    * create the order info. 创建订单信息
    */
    private String getOrderInfo(String subject, String body, String price) {
    // 签约合作者身份ID
    String orderInfo = "partner=" + "\"" + Constans.PARTNER + "\"";
    // 签约卖家支付宝账号
    orderInfo += "&seller_id=" + "\"" + Constans.SELLER + "\"";
    // 商户网站唯一订单号---我们是由服务器返回的
    orderInfo += "&out_trade_no=" + "\"" + out_Trade + "\"";
    // 商品名称
    orderInfo += "&subject=" + "\"" + subject + "\"";
    // 商品详情
    orderInfo += "&body=" + "\"" + body + "\"";
    // 商品金额
    orderInfo += "&total_fee=" + "\"" + price + "\"";
    // 服务器异步通知页面路径
    orderInfo += "&notify_url=" + "\"" + Constans.alipay_notify + "\"";
    // 服务接口名称, 固定值
    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\"";
    return orderInfo;    }
  • 对订单信息做RSA 签名
    String sign = sign(orderInfo);

  //SignUtils为支付宝demo中的类,SignUtils中用到的Base64也是demo中的类,复制即可
  private String sign(String content) {
  return SignUtils.sign(content, Constans.RSA_PRIVATE);
  }
  • 对签名后的订单信息做URL编码
    try {
    /**
    * 仅需对sign 做URL编码
    */
    sign = URLEncoder.encode(sign, "UTF-8");}
    catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
  • 拼装支付宝认同的订单信息
    final String payInfo = orderInfo + "&sign="" + sign + ""&" + getSignType();

  /**
   * get the sign type we use. 获取签名方式
   */
   private String getSignType() {
   return "sign_type=\"RSA\"";
   }
  • 调用支付宝sdk开始支付(异步任务)
    Runnable payRunnable = new Runnable() {
    @Override
    public void run() {
    // 构造PayTask 对象
    PayTask alipay = new PayTask(RechargeActivity.this);
    // 调用支付接口,获取支付结果
    String result = alipay.pay(payInfo, true);
    Message msg = new Message();
    msg.what = SDK_PAY_FLAG;
    msg.obj = result;
    mHandler.sendMessage(msg);
    } };
    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();}

  Handler中对支付结果进行获取
  @SuppressLint("HandlerLeak")
  private Handler mHandler = new Handler() {
  @SuppressWarnings("unused")
  public void handleMessage(Message msg) {
    switch (msg.what) {
        case SDK_PAY_FLAG: {
            PayResult payResult = new PayResult((String) msg.obj);
            /**
             * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
             * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
             * docType=1) 建议商户依赖异步通知
             */
            //PayResult为demo中的类,复制
            String resultInfo = payResult.getResult();// 同步返回需要验证的信息
            String resultStatus = payResult.getResultStatus();
            // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
            if (TextUtils.equals(resultStatus, "9000")) {
                Toast.makeText(RechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); 
               finish();
            } else {
                // 判断resultStatus 为非"9000"则代表可能支付失败
                // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                if (TextUtils.equals(resultStatus, "8000")) {
                    Toast.makeText(RechargeActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "4000")) { 
                   Toast.makeText(RechargeActivity.this, "订单支付失败", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "5000")) {
                    Toast.makeText(RechargeActivity.this, "重复请求", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6001")) {
                    Toast.makeText(RechargeActivity.this, "中途取消", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6002")) { 
                   Toast.makeText(RechargeActivity.this, "网络连接出错", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "6004")) {
                    Toast.makeText(RechargeActivity.this, "支付结果未知,请查询交易记录", Toast.LENGTH_SHORT).show();
                } else if (TextUtils.equals(resultStatus, "其它")) {
                    Toast.makeText(RechargeActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
                }
            }
            break;
        }
        default:
            break;
    }
    }    ;};

到此,支付基本完成,按照官方demo配置应该都可以的!

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

推荐阅读更多精彩内容

  • 之前写了一个关于微信支付的博文,后来有人问我为什么不写上一个支付宝支付的呢。当初想的是支付宝支付比较简单,不像微信...
    2c2z0阅读 2,082评论 0 0
  • 支付宝出了新文档 现在才知道 记载一下新版与旧版区别 1 订单信息生成 旧版当中订单信息生成内容较多 签名在...
    云沐天阅读 1,770评论 0 5
  • 最近在做支付宝支付模块,集成过程中走了一些弯路。现将集成过程总结一些。 这里我直接写了一个工具类,需要的时候直接调...
    poker1face阅读 1,924评论 1 7
  • 整整一天与大海的亲密接触后,皮肤还是有些火辣辣的感觉,毕竟太阳是那么热烈的炙烤着…… 三点半集合,等到全团的人都到...
    叶落尘世阅读 262评论 0 0
  • 一时书 智库捐款一元 为白血病患者捐款两元 二时书 联络祺予,倪总都没空。有怠慢他人的种子 三时书 客户到公司,堵...
    我不叫许仲斌阅读 141评论 0 0