长话短说,本文根据支付宝官方说明文档,简单总结下,并且说明下开发过程碰到的问题以及该如何解决。

整合步骤:

1 登录商家服务网站,下载开发包,地址:https://b.alipay.com/order/techService.htm, 下方选择“移动支付”

2 下载的开发包里面包含整合文档《支付宝钱包支付接口开发包2.0标准版.pdf》《支付宝钱包支付接口开发包2.0标准版接入与使用规则.pdf》

3 开发人员都请先看下《支付宝钱包支付接口开发包2.0标准版.pdf》 第2点交易流程:

流程说明(以 Android 平台为例):
(1) 第 2 步 调用支付接口:此消息就是本接口所描述的开发包提供的支付对象
PayTask,将商户订单信息传进pay方法唤起支付宝收银台,订单格式具体参
见“5 请求参数说明”。
(2) 第 3 步:钱包支付开发包将会按照商户 App 提供的参数发送支付请求。
(3) 第 5 步 : 异步发送支付通知: 钱包支付服务器端发送异步通知消息给商户服务
器端,参见“7 服务器异步通知参数说明”。
(4) 第 7 步 接口返回支付结果:商户应用客户端通过当前调用支付的Activity的
Handler对象,通过它的回调函数获取支付结果,参见“6 同步通知参数说
明”。

(1) 构造订单数据并签名
商户客户端根据支付宝钱包支付开发包的接口规则, 通过程序生成得到签名结果及
要传输给支付宝钱包支付开发包的数据集合。
(2) 发送请求数据
把构造完成的数据集合传递给支付宝钱包支付开发包。
(3) 支付宝钱包支付开发包对请求数据进行处理
支付宝钱包支付开发包将请求数据根据业务规则包装后传递给支付宝服务端, 服务
端得到这些集合后, 会先进行安全校验等验证, 一系列验证通过后便会处理完成这
次发送过来的数据请求。
(4) 返回处理的结果数据
对于处理完成的交易, 支付宝会以两种方式把数据分别反馈给商户应用和商户服务
器。
? 在手机客户端上,开发包客户端直接把处理的数据结果反馈给商户客户端;
? 支付宝服务器主动发起通知,调用商户在请求时设定好的页面路径(参数
notify_url,如果商户没设定,则不会进行该操作)。
(5) 对获取的返回结果数据进行处理
商户在客户端同步通知接收模块或服务端异步通知接收模块获取支付宝返回的结
果数据后,可以结合商户自身业务逻辑进行数据处理(如:订单更新、自动充值到
会员账号中等)。同步通知结果仅用于结果展示,入库数据需以异步通知为准。

4 关于交易流程其实跟银联支付大同小异,如果不明白可以看下银联的交易流程:http://www.cnblogs.com/jager/p/4846376.html

5 理解完交易流程,接着建议先把开发包里面官方提供的alipay_demo运行起来,然后就差不多成功一半了,demo里面需要配置商户PID,商户收款账号,商户私钥pkcs8格式,关于如何生成私钥可以参考:https://cshall.alipay.com/support/help_detail.htm?help_id=397433&keyword=%25C8%25E7%25BA%25CE%25C9%25FA

6 接着看《支付宝钱包支付接口开发包2.0标准版接入与使用规则.pdf》5.2开发包集成流程

7 遇到无法确定的问题时,可以咨询支付宝客服 b.alipay.com/support/helperApply.htm?action=supportHome,然后点击页面右边在线客服,咨询技术问题。

直接上代码:

首先是手机端的整合,整合其实文档里面已经写的非常清楚了,这里简单总结下:

alipaySDK.jar 放到lib下面,并加入编译路径

在AndroidManifest.xml文件:

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

<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"
/>

工程的 proguard-project.txt 里添加以下相关规则:

-libraryjars libs/alipaySDK-20150602.jar
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}

(添加规则我碰到个问题,就是app最后用签名方式打包的时候会报错,eclipse>android tools>export signd application pakage...,错误信息如下截图,问了客服,目前这个问题还没解决,如果有哪位大神解决了,请麻烦告诉我,这里先谢了!)

目前,我的解决方案是屏蔽规则,暂时不使用(支付宝客服说没问题)

上面就是大概的整合步骤,个人感觉比银联简单多了,银联整合请看http://www.cnblogs.com/jager/p/4846376.html

订单数据生成:

