此项目已开源 赶快来围观 Start支持下吧

客户端开源地址-JPay】【服务端端开源地址-在com.javen.alipay

包名下

上一篇详细介绍了微信APP支付 点击这里

此篇文章来详细介绍下支付宝APP支付

目录

1、支付宝与微信对比(申请、费率、结算周期)

2、支付宝上线应用

3、支付宝App支付Android集成流程详解

4、服务端实现

5、客户端实现

6、常见错误解决方案(ALI40247、AL38173)

1、支付宝与微信对比

申请:【微信开发平台】注册的邮箱不能与腾讯其他产品同号,需要开发者资质认证(需要¥300,而且支付商户与公众号不公用)而支付宝只需要企业实名认证,其他质料类似(营业执照、组织机构代码(现在都三证合一了))。

费率:

微信签约汇率参考质料】【支付宝签约汇率参考质料

结算周期:

微信结算周期: 话费通讯、财经资讯、股票软件类、网络虚拟服务以及互联网相关行业 T+7 众筹 T+3 其他T+1,结算款项自动提现到商户的结算账户,一般从结算日起3个工作日到账(具体到账时间视不同银行到账情况而定)

支付宝结算周期:及时到支付宝账号

2、支付宝上线应用

1、注册账号并实名认证

注册账号了没有实名认证进入开发平台的管理中心会提示如下图



账户认证-商家认证流程介绍

2、创建应用开通支付并上线

官方文档有详细的介绍-创建应用、配置应用、上线应用

资源下载:App支付DEMO&SDK生成与配置密钥

注意签名工具目录不能包含中文

这里上传的是rsa_public_key.pem Java版签名使用的密钥是rsa_private_key_pkcs8.pem

3、支付宝App支付Android集成流程详解

官方文档 点击这里

1、导入支付宝SDK 其中SDK在图资源下载汇总WS.APP_PAY_SDK_BASE_20.zip

2、修改Manifest

在商户应用工程的AndroidManifest.xml文件里面添加声明:

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

3、权限声明

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

4、如需混洗、添加混淆规则

在商户应用工程的proguard-project.txt里添加以下相关规则:

alipaySDK-xxxxx.jar根据下载的做响应的修改

-libraryjars libs/alipaySDK-xxxxx.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 *;}

5、支付接口调用

