微信支付,请参考我另一篇:Android App接入支付功能——微信篇

因为项目中用到支付功能,而且支付宝文档和微信文档写的很简洁,不仔细研究,真的无法集成成功

老样子,上效果图由于涉及到输入密码,我分开了

调用支付支付宝支付1.gif

调用支付支付宝支付2.gif

大概说下实现思路:
①、首先在官方注册成为开发者,创建应用(创建应用时,为您生成应用唯一标识(APPID)保存appid,下文要用到),并给应用添加App支付功能;(已是开发者请忽略)
②、导入官方的sdk,下载官方sdk;
③、配置相关的权限;
④、进行支付接口的调用;
⑤、支付结果获取和处理。(请注意:下面代码把⑤的步骤直接放在④里面了)

步骤

1.登录官网,也就是蚂蚁金服的开放平台,填写相关信息,进行注册账号进行登录,注册成为开发者(已是开发者请忽略)

开放平台首页.png

2.下载官方 sdk,将sdk放入自己工程libs文件中:

下载的sdk.png

工程中的sdk.png

大家注意sdk包,可以看出该sdk包后缀是20170922,说明是此jar包发布的日期。

3.配置清单文件AndroidManifest.xml:
①添加Activity声明:

<!-- 若手机没有安装支付宝,则调用H5支付页面 -->
<activityandroid:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>
<activityandroid:name="com.alipay.sdk.app.H5AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" >
</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-rules.pro添加如下代码:

-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 *;}
-keep class com.alipay.sdk.app.H5PayCallback {<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}

4.调用支付接口:
在调用支付接口之前,先简单介绍下工程结构以及相关类代表含义:

 src├── com.你的包名.activity|   ├── XXActivity.java  //在这里我们启动支付接口├── com.你的包名.alipay|   ├── AlipayConfig.java  //支付的一些基础配置|   ├── Base64.java //RSA密钥转换|   ├── OrderInfoUtil2_0.java //构造订单的一些方法|   ├── PaymentHelper.java  //我把具体支付方法放在工具类里面|   └── PayResult.java  //支付结果|   └── PayReponse.java  //支付请求类|   └── SignUtils.java  //RSA签名类└── ...

具体类代码:

代码图.png

如果仔细看上面的工程结构图就知道,PaymentHelper是工具类,我把支付宝和微信支付都封装在一个工具类里面,这样可以不用每个页面都需要重写支付方法,很简单,很方便。

