Android支付(支付宝,微信,银联)集成使用
来源:互联网 发布:摄像机ntp端口号 编辑:程序博客网 时间:2024/05/18 00:15
关于Android支付(支付宝,微信,银联),在做过的项目中都有涉及过,无非就是按照其官方开发文档来写,但是不乏有许多坑的地方。这里趁着闲暇时间来写出来,如果有些的不正确的地方请大家及时提出来,谢谢!(这里只是简单的集成和使用,具体的按需求来)
一,支付宝
先看交互流程(重要)
1.准备
①创建应用(生成APPID),登录https://openhome.alipay.com/platform/appManage.htm
最后上传应用图标,填写回调接口地址和设置公钥后提交审核即可,审核通过后就会如第一张图所示。
②生成公钥和私钥
生成公钥和私钥,请查看https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
当生成后,公钥和私钥(请勿丢失)会在以下图中的目录中
2.集成
①导入jar包,这里可以到https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1下载,然后导入即可
3,使用
① 在AndroidManifest.xml配置
1》权限
<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》Activity
<!--Alipay begin--> <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> <!--Alipay end-->
②复制需要的文件,可以参考官方Demo
这里我将开发所需的APPID和私钥为方便写在了本地,这里不推荐,不太安全。
4,调用
调用方法
AlipayApi.AliPay(this,mHandler, "这里传入商户后台返回的订单信息"); //注意:后台返回的订单信息是根据一定的格式拼接的
public class AlipayApi { public static final int SDK_PAY_FLAG = 1; public static final int SDK_AUTH_FLAG = 2; public static void AliPay(final Activity mContext, final Handler mHandler, final String orderInfos) { if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) { new AlertDialog.Builder(mContext).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { mContext.finish(); } }).show(); return; } 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; Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(mContext); 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(); }}
支付回调(异步)
/** * 支付宝支付通知 * 注意:在新版支付宝中,异步通知商户后台的接口在支付宝平台配置的"接口回调地址"中配置,这里就不像老版本一样需要在代码中配置 */ @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case AlipayApi.SDK_PAY_FLAG: { @SuppressWarnings("unchecked") PayResult payResult = new PayResult((Map<String, String>) msg.obj); /** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为9000则代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); //支付成功操作 } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); //支付失败操作 } break; } case AlipayApi.SDK_AUTH_FLAG: { @SuppressWarnings("unchecked") AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true); String resultStatus = authResult.getResultStatus(); // 判断resultStatus 为“9000”且result_code // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档 if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) { // 获取alipay_open_id,调支付时作为参数extern_token 的value // 传入,则支付账户为该授权账户 Toast.makeText(MainActivity.this, "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT) .show(); } else { // 其他状态值则为授权失败 Toast.makeText(MainActivity.this, "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
注:关于订单信息这块,可以是商户后台按照一定的格式传入,也可以是Android开发者按照官方文档来进行拼接,具体的就不在描述。
最后集成和使用完成。
二,微信
更新中……
三,银联
银联支付请查看该地址:http://www.devstore.cn/evaluation/testInfo/98-133.html
- Android支付(支付宝,微信,银联)集成使用
- android集成支付,支付宝,微信
- 【Android实战】移动支付(微信、支付宝、银联)集成
- Android 支付宝和微信支付集成
- Android 支付宝和微信支付集成
- Android应用集成微信、支付宝支付
- Android 集成微信支付和支付宝
- Android 支付宝和微信支付集成
- Android集成微信和支付宝支付
- Android 支付宝和微信支付集成
- Android 支付宝 微信 银联 支付
- android集成微信支付(全是坑)
- android集成微信支付
- android集成微信支付
- Android 微信支付集成
- android集成微信支付
- Android集成微信支付
- Android微信支付集成
- 浅谈JavaScript元素的尺寸和位置相关属性
- JavaEE学习之JPA中配置文件persistence.xml(JTA与一种方式)
- eclipse查看源代码
- 合肥庐阳经开区举办2017年首期企业家培训班
- 多样式文本SpannableString
- Android支付(支付宝,微信,银联)集成使用
- 某企业级hadoop源代码分析-3
- 【笔试】Java 二分查找(递归,非递归)
- Matlab中计算程序运行时间的三种方法
- oracle11g延迟段问题
- spring cloud笔记
- IDEA+Tomcat+JRebel热部署
- GNU Autoconf Introduction
- css引用的两种方式,link和@import的区别