Android 集成支付宝支付,支付宝支付2.0

成功起调支付宝支付

下载支付sdk复制到libs文件夹下并add  as library:https://docs.open.alipay.com/54/104509

 

1、首先申请支付宝 企业账户  链接:https://memberprod.alipay.com/account/reg/enterpriseIndex.htm

     备注:企业账户是以邮箱申请

2、1登录支付宝企业账户,到产品中心创建   APP支付  产品

2 、2创建  APP支付 成功得到收款账户

3、打开手机支付宝APP扫描登录 蚂蚁金服|开发平台  链接https://auth.alipay.com/login/index.htm?goto=https%3A%2F%2Fdocs.open.alipay.com%2F204%2F105297%2F

登录后,点击  管理中心——>网页&移动应用——>支付接入——创建应用

创建成功,并签约 APP支付,显示已签约则成功

4、设置密钥,及APPID

鼠标放到【主账号】上,下拉,点击  密钥管理,,,,注意是mapi网关下的密钥

设置应用公钥:https://docs.open.alipay.com/291/105971

 

5、实现activity代码:

public class MainActivity extends AppCompatActivity {// 支付宝KEYpublic static final String PARTNER = "2088331094298926";//蚂蚁金服|开放平台   密钥APPIDpublic static final String SELLER = "200970769@qq.com";//支付宝企业账户public static final String RSA_PRIVATE ="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqBQZ8p0X+AB5so6Gfb3JWihBJHKwlzA8Gaj/pz4VwskubWqgDjMmGw9TWhSuQezbX8BVogdJz9vYkgb2WnTVoOd3" +"bD0JvemfW+CBZzmHpjCFEWuT0l8wcnoJuF8vlUztHoscqJbZNJO/MXe3SQq0/qXt/gV5yEzScwdlbfuifK8jAhGmyUxYzKDMsfpfhlYJlkSFxmegDmNb8d+xsQZdrmESYop9tf60fdFwikqy1U09hXdNeC5XdClgLy8ihge9sf8j5vLPKr" +"PhDlC/WoDYnuUNylHmRO78EscNRa89AMiwARsX3pI7Hp5jvHku7m6EFzAJIpRHgi1mT8HMbP+eLAgMBAAECggEAAQRWrZgyivplNDEmXlXEUVAyGL3bKb62uEsaZsOfALWQTjWUm7DT48J4G3BgelTCVzhQaHeeUqM/hahhAe2ezCjMcur8cr5A" +"sMB7MQ5S95qm+Emy5OOjjOhFz3LE/XIqAJuwpUfkd0GpTYeiTIepkZ/p5TFY50XGIsnmCu4PZiRSZ46SGe9TU1ko79p7seyrhNy8d1nxYPF37q/8+3MlEZv60btY+bD42KCF0Be48UHjq7rbDcX1IUoiCR+63j9hwfMH0bZ7eTzlAxrFbqjViadyDBF" +"VdubMVgBy0o/CSslc1aa+HRmNrEVd3k+P+nn556zOgvIPy17Ek62JCm59AQKBgQDZ5b0nK4ot6gIkqWzaJvOcyUX0C1mMxQQSc/criShE90Vn45NEVRJ79Ypn9+0pDuG/d+0XvTXp8C/OAfIuGF+MsjDPqBpLuTvFf65lGUfCJ4kjgX+36jBjt1czCAh" +"/bDaa8I1c+qyXA1okms9rd2BqkzCvUB8sURXYwl3QiXNL2wKBgQDHwATe7lfB99odhg9se7M9bRtKE7LRhd1Wt5NBQQ6I0a4Cxe49rqo6kYJ7mfhuHMHvgemwxL7gqWqnQiqWocmQ4Po6I7kkVR6/07Zrw7PAvj1hkNUP3brgARYbYdMUsj+7gFOvnyUtb" +"rnFhQGgPbr2rOrgMZ461FD3Ynqn0Mz6EQKBgQCptgoRTBQflrd8noktkFEFuK5HWd+xiHGXfcLxoa4/qOfh9pppCmmPKrtWJwAMjo69dkavyqsHPg+9wD5EMK+bAd6Knj984xTuynemPn5pdimWAfLb6AcwY0gDcypLNJmDLACufn+WTwISqJEM/rmVyHaO1T" +"Sya6U8YoZ3OdcXKQKBgEzPYNAc1LAoz73EnE+57X20Y+cDViLNmARNiRlxm9Yu0vwMAoXDkX/+Di/bUDV/Z2/jA+rObRvU6ccxYVEVG35TlMUgkYQQG0fmcGJWGdwHC3FmERgNylty735OCq4NsQY33XZN+yzSRCtY7vwgYLGUYqkdS1wR4qSOQN4hI4ERAoGBAL" +"I32L4Hlg368da50Z+oc/BT/4sWTnwSLDJJt48ZTrzvYGBgX9A4tWKmBWDbGNKKE76RcBBT7xntfOnf6x/I3mhPp+gmkSCC3FB7NCV7kkRI/1mj/i7y7f+KYk8zHd+VQyV+vGYHRmLgn9WhCv+qPNNC3Abm2qHMJF6FD2tmiOgS";//蚂蚁金服|开放平台  RSA(SHA256)密钥(推荐)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = (TextView)findViewById(R.id.myte);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {aliPay();}});}/*** 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\"";
//        return "sign_type=\"RSA2\"";}//支付宝private void aliPay() {// 调用接口传值String name = "天鑫网吧充值订单";String money = "0.01";String orderInfo = getOrderInfo(name, name, money);// 创建订单信息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(UpgradePayActivity.this);
//                // 调用支付接口
//                String result = alipay.pay(payInfo, true);
//                Message msg = new Message();
//                msg.what = SDK_PAY_FLAG;
//                msg.obj = result;
//                handler.sendMessage(msg);DoPaymentTask paymentTask = new DoPaymentTask();paymentTask.execute(payInfo);}};Thread payThread = new Thread(payRunnable);payThread.start();}public String getTime(){long time=System.currentTimeMillis()/1000;//获取系统时间的10位的时间戳String  str=String.valueOf(time);return str;}/*** 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=" + "\"" + getTime()+ "\"";// 商品名称orderInfo += "&subject=" + "\"" + subject + "\"";// 商品详情orderInfo += "&body=" + "\"" + body + "\"";// 商品金额orderInfo += "&total_fee=" + "\"" + price + "\"";// Constants.PAY_CHANGE_URL+"?code=alipay&user_id"// 服务器异步通知页面路径
//        orderInfo += "&notify_url=" + "\"" + "https://open.tencent.com/" + "\"";// 接口名称, 固定值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\"";// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空orderInfo += "&return_url=\"m.alipay.com\"";// 调用银行卡支付,需配置此参数,参与签名, 固定值// orderInfo += "&paymethod=\"expressGateway\"";return orderInfo;}private class DoPaymentTask extends AsyncTask<String, Void, Map<String, String>> {@Overrideprotected Map<String, String> doInBackground(String... params) {// 构造PayTask 对象PayTask alipay = new PayTask(MainActivity.this);// 调用支付接口,获取支付结果Map<String, String> result = alipay.payV2(params[0], true);return result;}@Overrideprotected void onPostExecute(Map<String, String> result) {@SuppressWarnings("unchecked")PayResult payResult = new PayResult(result);/**对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();Log.i("lgq支付宝支付响应状态", resultStatus);if (resultStatus.equals("6001")){Toast.makeText(MainActivity.this,"支付取消",Toast.LENGTH_SHORT).show();}// 判断resultStatus 为9000则代表支付成功if (TextUtils.equals(resultStatus, "9000")) {Toast.makeText(MainActivity.this,"支付成功",Toast.LENGTH_LONG).show();// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
//                verifyPay();} else {// 该笔订单真实的支付结果,需要依赖服务端的异步通知。// 判断resultStatus 为非“9000”则代表可能支付失败// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)if (TextUtils.equals(resultStatus, "8000")) {
//                    if (payResultListener != null) {
//                        payResultListener.onProcess();
//                    }} else {// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
//                    if (payResultListener != null) {
//                        payResultListener.onFail();
//                    }}
//                9000 订单支付成功
//                8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
//                4000 订单支付失败
//                5000 重复请求
//                6001 用户中途取消
//                6002 网络连接出错
//                6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
//                其它   其它支付错误}}}
}

 