获取PayTask支付对象调用支付(支付行为需要在独立的非ui线程中执行

具体实现参考客户端实现,调用支付需要使用到orderInfo 具体实现参考服务端实现

6、支付结果获取和处理

调用pay方法支付后,将通过2种途径获得支付结果:

1、同步返回 商户应用客户端通过当前调用支付的Activity的Handler对象,通过它的回调函数获取支付结果。

2、异步通知 商户需要提供一个http协议的接口,包含在请求支付的入参中,其key对应notify_url。支付宝服务器在支付完成后,会以POST方式调用notify_url传输数据。

4、服务端实现

代码来自Demo 并做简单的封装

设置支付宝业务参数

核心实现代码如下

/**
* App支付
*/
public void appPay(){
String orderInfo;
try { String body="我是测试数据";
String passback_params="123";
String subject="1";
String total_amount="0.01";
String notify_url="http://javen.ittun.com/alipay/pay_notify"; String appId;
String rsa_private;
if (isDebug) {
appId=prop.get("test_appId").trim();
rsa_private=prop.get("test_rsa_private").trim();
System.out.println("test。。。。");
}else {
appId=prop.get("appId").trim();
rsa_private=prop.get("rsa_private").trim();
}
System.out.println("appId:"+appId);
System.out.println("rsa_private:"+rsa_private); BizContent content = new BizContent();
content.setBody(body);
content.setOut_trade_no(OrderInfoUtil2_0.getOutTradeNo());; content.setPassback_params(passback_params); content.setSubject(subject); content.setTotal_amount(total_amount);
content.setProduct_code("QUICK_MSECURITY_PAY"); Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(appId,notify_url,content);
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
String sign = OrderInfoUtil2_0.getSign(params, rsa_private);
orderInfo = orderParam + "&" + sign;
log.info("orderInfo>"+orderInfo);
result.success(orderInfo);
renderJson(result); } catch (Exception e) {
e.printStackTrace();
result.addError("system error");
}
}

具体实现参考【开源项目

5、客户端实现

客户端请求此action返回orderInfo,默认的访问地址为http://[域名或者IP]:端口号/[项目名称]/alipay/appPay

成功将返回:

{
"code": 0,
"data": "charset=utf-8&biz_content=%7B%22out_trade_no%22%3A%22120822453414812%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22passback_params%22%3A%22123%22%7D&method=alipay.trade.app.pay&format=json&notify_url=http%3A%2F%2Fjaven.ittun.com%2Falipay%2Fpay_notify&app_id=2016102000727659&sign_type=RSA&version=1.0&timestamp=2016-12-08+22%3A45%3A34&sign=m6fpNI58jkOIHROtm8Q2V1Ei7bxXc14JHtJEeqGM0B8dWlq3d%2FfAqpoQTZgeBb%2FVK%2B%2BydOJzVvSWc89dBxhYUq72KOeUwHiKlRJBFMnEMAZbJlRxqu9%2BRX2q7HSRmA6WRg75O68HZhkIhtO3bSNx3s710tMHmQCN230JoVWiwHw%3D",
"message": null
}
/** 
* 获取支付宝App支付订单信息 
* @return 
*/ 
public String getAliPayOrderInfo(Order order){
String result=HttpKit.get(Constants.ALIPAY_URL);
return result;

异步获取orderInfo

public class AliPay extends AsyncTask<Object, Integer, String> {
private Activity mContext;
public AliPay(Activity context) {
this.mContext = context;
} @Override
protected String doInBackground(Object... params) {
return IPayLogic.getIntance(mContext).getAliPayOrderInfo((Order)params[0]);
} @Override
protected void onPostExecute(String result) {
try {
if (result!=null) {
System.out.println("AliPay result>"+result);
JSONObject data = new JSONObject(result);
String message = data.getString("message");
int code = data.getInt("code"); if(code == 0){
String orderInfo = data.getString("data"); Toast.makeText(mContext, "正在调起支付", Toast.LENGTH_SHORT).show();
IPayLogic.getIntance(mContext).startAliPay(orderInfo); }else{ Log.d("PAY_GET", "返回错误"+message);
// Toast.makeText(mContext, "返回错误:"+message, Toast.LENGTH_SHORT).show();
}
}else {
System.out.println("get AliPay exception, is null");
}
} catch (Exception e) {
Log.e("PAY_GET", "异常:"+e.getMessage());
Toast.makeText(mContext, "异常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
super.onPostExecute(result);
} }

支付接口调用

public void startAliPay(final String orderInfo){
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(mContext);
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = new Message();
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
}

客户端通过回调函数获取支付结果

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@SuppressWarnings("unchecked")
public void handleMessage(Message msg) {
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
System.out.println("alipay call "+payResult.toString());
String resultStatus = payResult.getResultStatus();
String memo = payResult.getMemo();
if (Constants.payListener !=null){
//返回状态以及详细的描述参考
// https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.xN1NnL&treeId=204&articleId=105302&docType=1
Constants.payListener.onPay(-2,resultStatus,memo);
}
}
};

客户端具体使用方法

 public void testAliPay(View view){
Toast.makeText(this, "支付宝测试", Toast.LENGTH_SHORT).show(); Order order = new Order();
order.setBody("会员充值中心");
order.setParaTradeNo(System.currentTimeMillis()+"");
order.setTotalFee(20);
order.setAttach("json");//附加参数
order.setNofityUrl("http://www.xxxx.com");//支付成功服务端回调通知的地址 IPay.getIntance(MainActivity.this).toPay(IPay.PayMode.ALIPAY,order,new IPay.IPayListener() { @Override
public void onPay(int wxcode, String alicode, String message) {
System.out.println("回调过来的状态》"+alicode+" message>"+((message!=null && message.isEmpty())?"":message));
Toast.makeText(MainActivity.this, "回调过来的状态》" + alicode, Toast.LENGTH_SHORT).show();
}
});
}

6、常见错误解决方案

APP支付报错ALI40247处理方案

ALI40247的错误可以查看论坛提供的这个解决方案

AL38173的错误一般是参数问题造成的,建议检查请求参数,对照文档查看,比如:参数少了、多了、乱码、名称不对,还有必传参数是否都请求提交给支付宝了等等.

如果在网上查阅质料还未解决,可以寻求阿里的在线支持【支持中心

此项目已开源 赶快来围观 Start支持下吧

客户端开源地址-JPay】【服务端端开源地址-在com.javen.alipay包名下

推荐阅读

Android版-微信APP支付

极速开发微信公众号之微信买单

极速开发微信公众号之公众号支付

极速开发微信公众号之扫码支付

极速开发微信公众号之刷卡支付

极速开发微信公众号之现金红包

记录学习的点滴,以此勉励不断奋斗的自己✌️✌️✌️ 如果对你有帮助记得点喜欢告诉我哈

Android版-支付宝APP支付的更多相关文章

  1. Android版-微信APP支付

    首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...

  2. android 集成支付宝app支付(原生态)-包括android前端与java后台

    本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...

  3. 微信、支付宝App支付-JPay0.0.2发布

    JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...

  4. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

    java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写     一.流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付 ...

  5. 支付宝APP支付IOS手机端java后台版

    版权声明:http://blog.csdn.net/u012131769/article/details/76639527#t8 转载:http://blog.csdn.net/u012131769/ ...

  6. 支付宝APP支付开发- IOException : DER input, Integer tag error

    支付宝APP支付Java开发报错: 1 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: I ...

  7. 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

    支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.

  8. 支付宝APP支付之Java后台生成签名具体步骤

    /** *支付宝支付 * @param orderId 订单编号 * @param actualPay 实际支付金额 * @return */ private String getOrderInfoB ...

  9. H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)

    H5打包的app实现支付及支付宝支付,本章主要详解支付宝支付,微信支付请查看另一篇“H5使用codovar插件实现微信支付(微信APP支付模式,前端)” ps:本文只试用H5开发的,支付宝 APP支付 ...