/*** create the order info. 创建订单信息* */public String getOrderInfo(String subject, String body, String price) {// 签约合作者身份IDString 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;}

支付接口调用(直接给出cordova插件应该怎么写,原生的其实一样):

public class PayPlugin extends CordovaPlugin {@Overridepublic boolean execute(String action, JSONArray args,CallbackContext callbackContext) throws JSONException {if(action.equals("unionPay")) {// 银联支付,00表示生产环境,01表示测试环境,配置成01后台要修改相应的acp_sdk.propertiesString tn = args.getString(0);UPPayAssistEx.startPayByJAR(cordova.getActivity(), PayActivity.class, null, null, tn, "00");} else if(action.equals("aliPay")) {// 支付宝支付--orderInfo 就是从上面获取的订单信息String orderInfo = args.getString(0);// 对订单做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() {@Overridepublic void run() {// 构造PayTask 对象PayTask alipay = new PayTask(cordova.getActivity());// 调用支付接口,获取支付结果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();} return super.execute(action, args, callbackContext);}private static final int SDK_PAY_FLAG = 1;private static final int SDK_CHECK_FLAG = 2;// 商户私钥,pkcs8格式// 如何生成:https://cshall.alipay.com/support/help_detail.htm?help_id=397433&keyword=%25C8%25E7%25BA%25CE%25C9%25FApublic static final String RSA_PRIVATE = "XXX...XXX";private Handler mHandler = new Handler() {public void handleMessage(Message msg) {Activity activity = cordova.getActivity();switch (msg.what) {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(activity, "支付成功",Toast.LENGTH_SHORT).show();} else {// 判断resultStatus 为非“9000”则代表可能支付失败// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)if (TextUtils.equals(resultStatus, "8000")) {Toast.makeText(activity, "支付结果确认中",Toast.LENGTH_SHORT).show();} else {// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误Toast.makeText(activity, "支付失败",Toast.LENGTH_SHORT).show();}}break;}case SDK_CHECK_FLAG: {Toast.makeText(activity, "检查结果为:" + msg.obj,Toast.LENGTH_SHORT).show();break;}default:break;}};};/*** sign the order info. 对订单信息进行签名* * @param content*            待签名订单信息*/public String sign(String content) {return SignUtils.sign(content, RSA_PRIVATE);}/*** get the sign type we use. 获取签名方式--这个地方要注意跟下方的后台解析里面的签名方式一样,否则后台isSign结果可能是false,导致回调的时候签名验证失败* */public String getSignType() {return "sign_type=\"RSA\"";}}

后台回调方法实现:

 @ResponseBody@RequestMapping("/AlipayNotifyUrl")public void AlipayNotifyUrl(HttpServletRequest request,HttpServletResponse response){//System.out.println("----------------------支付宝服务器异步通知页面路径及处理");try{//获取支付宝POST过来反馈信息Map<String,String> params = new HashMap<String,String>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}
                params.put(name, valueStr);}//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
            if(AlipayNotify.verify(params)){//验证成功LogUtil.writeLog("验证签名结果[成功].====================>支付宝异步回调逻辑处理开始<==================回调返回内容:" + params.toString());if(trade_status.equalsIgnoreCase("TRADE_SUCCESS")){//交易成功
                    // 这里写你的业务逻辑代码。。}response.getOutputStream().print("success");LogUtil.writeLog("验证签名结果[成功].====================>支付宝异步回调逻辑处理结束<==================");}else{//验证失败
//             //校验失败不做任何处理LogUtil.writeLog("验证签名[失败].====================>");}}catch(Exception e){e.printStackTrace();}}

同银联支付一样,为了保证支付的成功以及完整性,一般后台要配置个定时器来轮询交易记录,这里就不多说,开发的时候要考量下相应的场景。

转载于:https://www.cnblogs.com/jager/p/4860738.html

手机APP支付--整合支付宝支付控件相关推荐

  1. 微信支付和支付宝支付整合(含设计模式1)

    微信支付和支付宝支付整合(含设计模式1) 1.说明: 设计模式:单例+策略模式+抽象 在开发中经常对接微信支付和支付宝支付,相对来说,阿里的文档比微信的接口文档清晰一点,这里用的第三方库(com.gi ...

  2. 手机网站调起支付宝支付

    手机网站调起支付宝支付 由于前几天公司要求我来做支付模块,于是我在总结了各路大佬的代码之后加上了自己的需求,现在把代码和步骤给大家分享出来,希望可以帮到大家. 1.进入支付宝开放平台>开发者中心 ...

  3. SpringBoot整合支付宝支付接口 详解 (有源文件)

    目录 1.简介与支付接口运行原理 2.基本配置说明 3.支付接口实现 4.整合后沙箱测试 1.简介与支付接口运行原理 简介: 现在与钱有关的项目都离不开支付,现在就来介绍一下如何对接支付宝接口.演示项 ...

  4. android个人支付功能,个人app支付接入(三分钟搞定个人微信支付,支付宝支付问题)---贝贝支付...

    前言 想必很多人个人开发者和我有同样的感触,想要在自己开发的app中接入微信支付和支付宝支付,仅仅是去申请支付接口就把我们挡在了门外,微信和支付宝都只对接企业的,那不是想逼死我们个人开发者吗?一开始使 ...

  5. Vue app安卓端移动端实现微信支付和支付宝支付

    当前项目借助调用安卓和ios方法跳转第三方支付平台实现微信支付和支付宝支付  涉及到的安卓方法: window.AndroidFunction.wxpay('传递的参数') // 点击确认支付hand ...

  6. 微信支付及支付宝支付开发指南

    从开始学习android开始到现在还没搞过三方支付,感觉挺遗憾的.看到最近有几篇关于微信支付和支付宝支付的文章,稍微进行一下整合,供大家参考. ---------------------------- ...

  7. 个人开发者只要一行代码接入微信支付和支付宝支付

    接入支付功能   对于个人开发者来说,我们很希望我们开发的App被广泛使用,同时可以获得一些额外收入,那就更好了.但是在微信开放平台或者支付宝开放平台申请支付功能,需要是企业才可以接入,对于我们个人开 ...

  8. Linux下,支付宝安全控件失效,解决方法

    支付宝安全控件,aliedit.sh,下载页面在此. 我的系统是Fedora17-64bit,安装了多次,安全控件一直没生效.后来联系了作者:Longda Feng,zhongyan.feng@ali ...

  9. opensuse 13.1 firefox 支付宝安全控件安装失败的解决方法

    首先在文章的最前边,叙述(我的)一个opensuse 13.1系统下firefox浏览器安装支付宝安全控件的可行方法,避免遇到相同问题的筒子们走弯路: 1. 如果你没有安装支付宝安全控件,进入支付宝首 ...

最新文章

  1. PNAS最新研究揭示大脑如何学习语言
  2. Linux 操作系统原理 — 文件系统 — 虚拟文件系统
  3. 循环结构_do-while循环
  4. A - TOYS POJ - 2318
  5. io和nio的缓冲_IO与NIO –中断,超时和缓冲区
  6. mysql 默认page大小_Innodb优化之修改页大小
  7. 修复./mysql/proc
  8. Kubernetes事件离线工具kube-eventer正式开源
  9. 手机画面尺寸多少满屏_各种大屏手机之中适合用户的最佳尺寸是多少?
  10. “单于夜遁逃”的上一句诗是什么?这句诗出自哪里?
  11. 什么是shell? bash和shell有什么关系?
  12. 关于 Mythware 极域电子教室
  13. 2012 r2 万能网卡驱动_MultiBeast | 黑苹果的驱动精灵简单使用解读
  14. 男人不想打工一辈子,再忙也要读这10本书,提高情商智商
  15. 计算机哪些方向发展前景,计算机就业的几个方向
  16. 统计物理中积分计算和态密度计算要点
  17. 开源软件中的TOP10
  18. batchnorm原理及代码详解
  19. 初探 MacBook Pro 刘海屏
  20. 定点数的运算 —— 逻辑移位、算术移位、循环移位

热门文章

  1. windows系统C#(.Net)MySql数据库同步工具
  2. 分析一下metro下两种Bundle格式
  3. mysql8.0分区数据默认存放位置_mysql数据库默认存放位置修改
  4. 【C/C++】C语言特性总结
  5. SwiftUI:仿iWatch运动
  6. 二进制方式搭建kubernetes集群搭建步骤
  7. <Principles of fMRI 1>课程笔记4 心理学推断
  8. axure 中继器标记行_动作中继标记
  9. java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站
  10. 使用Ultra Librarian转换TI芯片的Altium Designer封装格式