工具类

SignUtils
public class SignUtils {private static final String ALGORITHM = "RSA";private static final String SIGN_ALGORITHMS = "SHA1WithRSA";private static final String DEFAULT_CHARSET = "UTF-8";public static String sign(String content, String privateKey) {try {PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);PrivateKey priKey = keyf.generatePrivate(priPKCS8);java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);signature.initSign(priKey);signature.update(content.getBytes(DEFAULT_CHARSET));byte[] signed = signature.sign();return Base64.encode(signed);} catch (Exception e) {e.printStackTrace();}return null;}}

 

demo链接:https://download.csdn.net/download/meixi_android/10723852

 

在线交流bug:qq1085220040

 

2、支付宝支付2.0

账号申请与1.0一样,集成比1.0更高效简洁

权限:

<uses-permission android:name="android.permission.INTERNET"/>

1、引入支付宝SDK2.0

下载SDK链接:https://download.csdn.net/download/meixi_android/11362258

添加步骤:

(1)下载支付宝SDK2.0aar文件复制到libs文件夹下

(2)添加app的build.gradle下添加配置

// 支付宝 SDK AAR 包所需的配置
compile (name: 'alipaySdk-15.6.4-20190611174341', ext: 'aar')

(3)在项目的build.gradle文件夹下添加配置