随机推荐

  1. sed初学

    1.连接多个sed命令,使用;号 2.批量修改文本中匹配到相应字符串的行 例如,将文本中log_server_port = "12345" 的12345修改成变量中存储的值 sed ...

  2. Ceph分层存储分析

    最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...

  3. JSON和js对象之间的相互转化

     jQuery插件支持的转换方式 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 http://www. ...

  4. 从nib文件里加载collectionViewCell

    如何取出在xib文件里绘制的collectionViewCell ? 1.获得nib文件 UINib *nib = [[UINib NibWithName:@"xib文件的名字"] ...

  5. Dapper试用

    以下代码摘自imfunny的<给力分享新的ORM => Dapper> http://www.cnblogs.com/imfunny/archive/2011/09/16/21788 ...

  6. protobuf-net 与 C#中几种序列化的比较

    C#中几种序列化的比较,此次比较只是比较了 序列化的耗时和序列后文件的大小. 几种序列化分别是: 1. XmlSerializer 2. BinaryFormatter 3. DataContract ...

  7. MySql和SQL Server数据类型 对比

    My Sql 数据类型 SQL Server 数据类型 Yes/No bit Smallint(字节型) tinyint Integer(长整型) int Real(单精度浮点型)    real F ...

  8. mongo(四)索引

    mongo(四)索引 根据这里http://www.cnblogs.com/huangxincheng/archive/2012/02/29/2372699.html   首先,需要构造一些数据,如下 ...

  9. [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析

    一. 建立工程 O(∩_∩)O~上一节介绍了一种非常容易的OpenGL的搭建方法,这一节将就上一节介绍的VC6.0企业版自带的OpenGL Win32 Application建立一个模板工程,并分析这 ...

  10. [游戏模版20] Win32 物理引擎 加速运动

    >_<:Compared with previous talk,there will be taking about how to create an accelerated speed. ...