关于在线支付平台,目前国内主要有以下几种 paypal 支付宝,财付通,盛付通,易宝支付,快钱,银联在线,国付宝,网易宝,汇付天下等等。

手机支付平台,调研了支付宝,支付宝,财付通,盛付通,paypal,易宝支付,银联在线,google in-app billing。其中盛大的盛付通不支持手机支付。其余都有手机集成服务。国内第三方平台的合作对象都是面向企业用户的,须实名认证。首先需要在网站上进行合作签约,签约之后才能获得相应的id和key。必须使用企业账户才能签约,没有面向个人用户的服务。Google提供的支付平台是可以供单个开发者集成的,但是是以google play客户端为依托的。

同时调研了几种主流购物类app支付平台的集成情况。其中 京东使用的是银联在线,当当使用的快钱,苏宁是自己的一个易付宝。amazon,美团等用的是支付宝。使用最多的也是支付宝。

下面主要看一下几种支付平台的集成方式。

一、       支付宝平台的集成

在技术集成之前,商户需要在https://ms.alipay.com进行注册,并签约安全支付服务。签约成功后可获取支付宝分配的合作商户ID(PartnerID),账户ID(SellerID),调用接口时使用。

支付细节的实现,主要通过支付宝提供的一个支付安全服务安装包alipay_plugin_20120428msp.apk,首次使用,首先检查是否安装此插件,没有会提示安装。具体的支付细节,在这个插件内完成。大部分的支付平台也都是采用的这种方式。

调用支付宝的接口进行支付,主要有以下几个步骤

1.  将商户ID,收款帐号,外部订单号,商品名称,商品介绍,价格,通知地址封装成订单信息

2.  对订单信息进行签名

3.  将订单信息,签名,签名方式封装成请求参数

4.  调用pay方法。

主要流程图如下:

支付接口pay方法的调用如下:

。。。

// start pay for this order.

// 根据订单信息开始进行支付