allprojects {repositories {// 支付宝 SDK AAR 包所需的配置flatDir {dirs 'libs'}

2、实现代码:

(1)五个工具类都是固定值,直接cp可用

(2)activity代码实现调用支付宝支付 

/*** 支付宝支付业务示例*/
public void payV2(View v) {if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {showAlert(this, "支付参数缺失");return;}/** 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;* 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;** orderInfo 的获取必须来自服务端;*/boolean rsa2 = (RSA2_PRIVATE.length() > 0);Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);String orderParam = OrderInfoUtil2_0.buildOrderParam(params);String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);final String orderInfo = orderParam + "&" + sign;final Runnable payRunnable = new Runnable() {@Overridepublic void run() {PayTask alipay = new PayTask(MainActivity.this);Map<String, String> result = alipay.payV2(orderInfo, true);Log.i("msp", result.toString());Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();
}

 

支付宝支付2.0demo:https://download.csdn.net/download/meixi_android/11362574

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker centos node nginx

1、docker pull centos:centos8 2、进入容器 docker run -it centos:centos8 /bin/bash 3、安装git yum install -y git 4、安装nvm git clone https://github.com/creationix/nvm.git source nvm/nvm.sh 5、修改环境变量 vi ~/.bash_profile 加入source nvm/nvm.sh 更新 sour…

Appium——api常用函数

appium常用函数介绍&#xff1a;获取页面信息&#xff1a;1、 def get_current_activity(cls, driver):获取当前页面的activity:param driver::return:return driver.current_activity2、 def get_current_pagesource(cls, driver):获取当前页面源码:param driver::return: 返回…

工作183:动态渲染数据 数据在数字字典里面

1接口调用 /*调用接口*/created() {/*动态渲染content_type接口*/getAction("/dict/list",{dict_code:"content_type"}).then(res>{this.content_typeres.data})/*动态渲染*/getAction("/dict/list",{dict_code:"resource_type"})…

Android 集成微信支付详解

打包后才能起调支付 微信支付成功起调 微信skd下载&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter11_1 签名APK下载&#xff1a;https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk 1、首先到微信.…

工作184:自定义事件

1子组件 mongo.vue <template><button click"eat">按钮</button> </template><script> export default {created() {this.$on("eat", function(fruit) {console.log("子组件接收自己发射的事件");});},methods:…

cesium label 显示隐藏到地底下

今天在写label的时候&#xff0c;发现高度为0时&#xff0c;label显示不全&#xff0c;影响用户体验&#xff0c;代码如下&#xff1a; window.labelEntity viewer.entities.add({label: {show: false,showBackground: true,font: "14px monospace",horizontalOrigi…

工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题

1组件 <el-form-item label"所属部门" :label-width"formLabelWidth"><select-form change"DepartmentList" v-model"form.department_id" /></el-form-item><!-- <el-form-item prop"business_module&…

Render errors:One or more layouts are missing the layout_width or layout_height attributes

Render errors:One or more layouts are missing the layout_width or layout_height attributes 2017年05月25日 11:55:19 邹奇 阅读数&#xff1a;4207 标签&#xff1a; android studioxmlRendererrorsattributes 更多 个人分类&#xff1a; 安卓开发技术学习 版权声明&a…

工作187:表单校验规则

第一种常用方式&#xff1a;表单上加rules&#xff5b;object&#xff5d; <el-form class"apply-form first-form" :model"formData" :rules"rule" ref"form"><el-form-item label"姓名" prop"visitorName&…

AndroidStudio关联svn并上传代码到svn服务器上,更换域名

SVN安装选项 到下图位置选择【command line client tools】前面的下拉框&#xff0c;选择【Will be installed on local hard drive】&#xff0c;一直下一步知道安装完成即可。 打开AndroidStudio&#xff0c;按CtrlShifS快捷键&#xff0c;进入Settings设置页面。如上图所示…

docker安装postgres

1、拉取 postgres镜像 docker pull postgres2、开启容器 docker run --name Postgres-0 -e POSTGRES_PASSWORDpassword -d -p 5432:5432 postgres:latest3、打开命令行 docker exec -it Postgres-0 bash4、切换为管理员用户 psql -U postgres5、查看用户 \du6、继续创建数…

MySQL并发复制系列一:binlog组提交 (转载)

http://blog.csdn.net/woqutechteam/article/details/51178803 MySQL Binary log在MySQL 5.1版本后推出主要用于主备复制的搭建&#xff0c;我们回顾下MySQL 在开启/关闭 Binary Log功能时是如何工作的 。 MySQL没有开启Binary log的情况下&#xff1a; InnoDB存储引擎通过re…

工作190:页面数据不显示

账户详情里面没有返回对应的字段 所以页面不显示

工作192:vue项目如何刷新当前页面

1.场景 在处理列表时&#xff0c;常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。 2.遇到的问题 1. 用vue-router重新路由到当前页面&#xff0c;页面是不进行刷新的 2.采用window.reload()&#xff0c;或者router.go(0)刷新时&#xff0c;整个浏览器进行…

CentOS挂Windows的NFS备忘

Windows NFS 安装和配置 注&#xff1a;需要将名称为“所有计算机”的访问类型改为“无访问权限”&#xff0c;再将可访问IP的访问类型改为“读写”&#xff0c;并勾选“允许根目录访问” &#xff0c;如WINDOWS有防火墙开放“2049”端口 CentOS需要开启两个服务&#xff1a; y…

Android2.2查看svn历史提交记录

一开始时是没有显示历史提交记录的&#xff0c;方法很简单 VCS--Subversion--ShowHistory,之后在下面的Version control就会显示“History-项目名”这个栏目&#xff0c;在这个栏目下面就可以查看提交的历史记录了 方法2&#xff1a; 对文件夹点右键&#xff0c;点击TortoiseS…

STM32 RS485 和串口 只能接收不能发送问题解决

串口 发送引脚要配置输出频率 否则配置不成功&#xff0c;导致只能接受不能发送转载于:https://www.cnblogs.com/yekongdexingxing/p/8078936.html

Android 折叠头部监听,抽屉式动画

实现方法2&#xff1a;https://blog.csdn.net/meixi_android/article/details/84136375 1、自定义scrollview,监听上下滑动距离&#xff1a; public class ScrollListenerView extends ScrollView {private ScrollListener scrollViewListener null;public ScrollListenerVie…