博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android版-支付宝APP支付
阅读量:5221 次
发布时间:2019-06-14

本文共 8006 字,大约阅读时间需要 26 分钟。

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

【】【】

上一篇详细介绍了微信APP支付

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

目录

1、支付宝与微信对比(申请、费率、结算周期)
2、支付宝上线应用
3、支付宝App支付Android集成流程详解
4、服务端实现
5、客户端实现
6、常见错误解决方案(ALI40247、AL38173)

1、支付宝与微信对比

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

费率:

【】【】

结算周期:

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

:及时到支付宝账号

2、支付宝上线应用

1、注册账号并实名认证

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

实名认证

为什么要实名认证

【】

商家认证流程

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

【、】

资源下载汇总

签名工具

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

签名工具的使用

上传密钥

这里上传的是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文件里面添加声明:

3、权限声明

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
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
{ 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
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
) 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支持下吧

【】【】

推荐阅读

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

转载于:https://www.cnblogs.com/zyw-205520/p/6228875.html

你可能感兴趣的文章
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>