第三方支付之支付宝支付
来源:互联网 发布:深圳淘宝化妆品销售 编辑:程序博客网 时间:2024/04/30 15:09
前言
App开发中用到的支付有支付宝、微信、银联卡、pos等,但最常见的方式就是支付宝和微信支付,尤其电商项目。闲来没事总结一下,以下是集成支付宝支付的个人心得。
首先App添加支付宝支付功能,需要满足两点条件。
1:签约成为支付宝商户
签约地址:https://b.alipay.com/, 只有成为签约商户的开发者才能具备集成支付宝app支付的资格。 签约资料:1)营业执照 2)APP说明文档 3)商户经营信息、商户联系人等信息
2:集成APP代码
2.1:导入jar包资源
Eclipse将lib包复制到lib文件夹下,Android studio在gradle中可以添加依赖
compile files('libs/alipaySdk-20160223.jar')
2.2:修改AndroidManifest.xml清单
声明activity
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" >
<activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" >
添加权限
<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" />
2.3:根据情况添加支付宝混淆规则
2.4:添加主要代码(重要)
主要流程分为:
1:app通过下单调用后台接口,然后后台服务器返回签名后订单信息
2:app调起支付宝支付,传签名的订单信息,用户输入支付宝密码进行支付
3:支付宝返回支付结果,app进行支付结果展示,支付宝服务端异步回调商户服务端即我们自己后台服务端,后台更改订单状态
生成签名后的订单信息官方建议安全起见,在后台服务端生成,在此我在app端生成方面讲解整个流程。
//生成订单所需信息public String getOrderInfo(String order_id,String order_sn, String price) { // 签约合作者身份ID String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\""; // 签约卖家支付宝账号 orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_SELLER + "\""; // 商户网站唯一订单号 orderInfo += "&out_trade_no=" + "\"" + order_id+"-"+getTimeByCalendar()+ "\""; // 商品名称 orderInfo += "&subject=" + "\"" + order_sn + "\""; // 商品详情 orderInfo += "&body=" + "\"" + order_id + "\""; // 商品金额 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服务器异步通知页面路径 orderInfo += "¬ify_url=" + "\"" + payUrlBean.getAlipay_order_pay_notify() + "\""; // 服务接口名称, 固定值 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;}// 对订单信息做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();
然后app需要调起支付宝上传订单信息
Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(OrderConfirmActivity.this); boolean exist = alipay.checkAccountIfExist(); // 调用支付接口,获取支付结果 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();
根据支付宝返回的支付结果展示信息
private Handler mHandler = new Handler() { @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { case RQF_PAY: //支付成功 break; case RQF_LOGIN: //支付失败 break; 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(OrderConfirmActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); //支付成功 } else { // 判断resultStatus 为非“9000”则代表可能支付失败 // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(OrderConfirmActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 Toast.makeText(OrderConfirmActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); } } break; default: break; } };};
这就是整个支付流程,最后附上支付宝官网文档及demo
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.7WO30X&treeId=59&articleId=103658&docType=1
0 0
- 第三方支付之支付宝支付
- 第三方支付之支付宝支付
- 安卓第三方支付之支付宝支付
- 第三方支付宝支付
- 第三方支付宝支付
- iOS 第三方支付 支付宝支付
- 第三方支付支付宝支付
- 第三方支付之微信支付
- 第三方支付之微信支付
- android 第三方支付之支付宝使用详解
- ThinkPHP5之app第三方支付宝支付
- 第三方支付之微信支付(扫码支付)
- iOS第三方支付(支付宝SDK)
- iOS第三方支付(支付宝)
- iOS第三方支付(支付宝SDK)
- 支付宝第三方支付 平台
- iOS第三方支付(支付宝)
- android 支付宝第三方支付
- Android国内一线互联网公司内部面试题库
- 52. N-Queens II
- hdoj 1698 Just a Hook
- CodeForces 597BRestaurant(饭店准备餐桌问题)
- 从0开始的机器学习的学习
- 第三方支付之支付宝支付
- 7.13 编写一个程序,将两个字符串连接起来,不要用strcat函数。
- 改善java程序之java通用方法和准则
- ionic run android failed, error gradle line 64
- 项目管理过程组(5)与知识领域(10)
- Linux环境搭建
- js基础学习之--BOM基础知识总结
- 改善java程序之类、对象及方法
- linux 操作系统中压缩与解压缩命令的使用