try {

// prepare the order info.

// 准备订单信息

String orderInfo = getOrderInfo(position);

// 这里根据签名方式对订单信息进行签名

String signType = getSignType();

String strsign = sign(signType, orderInfo);

Log.v("sign:", strsign);

// 对签名进行编码

strsign = URLEncoder.encode(strsign);

// 组装好参数

String info = orderInfo + "&sign=" + "\"" + strsign + "\"" + "&"

+ getSignType();

Log.v("orderInfo:", info);

// start the pay.

// 调用pay方法进行支付

MobileSecurePayer msp = new MobileSecurePayer();

boolean bRet = msp.pay(info, mHandler, AlixId.RQF_PAYthis);

if (bRet) {

// show the progress bar to indicate that we have started

// paying.

// 显示“正在支付”进度条

closeProgress();

mProgress = BaseHelper.showProgress(thisnull, "正在支付", false,

true);

else

;

catch (Exception ex) {

Toast.makeText(AlixDemo.this, R.string.remote_call_failed,

Toast.LENGTH_SHORT).show();

}

。。。

/**

* 向支付宝发送支付请求

*

@param strOrderInfo

*            订单信息

@param callback

*            回调handler

@param myWhat

*            回调信息

@param activity

*            目标activity

@return

*/

public boolean pay(final String strOrderInfo, final Handler callback,

final int myWhat, final Activity activity) {

if (mbPaying)

return false;

mbPaying = true;

//

mActivity = activity;

// bind the service.

// 绑定服务

if (mAlixPay == null) {

// 绑定安全支付服务需要获取上下文环境,

// 如果绑定不成功使用mActivity.getApplicationContext().bindService

// 解绑时同理

mActivity.getApplicationContext().bindService(

new Intent(IAlixPay.class.getName()), mAlixPayConnection,

Context.BIND_AUTO_CREATE);

}

// else ok.

// 实例一个线程来进行支付

new Thread(new Runnable() {

public void run() {

try {

// wait for the service bind operation to completely

// finished.

// Note: this is important,otherwise the next mAlixPay.Pay()

// will fail.

// 等待安全支付服务绑定操作结束

// 注意:这里很重要,否则mAlixPay.Pay()方法会失败

synchronized (lock) {

if (mAlixPay == null)

lock.wait();

}

// register a Callback for the service.

// 为安全支付服务注册一个回调

mAlixPay.registerCallback(mCallback);

// call the MobileSecurePay service.

// 调用安全支付服务的pay方法

String strRet = mAlixPay.Pay(strOrderInfo);

BaseHelper.log(TAG, "After Pay: " + strRet);

// set the flag to indicate that we have finished.

// unregister the Callback, and unbind the service.

// 将mbPaying置为false,表示支付结束

// 移除回调的注册,解绑安全支付服务

mbPaying = false;

mAlixPay.unregisterCallback(mCallback);

mActivity.getApplicationContext().unbindService(

mAlixPayConnection);

// send the result back to caller.

// 发送交易结果

Message msg = new Message();

msg.what = myWhat;

msg.obj = strRet;

callback.sendMessage(msg);

catch (Exception e) {

e.printStackTrace();

// send the result back to caller.

// 发送交易结果

Message msg = new Message();

msg.what = myWhat;

msg.obj = e.toString();

callback.sendMessage(msg);

}

}

}).start();

return true;

}

调用了支付服务之后,有两种方式返回交易结果:

1.        支付结果作为接口返回的字符串返回。返回的参数包含在result字符串中,具体再进行解析。

2.  支付宝服务器通知。商户需要提供一个http协议的接口,包含在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果。需要注意的是,商户服务器收到支付宝发的通知之后,需要返回一个纯字符串“success”,不然支付宝的服务器会持续调用七次回调url提供的接口。

集成需要的交易费用方面0-1万元内是2.5%的费率,1-10万是2.4%,10-100万是2.2%,100万以上2.0%。

二、       财付通平台的集成

财付通的集成和支付宝的非常相似(腾讯的传统?→_→)。财付通也是提供了一个财付通安全支付服务应用TenpayService.apk用于处理交易的细节。对于此支付应用,财付通和支付宝的使用方式是一样的。一种是捆绑预置,即打包在assets目录下,另一种是放到自己的服务器中,通过检查更新的方式动态加载。实际集成中可采用二者结合方式,初次使用使用预置apk,之后检查更新动态下载。

但是调用支付接口之前,增加了一个获取tokenid的过程,tokenid用于同财付通service进行交互。过程如下:

1.  用户在商户APP 选择商品,使用财付通支付

2.  商户APP向商户server 请求使用财付通支付

3.  商户server按照“支付初始化接口”的要求组织数据请求财付通“支付初始化接口”,接收初始化成功后返回的tokenid

4.  商户server将生成的tokenid 返回给商户APP

5.  商户APP使用tokenid 调用财付通支付service

6.  财付通支付service 在验证tokenid 后向用户展示支付中心,显示订单信息及相关用户信息

7.  用户在支付中心输入支付密码执行支付

8.  财付通支付service 向财付通后台server 请求执行支付,并实时接收支付结果

9.  支付成功后财付通支付service 向用户展示支付成功UI,在用户点击“返回商户网站”后回调商户App

10.  财付通后台server 在支付成功后会通过“支付成功通知接口”在后台通知商户server 支付状态。

接收支付接口返回结果方面,财付通对于方法返回值,不是直接返回的,而是通过handler回调,handler和msgId作为一个参数传入接口,支付接口pay()方法的返回值只是个true false,用于区分调用成功或者失败。其实跟淘宝的方式大同小异。对于notify_url,是财付通是通过get方式调用回调url,只返回支付成功的订单。同样的,商户服务器在接收到财付通的调用之后,需要返回纯字符串“success”“fail”表示处理成功或失败。

调用支付接口的代码如下:

//构造支付参数

HashMap<String, String> payInfo = new HashMap<String, String>();

payInfo.put("token_id", mTokenId);         //财付通订单号token_id

payInfo.put("bargainor_id", "1234567890"); //财付通合作商户ID,此为演示示例

//            payInfo.put("order_type", "1");

payInfo.put("caller", "com.tenpay.android.appDemo");

//去支付

tenpayHelper.pay(payInfo, mHandler, MSG_PAY_RESULT);

财付通的服务费率是1%,另外有相关的套餐可以优惠。

三、  易宝支付平台集成

与支付宝和财付通不同的是,易宝集成时,并没有提供一个支付应用apk,只有一个jar包。是一个library project。因为在集成时,需要在manifest文件里面声明支付页面的activity。同时在调用支付页面时,需要用startActivityForResult方式进入,支付结果会通过onActivityResult方法返回。易宝同样支持服务端回调,但比较纠结的是,易宝的服务端回调url,不能在代码中传入,需要在易宝的网站进行配置。只有支付成功时才会触发此回调,以get方式调用。

调用支付接口的代码如下:其中customerNumber参数是签约之后才能获取到的。requestId为调用方自定义的订单流水号。

private void startPay(String customerNumber, String chennal) {

String amount = etAmount.getText().toString();

String productName = etProductName.getText().toString();

String productDesc = etProductDesc.getText().toString();

if(TextUtils.isEmpty(productName) || TextUtils.isEmpty(amount)) {

Toast.makeText(YeepayExampleActivity.this, "", Toast.LENGTH_SHORT);

}

Intent intent = new Intent(getBaseContext(), YeepayPlugin.class);

intent.putExtra("customerNumber", customerNumber);

Random random = new Random();

String time = "" + System.currentTimeMillis();

String requestId = time + random.nextInt() % 10000;

intent.putExtra("requestId", requestId);

intent.putExtra("amount",  amount);

intent.putExtra("productName", productName);

intent.putExtra("time", time);

intent.putExtra("productDesc", (productDesc == null) ? "" : productDesc);

intent.putExtra("support", chennal);

intent.putExtra("environment", "ENV_TEST" );

StringBuilder builder = new StringBuilder();

builder.append(CUSTOMER_NUMBER).append("$");

builder.append(requestId).append("$");

builder.append(amount).append("$");

builder.append(productName).append("$");

builder.append(time);

String hmac = YeepayUtils.hmacSign(builder.toString(), KEY);

Log.e("YeepayExampleActivity", "hmac" + hmac);

intent.putExtra("hmac", hmac);

startActivityForResult(intent, 200);

}

易宝集成后的费率需要和易宝的客户经理面谈决定

四、  银联在线支付集成

银联的支付应用同支付宝和财付通相同,采用的是独立apk的方式提供服务。调用支付接口采用的startActivity的方式,相关参数通过bundle传递,调用示例如下:

bundle.putBoolean(USE_TEST_MODEtrue);

bundle.putString(SP_ID, "0009");

bundle.putString(SECURITY_CHIP_TYPEnull);

bundle.putString(SYS_PROVIDE, "00000001");

bundle.putString(PAY_DATA, payData);

Intent startIntent = new Intent();

// startIntent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);

startIntent.putExtras(bundle);

startIntent.setClassName(UPPayUtils.PACKAGE_NAME,

UPPayUtils.ACTIVITY_NAME);

//            activity.startActivityForResult(startIntent, UPPayUtils.STARTE_UPPAY);

activity.startActivity(startIntent);

与以上三种支付平台不同的是,银联支付接口的返回值是通过广播的形式发送的。不支持商户服务端的回调url。

五、  Google in-app billing集成

Google的支付服务不同于以上任何平台,主要依赖于google play,交易的细节完全在google play中完成,商户客户端通过ipc发生支付请求,采用广播进行通信,传递数据。同时,也与国内第三方平台不同的是,应用内的付费产品,道具,需要在google play网站上进行设定,订单信息是google play控制的。

不需要特别的账号,签约之类的繁琐的过程,任何一个开发者都可以集成此服务,只需要有一个开发者账号(用来发布产品的),和一个google电子钱包账号,但是交易费貌似是30%- -!paypal只有5%。Google定义的购买方式有两种,一种是限定账户的,通过这种方式,一次购买,永久有效,交易信息由google保存,当用户再次购买此种商品时,会弹出提示。此类方式的好处在于,当发生用户清理掉data或者卸载重装之类的情况时,可以调用接口从google取回交易信息。另一种是不限定账户的,即用户可以反复购买,交易信息是商家自己保存的。

交易的流程如下:

1.   App通过aidl定义的接口,发送购买请求(REQUEST_PURCHASE),指定一个产品ID和其他参数。

2.   Google Play App发送一个广播,广播的intent中包含3个键:RESPONSE_CODE, PURCHASE_INTENT, and REQUEST_ID。其中PURCHASE_INTENT是一个pending intent 用于启动交易页面。

3.   调用该 pending intent。

4.   当结账流程结束(用户成功购买了货物或者取消了购买),Google Play发送一个通知消息(IN_APP_NOTIFY 广播)。这个通知消息包括了指向该交易的通知ID。

5.   商户客户端调用aidl接口,传入GET_PURCHASE_STATE_CHANGED参数来请求交易信息,同时传入之前收到的通知id。

6.   Google Play发送交易信息,信息保存在PURCHASE_STATE_CHANGED 广播 intent中。

7.   商户客户端发送一个确认消息(CONFIRM_NOTIFICATIONS)来确认接收到了给定通知ID的交易信息。

另外,集成此服务需要在manifest文件中加入com.android.vending.BILLING权限。

参考信息见 http://developer.android.com/guide/google/play/billing/billing_overview.html

相关资料:http://wenku.baidu.com/view/f253e2caa1c7aa00b52acb37.html&qq-pf-to=pcqq.group

该微博装载之 :http://blog.csdn.net/shanpengfei77/article/details/8161089

android支付平台集成调研相关推荐

  1. android支付平台集成调研 .

    关于在线支付平台,目前国内主要有以下几种 paypal 支付宝,财付通,盛付通,易宝支付,快钱,银联在线,国付宝,网易宝,汇付天下等等. 手机支付平台,调研了支付宝,支付宝,财付通,盛付通,paypa ...

  2. android支付平台调研

    关于在线支付平台,目前国内主要有以下几种 paypal 支付宝,财付通,盛付通,易宝支付,快钱,银联在线,国付宝,网易宝,汇付天下等等. 手机支付平台,调研了支付宝,支付宝,财付通,盛付通,paypa ...

  3. android支付平台,android移动支付

    前言 目前移动端支付比较常用的就是支付宝,微信,银联了,其实集成支付对于前端来说还是比较简单的,于是简单的做下笔记. 别人的总结,收藏一下: 步骤 微信 步骤1: 初始化微信支付api对象 //第二个 ...

  4. 百度android 测试平台,集成百度活体检测(Android、iOS)

    更新记录 1.1.0(2020-06-18) 插件增加iOS版本 1.0.2(2020-06-08) 优化插件打包无法使用的问题 插件调用方法添加sound字段,表示是否开启声音,true为开启,默认 ...

  5. Android项目中集成华为账号登录、支付

    最近项目中集成了华为账号登录与支付的功能,把踩过的坑和过程记录下来. 先看下支付效果图: 支付价格0.01请忽略,因为这是为了测试用的. 刚开始接到这个项目的时候我很奇怪,为什么要集成华为支付呢,原有 ...

  6. iOS 第三方分享、支付原生平台集成

    github链接地址(一个包含QQ,微信,新浪微博原生平台集成以及支付宝微信支付的Demo) 一.准备第三方资源文件: 1.创建podfile,导入第三方库 pod 'YYKit'pod 'Mason ...

  7. 集成支付平台是什么?

    你可以已经注意到了,有的商店支持移动支付,却不是用支付宝.微信等支付工具,而是用一种新的支付工具,它支持多种支付方式,不管你是用支付宝.微信,还是用百度钱包.京东钱包等,都能完成支付.一种新的支付方式 ...

  8. cocos2dx android 接入爱贝支付平台sdk记录

    问题: 今天在接入爱贝支付平台的时候,出现一个错误: 01-28 18:00:05.614: E/AndroidRuntime(25801): FATAL EXCEPTION: GLThread 54 ...

  9. cocos2dx android 爱贝支付平台接入记录

    问题: 今天在接入爱贝支付平台的时候,出现一个错误: 01-28 18:00:05.614: E/AndroidRuntime(25801): FATAL EXCEPTION: GLThread 54 ...

最新文章

  1. web.config mysql_web.config配置mysql数据库连接
  2. 打印 Python 的一切 —— pprint beeprint
  3. python 中的路径. ./ .. ../和相对路径的写法
  4. 【STM32】ESP8266模块简介
  5. 为什么说spark不稳定
  6. LeetCode MySQL 1495. Friendly Movies Streamed Last Month
  7. mysql 主从 跳过_mysql主从同步如何跳过错误
  8. 2018百度之星程序设计大赛 - 资格赛 1002 子串查询
  9. TRex 学习(3) -- stateful ( detail )
  10. 20岁黑客发现苹果核心 web 应用中的严重漏洞,获奖$3.6万
  11. 如何使用 Cloud Insight SDK 实现 Druid 监控?
  12. Linux——Django 开发环境部署(二)python版本控制器pyenv
  13. mybatis配置log4j控制台打印SQL语句
  14. AIX主机FTP到LINUX服务器其中的磕碰记录
  15. redis zset怎么排序_关于Redis(一)
  16. SitePoint播客#108:Kevin的最后一场演出
  17. 收藏|史上最全的30个生物实验技术及原理
  18. 使用QGIS实现城市空气质量指数(AQI)数据可视化
  19. 监控系统网络未找到dhcp服务器,监控显示未找到dhcp服务器
  20. 解析approvalFlow——仿钉钉后台审批流程

热门文章

  1. 聚焦 AI + 大数据展现数据驱动 引领行业创新升级
  2. stp实验心得_STP实验
  3. AntdIcon 动态图标使用方式
  4. 安信证券软件测试面试,安信证券APP测评:部分用户账户无法登陆
  5. tv端h5_安卓市场tv版
  6. 日立硬盘丢失数据怎么办
  7. ThinkPad X220安装Centos问题记录
  8. 5 分钟带你了解 DevOps 的发展史
  9. JavaScript之parseInt() 方法解析
  10. 论文笔记:A Biometric-Based Authentication and Anonymity Scheme for Digital Rights Management System