关于Android在线支付Alipay(支付宝)开发的经验分享

在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台

经过一周多的时间对这两种支付平台的研究,完成功能后将经验分享给大家,希望能帮助到有需求的朋友。

首先是支付宝的开发资料方面: 
接口申请url 
https://b.alipay.com/order/productDetail.htm?productId=2014110308141993

API开发文档 
http://download.alipay.com/public/api/base/WS_MOBILE_PAY_SDK_BASE.zip

申请流程 
注册支付宝账号??进行实名认证??提交审核资料??审核通过

备注:申请通过后会获得:合作者身份ID(PID),该ID在项目配置中需要用到

开发流程: 
第一步: 
下载API开发文档后,即可获取官方Demo,该Demo中需要将审核通过后获取的PID替换,并且输入支付宝收款账户即可。这里非常简单,就不过多叙述。 
第二步: 
官方Api开发文档中,存在一个openssl的文件夹,该文件夹主要是用于生成支付宝所需要用到的公钥以及私钥。打开该文件夹可以看到详细的生成方式,根据提示生成公钥及私钥,请注意,密钥需要经过pkcs8二次加密。 
第三步: 
将生成的公钥和私钥配置到Demo中。 
第四步(可省略): 
为了方便后期维护,建议将支付宝相关的方法及配置项抽取出来做为单独的一个类,后期需要使用直接调用即可。代码如下:

package com.alipay.pay;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;

import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;

public class Alipay {

    // 商户PID
    public static final String PARTNER = "******";
    // 商户收款账号
    public static final String SELLER = "***@alipay.com";
    // 商户私钥,pkcs8格式
    public static final String RSA_PRIVATE = "*****";
    // 支付宝公钥
    public static final String RSA_PUBLIC = "******";

    public static final int SDK_PAY_FLAG = 1;

    public static final int SDK_CHECK_FLAG = 2;

    private Handler mHandler;
    private Activity activity;
    private String orderNo;

    public Alipay(Handler handler, Activity activity) {
        mHandler = handler;
        this.activity = activity;
    }

    /** * call alipay sdk pay. 调用SDK支付 * */
    public void pay(PayInfo payinfo) {
        // 订单
        DecimalFormat df = new DecimalFormat("0.00");
        String orderInfo = getOrderInfo(payinfo.getName(), payinfo.getDesc()
                + " ", df.format(payinfo.getPrice() * payinfo.getRate()));

        // 对订单做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);
                // 调用支付接口,获取支付结果
                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();
    }

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

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

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

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

    }

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

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

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

        // 商户网站唯一订单号
        orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

        // 商品名称
        orderInfo += "&subject=" + "\"" + subject + "\"";

        // 商品详情
        orderInfo += "&body=" + "\"" + body + "\"";

        // 商品金额
        orderInfo += "&total_fee=" + "\"" + price + "\"";

        // 服务器异步通知页面路径
        orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
                + "\"";

        // 服务接口名称, 固定值
        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);
        String md5 = Constants.MD5(key);

        this.orderNo = md5;
        return md5;
    }

    /** * 获取已经生产的订单编号 * * @return */
    public String getOrderNo() {
        return this.orderNo;
    }

    /** * sign the order info. 对订单信息进行签名 * * @param content * 待签名订单信息 */
    public String sign(String content) {
        return SignUtils.sign(content, RSA_PRIVATE);
    }

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

}

从上面代码可以看出,程序的主要运行流程是:通过开启一个子线程去调用支付宝的支付功能,获取到支付结果后,通过Handler通知UI线程,根据支付结果去显示不同的。

到这里基本上整个开发流程已经大致完成了,具体细节根据需求去修改即可。官方建议支付完成后,将获取到的支付结果上传到自己的服务器,通过官方提供的API进行验证,建议添加该流程

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
系统功能分析: 功能分析 1.设计内容 支付宝系统主要包括用户管理、资金管理、基金管理、单车管理、地图管理、基金公司管理六个功能模块。 1.1 用户管理模块 用户管理模块功能主要包括用户注册、登录校验、用户信息审核。 用户按权限分为三种:普通用户、单车管理员和系统管理员。用户通过选择不同的用户类型进入到不同的子系统。 普通用户:普通用户通过密码验证,进入用户子系统。普通用户可以存入一定数量钱款,购买系统内的某个基金项目并获得投资收益、查看每日收益与支出明细并且还可以为某项花费支付费用(例如:手机费、共享单车)。 单车管理员:单车管理员通过密码验证,进入共享单车子系统。单车管理员根据用户的骑行时间收取一定的费用,并且可以查询单日、单月、单年的在一定区域内所有单车的收益。 系统管理员:系统管理员通过密码验证,进入管理子系统。系统管理员可以对用户提交的基本信息进行审核(包括实名化认证)、对基金公司进行管理、统计平台收入(用户花费提成+单车公司入驻资金+基金公司盈利*一定比例)。 1.2 资金管理模块 资金管理模块功能主要包括用户资金的存入(增);花费、投资(改);支出、收益和总资产查询(查)。 用户资金的增改均会记录产生变化的时间,以便用户查看每日收益、支出明细和总资产。 资金的存入包括存入一定数目的钱款、基金的买出(取出投资)、收益。 资金的花费包括基本支付费用(手机费、共享单车等)、购买基金、取出一定数目的钱款。而投资就只包括购买基金项目。 本模块主要是普通用户对自己的资金管理操作。 1.3 基金管理模块 基金管理模块功能主要包括基金项目的增、删、改、查。 普通用户的买入、买出基金分别对应相应基金项目的增加、删除。系统会自动记录购买时间,以便计算收益。 普通用户还可以对某一基金项目追加投资基金(改),对某一基金项目的投资、收益进行查询。 本模块主要是普通用户对自己购买基金项目的一些基本操作。 1.4 单车管理模块 单车管理模块功能主要包括增加和删除单车数量;查询单车收益、单车位置。 本模块主要是实现单车管理员对单车收益和所有单车位置的查询,同时单车管理员还可以就实际情况投入和减少单车数量(增加和删除单车数据)。 1.5 地图管理模块 地图模块功能主要包括设定单车投放位置:以我们南昌航空大学为主要区域;单车位置的查询和自动修改。 本模块主要是实现支付宝共享单车管理子系统地图上单车位置显示和变化。本模块属于系统自动控制部分,以模拟单车使用情况,没有任何用户拥有修改权限。 1.6 基金公司管理模块 基金公司管理模块功能主要包括对入驻“支付宝”平台的基金公司进行管理。 本模块主要是实现对添加基金公司和删除基金公司,基金公司基本信息的修改和查询。
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值