Android接入支付宝和微信支付
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
前言
很多APP都需要支付功能,国内一般就是支付宝和微信了。目前这2种接入方式对于APP端来说都已经比较方便了,因为大部分的安全校验之类的逻辑都在服务端。
APP端总结起来就是三步走:
- 接入支付的库
- 接受服务端的订单信息,发起调用支付宝和微信
- 接收支付宝和微信的回调
支付宝接入
首先是接入支付宝的aar文件
比较坑的是支付宝还需要下载aar文件导入,而不是gradle里面一行依赖就能搞定的。
我们需要去官网下载最新的DEMO和SDK,官网地址在这里
然后把下载下来的aar包,放到项目目录下面的libs
目录下,通过下面的gradle依赖进来
// 支付宝 SDK AAR 包所需的配置 compile(name: 'alipaySdk-15.6.0-20190226104104-noUtdid', ext: 'aar')
调用支付宝SDK的方法发起支付
调用支付宝SDK发起支付,只需要一个参数,就是服务端返回的订单信息。所以这里的支付顺序是先要我们调用服务端的接口创建一个订单,然后服务端把订单信息返回给我们,我们APP拿着这个订单信息去调用支付宝支付。
//下面的orderInfo就是咱自己的服务端返回的订单信息,里面除了订单ID等,还有签名等安全信息 //使用方式基本按照支付宝的DEMO里面就行了 final Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(PayDemoActivity.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();
由上面的调用可见,支付宝是通过消息机制来接收回调的,所以我们得在Handler的消息中接收回调信息。
private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { //这里接收支付宝的回调信息 //需要注意的是,支付结果一定要调用自己的服务端来确定,不能通过支付宝的回调结果来判断 break; } default: break; } }; };
需要注意的是,支付结果一定要调用自己的服务端来确定,不能通过支付宝的回调结果来判断!
其他
实际情况里需要考虑用户手机上有没有安装过支付宝
- 已经安装过支付宝,会直接调用支付宝支付
- 没有安装支付宝,会调起支付宝的H5页面支付
以上就是支付宝的接入了,步骤还是比较简单的,也没有什么坑。下面的微信支付就有坑了...
微信支付接入
接入微信的SDK
相比于支付宝,微信接入SDK就比较简单了,一行代码搞定
//微信支付SDK compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
这里需要注意的是,微信的SDK里面支付和社交登录等这些是集成在一起的,无法分开。所以如果项目里之前已经集成过微信登录的话就不需要重复集成了!
调用微信SDK发起支付
String content = ... (这个是服务端返回的订单信息) //需要一个注册微信支付的APPID IWXAPI api = WXAPIFactory.createWXAPI(mContext, APPID); JSONObject json = new JSONObject(content); 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"); api.sendReq(req); //这里就发起调用微信支付了
接收微信支付的回调
可以看到上面的代码和支付宝就不一样了,没有用Handler。
微信支付比较特殊的一个地方是需要我们用一个特殊的Activity来接收回调的信息。这个处理不好很容易就碰到接收不到回调的情况。
我们需要新建一个名叫WXPayEntryActivity
的Activity,内容的话可以参考微信SDK里面的。需要注意的有几点:
- WXPayEntryActivity这个Activity的路径要符合要求,比如APP的包名是
com.niubi.company
,那这个Activity的路径就需要是com.niubi.company.wxapi.WXPayEntryActivity
- 这个WXPayEntryActivity当然需要在
AndroidManifest
文件中注册
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>
特别需要注意的是上面的exported
属性和launchMode
属性一定要加上,否则是接收不到回调的
- 我们在支付完成以后,一般是希望直接回到我们自己的应用里面。这个时候我们就需要让上面的
WXPayEntryActivity
不显示,否则就会闪一下或是停留在这个黑黑页面。
不显示的话要注意2点,一个是不要有布局,另一个就是要及时的finish
掉这个Activity
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ ... @Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { <!--AlertDialog.Builder builder = new AlertDialog.Builder(this);--> <!--builder.setTitle(R.string.app_tip);--> <!--builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));--> <!--builder.show();--> //这里肯定不能是像上面的DEMO一样弹出对话框了,而是通知我们发起支付调用的页面 //然后及时finish掉这个页面,贴个伪代码: sendPayNotice() finish(); } } }
其他
同样的,微信支付成功与否,也要通过调用自己的服务端来查看,而不能依赖微信的回调状态,这个要切记。
总结
以上就是微信和支付宝的支付接入,基本上按照上述步骤都不会有问题了。特别是微信支付,一定要特别注意文中提到的注意点,那些都是踩过的坑啊!
欢迎关注我的微信公众号,和我一起每天进步一点点!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android优化总结
目录介绍 1.OOM和崩溃优化 1.1 OOM优化 1.2 ANR优化 1.3 Crash优化 2.内存泄漏优化 2.0 动画资源未释放 2.1 错误使用单利 2.2 错误使用静态变量 2.3 handler内存泄漏 2.4 线程造成内存泄漏 2.5 非静态内部类 2.6 未移除监听 2.7 持有activity引用 2.8 资源未关闭 2.9 其他原因 3.布局优化 3.1 include优化 3.2 ViewStub优化 3.3 merge优化 3.4 其他建议 4.代码优化 4.1 lint代码检测 4.2 代码规范优化 4.3 View异常优化 4.4 去除淡黄色警告优化 4.5 合理使用集合 4.6 Activity不可见优化 4.7 节制的使用Service 5.网络优化 5.1 图片分类 5.2 获取网络数据优化 5.3 网络请求异常拦截优化 6.线程优化 6.1 使用线程池 7.图片优化 7.1 bitmap优化 7.2 glide加载优化 8.加载优化 8.1 懒加载优化 8.2 启动页优化 9.其他优化 9.1 静态变量优化 9.2 注解替代枚举 9.3 多渠道打包...
- 下一篇
Flutter 49: 图解 Flutter 与 Android 原生交互
小菜上一篇简单学习了一下 Android 原生接入 Flutter Module,现在学习一下两者之间的数据交互; Flutter 与 Android/iOS 之间信息交互通过 Platform Channel 进行桥接;Flutter 定义了三种不同的 Channel;但无论是传递方法还是传递事件,其本质上都是数据的传递; 1. MethodChannel:用于传递方法调用; 2. EventChannel:用于数据流信息通信; 3. BasicMessageChannel:用于传递字符串和半结构化的信息; 每种 Channel 均包含三个成员变量; name:代表 Channel 唯一标识符,Channel 可以包含多个,但 name 为唯一的; messager:代表消息发送与接收的工具 BinaryMessenger; codec:代表消息的编解码器; 小菜以上一节 Android 原生集成 Flutter Module 为基础,针对不同的 Channel 进行学习尝试;且小菜通过 View / Fragment / Activity 三种原生加载方式进行测试; MethodC...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块