第三方支付之支付宝支付

前言

App开发中用到的支付有支付宝、微信、银联卡、pos等,但最常见的方式就是支付宝和微信支付,尤其电商项目。闲来没事总结一下,以下是集成支付宝支付的个人心得。 
首先App添加支付宝支付功能,需要满足两点条件。

1:签约成为支付宝商户

签约地址:https://b.alipay.com/, 只有成为签约商户的开发者才能具备集成支付宝app支付的资格。 签约资料:1)营业执照 2)APP说明文档 3)商户经营信息、商户联系人等信息

2:集成APP代码

2.1:导入jar包资源

Eclipse将lib包复制到lib文件夹下,Android studio在gradle中可以添加依赖

compile files('libs/alipaySdk-20160223.jar')

2.2:修改AndroidManifest.xml清单

声明activity

<activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind" >
<activity
        android:name="com.alipay.sdk.auth.AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind" >
添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.3:根据情况添加支付宝混淆规则

2.4:添加主要代码(重要)


主要流程分为: 
1:app通过下单调用后台接口,然后后台服务器返回签名后订单信息 
2:app调起支付宝支付,传签名的订单信息,用户输入支付宝密码进行支付 
3:支付宝返回支付结果,app进行支付结果展示,支付宝服务端异步回调商户服务端即我们自己后台服务端,后台更改订单状态 
生成签名后的订单信息官方建议安全起见,在后台服务端生成,在此我在app端生成方面讲解整个流程。

//生成订单所需信息
public String getOrderInfo(String order_id,String order_sn,  String price) {
    // 签约合作者身份ID
    String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\"";
    // 签约卖家支付宝账号
    orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_SELLER + "\"";
    // 商户网站唯一订单号
    orderInfo += "&out_trade_no=" + "\"" + order_id+"-"+getTimeByCalendar()+ "\"";
    // 商品名称
    orderInfo += "&subject=" + "\"" + order_sn + "\"";
    // 商品详情
    orderInfo += "&body=" + "\"" + order_id + "\"";
    // 商品金额
    orderInfo += "&total_fee=" + "\"" + price + "\"";
    // 服务器异步通知页面路径
    orderInfo += "¬ify_url=" + "\"" + payUrlBean.getAlipay_order_pay_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\"";
    // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
    // orderInfo += "&paymethod=\"expressGateway\"";
    return orderInfo;
}

// 对订单信息做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();

然后app需要调起支付宝上传订单信息

Runnable payRunnable = new Runnable() {
        @Override
        public void run() {
            // 构造PayTask 对象
            PayTask alipay = new PayTask(OrderConfirmActivity.this);
            boolean exist = alipay.checkAccountIfExist();
            // 调用支付接口,获取支付结果
            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();

根据支付宝返回的支付结果展示信息

 private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        case RQF_PAY:
            //支付成功
            break;
        case RQF_LOGIN: 
            //支付失败
            break;
        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(OrderConfirmActivity.this, "支付成功",
                    Toast.LENGTH_SHORT).show();
            //支付成功
        } else {
            // 判断resultStatus 为非“9000”则代表可能支付失败
            // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
            if (TextUtils.equals(resultStatus, "8000")) {
                Toast.makeText(OrderConfirmActivity.this, "支付结果确认中",
                        Toast.LENGTH_SHORT).show();
            } else {
                // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                Toast.makeText(OrderConfirmActivity.this, "支付失败",
                        Toast.LENGTH_SHORT).show();
            }
        }
        break;  
        default:
            break;
        }
    };
};


这就是整个支付流程,最后附上支付宝官网文档及demo

https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.7WO30X&treeId=59&articleId=103658&docType=1



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值