Android 接入微信支付宝支付
来源:互联网 发布:我的充气女友网络电影 编辑:程序博客网 时间:2024/04/30 00:32
按照惯例,首先通读一遍官网文档。
微信支付
前期准备
微信开放平台
注册账号,创建应用,开通微信支付,这些大家都会的。
微信商户平台
APP支付文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 ,如果仅按照文档来,保证每次支付结果都是-1,对,只有-1,没有任何其他信息,不得不说,坑比。
APP支付时序图
大概了解下支付流程:
接入SDK
引入libs
SDK下载:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 ,将libammsdk.jar放到libs文件夹下
配置debug签名
创建应用需要填写应用签名,配置在debug下直接用的正式的key,这样就不用每次打包才能调起微信客户端
signingConfigs { debug { storeFile file("你的keystore路径") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } release { storeFile file("你的keystore路径") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" }}
WXPayEntryActivity
这个文档没有半点介绍,WXPayEntryActivity是支付结束的回调,和微信分享WXEntryActivity类似,必须放在包名.wxapi下,页面可以自己写。
AndroidManifest.xml中注册
<!-- 微信支付 --><activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>
网络权限注册不用说了。
支付接口调用
/** * 微信支付 * @param data接口返回 */private void weixinPay(String data) { // 通过WXAPIFactory工厂,获取IWXAPI的实例 IWXAPI api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID); // 将该app注册到微信 api.registerApp(WEIXIN_APP_ID); LogUtil.d("data=" + data); try { JSONObject json = new JSONObject(data); PayReq req = new PayReq(); req.appId = json.getString("appid"); req.partnerId = json.getString("partnerid"); req.prepayId = json.getString("prepayid"); req.nonceStr = json.getString("noncestr"); req.timeStamp = json.getString("timestamp"); req.packageValue = json.getString("package"); req.sign = json.getString("sign"); req.extData = "app data"; // optional // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 api.sendReq(req); } catch (JSONException e) { e.printStackTrace(); }}
为了安全,APP端调起支付的参数需要商户后台系统提供接口返回,参数说明文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
问题
以为这样就可以调起微信客户端支付了,没有想到一直返回支付结果为-1,没有多余的信息提示,不亏是微信,Android代码就是简洁!我们看到文档返回-1的提示“可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。”,我反复检查签名、APPID均没有错误,后台也确定sign信息正确,哎,我表示很无奈,iOS也调用了,他们提示”支付场景非法“,原来是由于后台之前做web支付,trade_type没有改成APP,改了我这边就能正常调起了。
支付宝接入
前期准备
注册账号,创建应用,开通支付功能,这些也不说了。
接入文档
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7386797.0.0.Eky59h&treeId=59&articleId=103563&docType=1
支付交互流程
接入SDK
SDK下载:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Q5gnm8&treeId=193&articleId=104509&docType=1 ,
将alipaySdk-xxxxxxxx.jar包放到libs文件夹下
AndroidManifest.xml
添加权限
<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" />
添加声明
<!-- 支付宝 alipay sdk 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>
支付接口调用
支付行为需要在独立的非ui线程中执行,代码如下:
private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case 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(mActivity, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 Toast.makeText(mActivity, payResult.getMemo(), Toast.LENGTH_SHORT).show(); } break; } default: break; } } ; }; /** * 支付宝 */ private void alipay(final String orderInfo) { Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(mActivity); 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(); }
同样为了安全,这里orderInfo是后台接口返回,参数说明文档:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.DwA283&treeId=59&articleId=103663&docType=1
这样就over了,相比于微信支付,简单的不能再简单。
联系我
我的微信公众号:吴小龙同学,欢迎关注交流~
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 接入微信支付宝支付
- Android 微信支付和支付宝支付 快速接入
- Android 微信支付和支付宝支付 快速接入
- Android 微信支付和支付宝支付 快速接入
- Android接入微信支付和支付宝支付(1)
- Android接入微信支付和支付宝支付(2)
- 支付宝支付接入+微信支付
- Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法
- Android 微信支付接入
- Android 接入微信支付
- Android 接入微信支付
- Android微信支付接入
- ubuntu 安装 docker以及docker-compose
- Swift的小技巧(周三贴)
- Java基础-常用util2 Calendar
- ionic-基于javascript实现超级好用的移动端图像裁剪上传
- 【pta】实验2-1-4 计算平均分
- Android 接入微信支付宝支付
- [Storm]用代码提交拓扑,自动从jar包中扫描拓扑实现接口
- 使用WakeLock使Android应用程序保持后台唤醒
- 百度地图+定位
- vue.js 2.0父子组件学习入门套路(推荐相关阅读)
- Excel表格数据怎么行列倒置,怎么行列切换
- Tomcat性能优化
- 机器学习实验(十一):基于WiFi fingerprints用自编码器(Autoencoders)和神经网络(Neural Network)进行定位_2(keras版)
- excel match 某个值是否在特定列