PaymentHelper.java:

    /*** Created by zjp on 2017/12/21 10:46.* 支付宝和微信支付工具类*/public class PaymentHelper {private static final int SDK_PAY_FLAG = 1;private Activity mthis;private Map<String, String> result;/*** 支付宝支付*/public void  startAliPay(Activity activity, PayReponse payReponse, String payRMB) {this.mthis = activity;if (activity == null || payReponse == null) {return;}if (TextUtils.isEmpty(AlipayConfig.PARTNER) || TextUtils.isEmpty(AlipayConfig.RSA2_PRIVATE) || TextUtils.isEmpty(AlipayConfig.SELLER)) {return;}/*** 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;* 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;* 点击支付按钮出现的错误码,请查看:https://tech.open.alipay.com/support/knowledge/index.htm?categoryId=24120&scrollcheck=1#/?_k=d783mj* orderInfo的获取必须来自服务端;*/boolean rsa2 = (AlipayConfig.RSA2_PRIVATE.length() > 0); Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(AlipayConfig.APPID, rsa2, payRMB);String orderParam = OrderInfoUtil2_0.buildOrderParam(params); //拼接订单信息String privateKey = rsa2 ? AlipayConfig.RSA2_PRIVATE : AlipayConfig.RSA_PRIVATE;String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2); //然后并对订单信息使用私钥进行RSA加密String orderInfo = orderParam + "&" + sign;new AliPayThread(orderInfo).start();  //支付行为需要在独立的非ui线程中执行}/*** 支付宝支付异步任务*/private class AliPayThread extends Thread {private String orderInfo;private AliPayThread(String orderInfo) {this.orderInfo = orderInfo;}@Overridepublic void run() {PayTask alipay = new PayTask(mthis);result = alipay.payV2(orderInfo, true);Log.i("zjp", "result=" + result.toString());Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;/***  官方result返回结果参考:https://docs.open.alipay.com/204/105302*  我这里返回到result格式为:*      {resultStatus = 9000, result = {"alipay_trade_app_pay_response": {"code": "10000","msg": "Success","app_id": "2017112400138529","auth_app_id": "2017112400138529","charset": "utf-8","timestamp": "2018-01-29 14:46:33","total_amount": "0.01","trade_no": "2018012921001004940219217398","seller_id": "2088821472668202","out_trade_no": "0129144616-2725"}*/Log.d("zjp", "result=" + result);mHandler.sendMessage(msg);}}@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) { switch (msg.what) {case SDK_PAY_FLAG:// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签Map<String, String> mapPayResult = (Map<String, String>) msg.obj;String resultStatus = mapPayResult.get("resultStatus");// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表参考:https://docs.open.alipay.com/204/105301if (TextUtils.equals(resultStatus, "9000")) {showToast("支付成功");EventBus.getDefault().post(new PayResultEvent());//支付成功后,发个通知} else {// 判断resultStatus 为非“9000”则代表可能支付失败// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)     if (TextUtils.equals(resultStatus, "8000")) {showToast("支付结果确认中");} else if (TextUtils.equals(resultStatus, "6001")) { //用户中途取消showToast("取消支付");} else {// 其他值就可以判断为支付失败showToast("支付失败");}}break;}}}

OrderInfoUtil2_0.java:

/*** Created by zjp on 2017/12/19 15:13.*/public class OrderInfoUtil2_0 {/*** 构造支付订单参数列表*/public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2, String price) {Map<String, String> keyValues = new HashMap<String, String>();keyValues.put("app_id", app_id);keyValues.put("biz_content", bizCotent(price));keyValues.put("charset", "utf-8");keyValues.put("method", "alipay.trade.app.pay");keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");keyValues.put("timestamp", "2016-07-29 16:55:53");keyValues.put("version", "1.0");return keyValues;}public static String bizCotent(String price) {// 设置未付款交易的超时时间// 默认30分钟,一旦超时,该笔交易就会自动被关闭。// 取值范围:1m~15d。// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。// 该参数数值不接受小数点,如1.5h,可转换为90m。String bizValue = "{\"timeout_express\":\"15m\",";bizValue += "\"product_code\":\"QUICK_MSECURITY_PAY\",";// 商品金额bizValue += "\"total_amount\":" + "\"" + price + "\",";// 商品名称bizValue += "\"subject\":" + "\"" + "兔泊哥停取车交付款" + "\",";// 商品详情bizValue += "\"body\":" + "\"" + "兔泊哥停取车付款界面" + "\",";//商户网站唯一订单号bizValue += "\"out_trade_no\":" + "\"" + getOutTradeNo() + "\"}";return bizValue;}/*** 要求外部订单号必须唯一。*/public static 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);return key;}}

AlipayConfig.java:

 /*** Created by zjp on 2017/12/19 15:11.*/public class AlipayConfig {/*** 支付宝支付业务:入参app_id,上文创建应用时候,已经得到* 由于App支付功能需要签约,因此需要上传公司信息和证件等资料进行签约* 以下参数,由上传完整公司信息后即可得到*/public static final String APPID = "XXXXXXXXXXXXX";// 商户PIDpublic static final String PARTNER = "XXXXXXXXXXXXX";// 商户收款账号public static final String SELLER = "XXXXXXXXXX";/*** 支付宝账户登录授权业务:入参target_id值* 可以用时间戳*/public static final String TARGET_ID = OrderInfoUtil2_0.getOutTradeNo();/** 商户私钥,pkcs8格式 *//** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 *//** 如果商户两个都设置了,优先使用 RSA2_PRIVATE *//** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE *//** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, *//***  使用支付宝提供的工具生成RSA公钥和私钥*  工具地址:https://doc.open.alipay.com/docs/doc.htmtreeId=291&articleId=106097&docType=1*/public static final String RSA2_PRIVATE = "XXXXXXXXX";public static final String RSA_PRIVATE = "";}

至此,支付宝支付代码已完成!

希望可以帮助大家
如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议!

作者:三胖是个瘦子
链接:https://www.jianshu.com/p/dd2d63be2b4c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android App接入支付功能相关推荐

  1. Android App接入支付功能——支付宝支付

    接入前准备 接入APP支付能力前,开发者需要完成以下前置步骤. 本文档展示了如何从零开始,使用支付宝开放平台服务端 SDK 快速接入App支付产品,完成与支付宝对接的部分. 接入准备--支付宝开发能力 ...

  2. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  3. android自动微信支付平台,Android实现微信支付功能

    开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要获得微信支付接口权限,然后获取对 ...

  4. 字节跳动小程序接入支付功能

    我个人博客文章地址:字节跳动小程序接入支付功能 这个文章只是我做完支付后的总结,尽量写的简单易懂,也是方便自己以后忘了看一眼就能懂

  5. 网站接入支付功能完整教程

    大家好,今天给大家带来网站接入支付功能的演示.本例用支付宝演示. 自己开发的网站,需要对接支付宝支付功能需要的几个条件. 1.支付宝开放平台注册账号(支持个人账号),开通自己应用功能权限(小程序.网页 ...

  6. Android APP微信支付开发的步骤

    1.我们看官方文档的步骤 APP端开发步骤: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 在微信开放平台(https: ...

  7. Android App接入Facebook分享SDK,概率性无法启动Facebook客户端的问题分析

    问题来源 由于我司的android app产品主要是面向海外,因此,app中的分享功能接入facebook分享是必不可少的.最近在接入facebook android sdk进行分享时,发现一个非常奇 ...

  8. android支付宝接入支付问题ali40247

    前言:继续来研究支付宝接入时候遇到的问题. 问题截图: 解决方案: 这里给大家一个详细分析的链接,可以看这里详细了解支付宝ali40247解决方案 听我说: 1.首先你需要确定的是你接入使用的是sdk ...

  9. 互联网产品接入支付功能如何测试?

    现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能.比如:做商城的,做游戏的以及其他在线交易的网站.APP等.如果支付出了问题,或者用户拿少的钱通过篡改请求数据购买大金额的商品,如果是实物的话 ...

最新文章

  1. (已解决)ImportError attempted relative import with no known parent package
  2. PHP 知识点笔记-常用数据类型
  3. zlggui菜单12864_lcddrive.h
  4. 新手學python之新體驗
  5. tornado学习笔记18 _RequestDispatcher 请求分发器
  6. 未能使用“Csc”任务的输入参数初始化该任务
  7. BZOJ-3289-Mato的文件管理-莫队+树状数组
  8. yii框架下使用redis
  9. 动态换ip如何实现_动态IP可以实现哪些功能及用途
  10. OpenVINO主要工作流程
  11. 【医学图像分割】基于matlab磁共振成像 (MRI) 数值模拟平台【含Matlab源码 826期】
  12. 如何成为一个很厉害的人?采铜详述13个思维法则
  13. python上传文件到OSS
  14. Java语言实现文本转语音
  15. centos----tftpd配置
  16. 总管家云CRM:客户不跟踪,销售一场空
  17. 使用内网穿透实现外网访问内网地址
  18. 如何判断患者服用的温度敏感性药品依旧安全有效?
  19. 从师傅到伙伴:华为背后总是有IBM的影子
  20. 搭建完全分布式HBase

热门文章

  1. 用adb pull复制Android手机里的文件到服务器遇到system/bin/sh: adb: not found
  2. 使用UniApp 编写APP
  3. python分割pdf文档
  4. html div浏览器居中显示,IE浏览器DIV居中实现方法
  5. Excel VBA 中有关使用 UBound + CurrentRegion 提示类型不匹配的问题及解决方案
  6. 2022年最新浙江机动车签字授权人模拟试题及答案
  7. 因为有太多的无奈,我选择了逞强
  8. 机器学习笔记 - 互信息Mutual Information
  9. 移动端天气系统--【下雨】效果之【雨滴】的实现和分析
  10. 在线教育未来的发展前景如何?