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

安卓-Android如何集成支付宝支付(集成阿里支付)详解。Android接入alipay支付 安卓app集成阿里支付流程:所需必备阿里支付的参数:二级目录三级目录 所需必备阿里支付的参数: app_id 商户签约拿到的app_id,如:2013081700024223。 你在阿里支付注册的app商户时,拿到的app id pid。商户签约拿到的pid, 如:2088102123816631 pid:partner_id的简称,合作伙伴身份,支付宝账号对应的支付宝唯一用户号(支付宝账户的唯一标识),以2088开头的16位纯数字组成。 支付宝账户:用于登录支付宝的账户,一般为手机号或电子邮箱。 阅读详情

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

转载请注明出处:http://blog.youkuaiyun.com/ht_android/article/details/45307165

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

首先是支付宝的开发资料方面:
接口申请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进行验证,建议添加该流程。

如果有疑问,可以通过QQ381959281联系作者进行交流

Android 集成支付宝支付,支付宝支付2(1) 我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。// 8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态。 阅读详情

相关推荐

支付相关(二):APP支付宝支付-转账到支付宝账号(JAVA服务端开发)

首先确保签约单笔转账到支付宝账号转账到支付宝账号是APP这边一个提现的功能。支付宝提供了可以转账到支付宝账号的功能,可选择收款方账户类型。可取值:1、ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。2、ALIPAY_LOGONID:支付宝登录号,支持邮箱和手机号格式。a、转到支付宝唯一用户号,获取1ALIPAY_USERID的方式需要,支付宝授权才能...

shouhuhuise的专栏 7130

支付宝支付实战

⽀付能⼒、⽀付扩展、资⾦能⼒、⼝碑能⼒、营销能⼒、会员能⼒、⾏业能⼒、安全能⼒、基础能⼒。创建应⽤:选择应⽤类型、填写应⽤基本信息、添加应⽤功能、配置应⽤环境(获取⽀付宝公。表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交。钥、应⽤公钥、应⽤私钥、⽀付宝⽹关地址,配置接⼝内容加密⽅式)、查看。按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态。如果订单已支付,则更新商户端订单状态,并记录支付日志。

qq_52922453的博客 1342

WS_APP_PAY_SDK_BASE-15.5.5

支付宝接口SDK,旧版本15.5.5,包括jar包alipaySdk-20180601

Android开发知识(十二):30分钟快速接入微信支付SDK

目录 目录 一、申请应用 二、配置微信支付的SDK 三、微信支付流程 1、统一下单接口 2、APP调起支付接口 3、微信支付的回调 四、总结 一、申请应用 1、首先到 [ 微信开放平台官网] 申请注册帐号,这些流程就忽略了到官网一看自然就知道怎么走,感觉在这里没有必要说很多。 2、申请一个移动应用,填写完成你的应用信息。其他的没啥,最主要的是要填对你的签名和包名,...

lc_miao的专栏 2万+

AliPay阿里支付项目.net

AliPay阿里支付项目.net Alipay-demo-project alipay-sdk-NET

支付宝Alipay监控订单充值系统,支付宝订单监控无人工值守,自动到账发货

软件运行后会自动打开浏览器,浏览器上登录支付宝即可自动刷新,通过HTTP调用接口就能查看这个订单信息。 文件夹图片展示了使用方法了~

Android分享到支付宝APP(完整版-包括网页分享,文本信息分享,图片分享)

Android分享到支付宝APP(完整版),带skd安装教程

土拨鼠博客 1714

AliPay.zip

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

Android开发之微信支付,支付宝支付

今天想跟大家分享一下Android开发中的支付功能,基本上所有的商城类项目都会用到微信支付,支付宝支付,相信很多初学者在开发的过程中也曾遇到跟我一样的情况:看完开发文档之后,做出来的功能怎么调用不起来,经过后来的反复调试才成功的完成支付功能,下面我就简单的来说说微信支付和支付宝支付的注意事项。 项目的下载链接我也放在结尾,有需要的朋友可以下载看看,欢迎大家提出意见。 微信支付注意事项:

emptoney的博客 1030

ARM双核锁步DCLS Lockstep技术研究(FPGA实现)

基于《Applying Dual-Core Lockstep in Embedded Processors to Mitigate Radiation-induced Soft Errors》文章总结 RISC-V双核锁步DCLS Lockstep技术参考之前文章: RISC-V双核锁步DCLS Lockstep技术总结_远古架构师alanwu的博客-优快云博客https://blog.youkuaiyun.com/heyuming20062007/article/details/123329537ARM+RIS

heyuming20062007的博客 8727

SONiC (6) - SONiC 源码框架分析

https://github.com/sonic-net/sonic-utilitieshttps://github.com/sonic-net/sonic-snmpagenthttps://github.com/sonic-net/sonic-linux-kernelhttps://github.com/sonic-net/sonic-platform-commonhttps://github.com/sonic-net/sonic-platform-daemons以下是在 SONiC 中运行的容器列表:

qq_49477505的博客 1334

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

*关于Android在线支付A l i*p*a*y(支付宝)开发的经验分享***q《199-7O**7**4⑥》   现在,ReDex已经开源了。安卓开发者可以免费地使用这个工具优化自己的应用。也可以将它用作其它安卓字节码优化工具的基础。   在Facebook工程博客的一篇文章中指出,.DEX(安卓的可执行文件的形式)文件中的类,并不是按照应用启动时候加载的顺序加载的,而是按照编译工具指定的顺...

asdsadas111的博客 382

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

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

在近期,公司需要开发一个关于在线支付的模块,所以需要用到第三方支付平台 转载请注明出处:http://blog.youkuaiyun.com/ht_android/article/details/45307165 经过一周多的时间对这两种支付平台的研究,完成功能后将经验分享给大家,希望能帮助到有需求的朋友。 首先是支付宝的开发资料方面:  接口申请url  https://b.alipay.com/

dxcn2015的博客 637

基于STM32F103C8T6的红外循迹避障小车

编程思路:控制核心板IO口的电平(即电机驱动模块的AIN1,AIN2,BIN1,BIN2)从而控制AO1、AO2、BO1、BO2的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM4的两个通道分别产生两路PWM信号来控制电机速度,四个电机两个一组,同一侧的两个连接在同一个PWM上。(#include "dianji.h"文件中同时写了对循迹模块引脚的初始化)

weixin_48743503的博客 1万+

H3C VRF实验

POP-vpn-instance-RT1]route-distinguisher 11:11 # VPN实例-RT1的路由区分器值11:11。配置路由泄露,其实就是在一个VPN示例中添加另一个VPN实例的下一跳,比如在VPN实例RT1中添加去往SRV的默认路由。但是也有了一个新的问题,那就是RT1、RT2和RT3也能互访了,这让VPN实例变得没有意义了。[POP]ip vpn-instance RT1 #配置vpn实例-RT1。绑定了VPN实例,所以要把路由添加到VPN实例POP中。

m0_68698993的博客 4026
上一篇: 网络框架Volley原理分析
下一篇: 关于handler内存泄露的问题
ht_android
博客等级 码龄12年 33粉丝 19原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值