前言
这里开篇讲解一系列的Android相关的移动支付。移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能。包括远程支付(网上支付、短信支付),近场支付(刷卡、滴卡、pos机)。
国内的移动支付方式:
支付宝,微信,银联,百度钱包,QQ钱包,财付通,京东支付
易宝支付,快钱支付,还有一些第三方的支付什么连连支付之类的
*的移动支付方式(这里直说一个) :paypal
流程
我们这里主要是来学习一下支付宝,微信支付,银联支付和paypal支付
现实生活中的支付就是:去商店浏览商品->把商品加入购物车->把购物车中的商品拿到收银台付款
上面的支付流程细化下来就是:
1.浏览商品
2.把要买的商品加入购物车
3.把商品拿到收银台,收银人员处理商品信息
4.告诉收银员支付方式
5.选择支付方式进行支付
6.处理支付结果(成功、失败、取消)
程序中的支付流程中:
1.浏览商品
2.把要买的商品加入购物车
3.把购物车中的商品信息和用户信息和支付方式等信息发送到自己服务器,服务器处理商品信息生成订单,并返回”支付串”给客户端
4.客户端拿着“支付串”,调用第三方服务(支付宝、微信、银联、paypal等)完成支付
5.处理支付结果(成功、失败、取消)
l 同步返回:支付后通知我们的客户端
l 异步通知:支付后通知我们的服务端
以上就是一般的移动支付的基本流程了,下面看这几个支付平台的详细介绍
android移动支付——支付宝支付
android移动支付——微信支付
android移动支付——银联支付
android移动支付——PayPal支付
场景介绍:
适用于商户在移动端APP中集成微信支付功能。
商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。
详细:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
业务流程:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
微信多种支付模式:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=2_1
商户账号获取方式:
http://kf.qq.com/faq/140225MveaUz140926ni2ERR.html
结算规则、费率、周期:
http://kf.qq.com/faq/140225MveaUz1504092YFjeM.html
微信开发工具包和范例代码demo:
开发步骤
1. App微信商户申请(申请步骤)
重点是:申请审核服务费300/次才可以使用微信支付功能,获得AppID
另外微信支付有两个平台分别是开发者平台和商户平台
开发者平台:主要是针对开发者,比如:创建应用,获取appid
商户平台:主要是商户上面的一些管理,比如:可以查看流水,订单呀
2. 创建应用:
需要的平台,以及平台的信息,填入包名,签名,最后提交审核,等待审核完后,大概就可以看到这样的基本信息界面
个人账号创建的应用审核通过后只有分享功能,如果还需要支付功能,可以点击申请,然后认证账号并上传一些资料,等待审核成功
3. 上面有列出微信的一些工具等东西,下载好demo,导入demo并且运行:
Demo可以完全支付了说明现在的Demo就已经完全配置好了微信的开发环境了,我们只需要参照这个Demo去配置我们自己的项目即可。
注:测试的Demo只支持调起一次微信支付,如需第二次可在系统设置中清除微信缓存数据即可
4. 后台设置
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
5. 配置微信开发环境:
a)把微信Demo中的“libammsdk.jar”复制到我们的项目libs文件夹中
b)把微信Demo中的清单文件AndroidManifest中的权限复制到我们的项目中
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
c)把微信Demo中的清单文件AndroidManifest中声明的支付相关的Activity声明复制到我们的项目中。注意,微信支付需要的Activity比较特殊,只需要一个(WXPayEntryActivity),这个Activity用于接收微信支付结果,这个Activity不是在jar包中的,是在Demo源码中的,我们需要把Demo中的这个Activity复制到我们的项目中,而且包名要保持不变,直接打开WXPayEntryActivity.java文件,Ctrl + A复制所有源码,然后在我们的项目src下直接粘贴,这样会自动创建和原来一样的包名。
在这个类中需要注意的地方有两个:
(1)、这个类中的布局是可以自定义的,如果你不需要展示什么布局,而是要跳转页面,把这段代码删除即可
(2)、回调结果的处理,下面是官方的处理方式,直接给了一个dialog,很多人会摸不着头脑,如果你不需要这个dialog,直接删除就好了
这里可以直接toast一下,如果你需要支付成功后跳转,那么直接在这里startActivity即可,别忘记最后要将这个页面finish()
6. 注册APPID
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPImsgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
7. 调起支付
商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码
注意:该sign生成字段名列表见调起支付API
8.支付结果回调,接收微信的请求及返回值
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准,详情请看5.--->c) ---> (2)
(1)还要在manifest文件里面加上exported属性,设置为true,例如:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
(2)实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
(3)在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:
当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。
回调中errCode值列表:
9.里面还有很多api可以调用,详情看开发者文档
10.微信支付接入不成功常见的问题
http://wxpay.wxutil.com/qa/index.php?qa=app_pay
11. 如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keepclass com.tencent.mm.sdk.** {
*;
}